1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/apps/ephemeral_app_launcher.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/utf_string_conversions.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/extension_install_checker.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/extension_install_prompt.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_util.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/browser_navigator.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/extensions/extension_enable_flow.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/chrome_switches.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/web_contents.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_prefs.h"
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/browser/extension_registry.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_system.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/management_policy.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using content::WebContents;
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::Extension;
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing extensions::ExtensionInstallChecker;
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing extensions::ExtensionPrefs;
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using extensions::ExtensionRegistry;
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing extensions::ExtensionSystem;
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing extensions::ManagementPolicy;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::WebstoreInstaller;
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace webstore_install = extensions::webstore_install;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kInvalidManifestError[] = "Invalid manifest";
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kExtensionTypeError[] = "Not an app";
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kAppTypeError[] = "Ephemeral legacy packaged apps not supported";
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kUserCancelledError[] = "Launch cancelled by the user";
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kBlacklistedError[] = "App is blacklisted for malware";
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kRequirementsError[] = "App has missing requirements";
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kFeatureDisabledError[] = "Launching ephemeral apps is not enabled";
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kMissingAppError[] = "App is not installed";
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kAppDisabledError[] = "App is disabled";
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)Profile* ProfileForWebContents(content::WebContents* contents) {
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!contents)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return NULL;
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return Profile::FromBrowserContext(contents->GetBrowserContext());
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) {
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!contents)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return NULL;
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return contents->GetTopLevelNativeWindow();
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Check whether an extension can be launched. The extension does not need to
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// be currently installed.
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool CheckCommonLaunchCriteria(Profile* profile,
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               const Extension* extension,
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               webstore_install::Result* reason,
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               std::string* error) {
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Only apps can be launched.
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!extension->is_app()) {
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *reason = webstore_install::LAUNCH_UNSUPPORTED_EXTENSION_TYPE;
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *error = kExtensionTypeError;
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Do not launch apps blocked by management policies.
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ManagementPolicy* management_policy =
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ExtensionSystem::Get(profile)->management_policy();
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::string16 policy_error;
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!management_policy->UserMayLoad(extension, &policy_error)) {
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *reason = webstore_install::BLOCKED_BY_POLICY;
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *error = base::UTF16ToUTF8(policy_error);
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool EphemeralAppLauncher::IsFeatureEnabled() {
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return CommandLine::ForCurrentProcess()->HasSwitch(
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      switches::kEnableEphemeralApps);
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_refptr<EphemeralAppLauncher> EphemeralAppLauncher::CreateForLauncher(
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& webstore_item_id,
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Profile* profile,
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    gfx::NativeWindow parent_window,
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const LaunchCallback& callback) {
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<EphemeralAppLauncher> installer =
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new EphemeralAppLauncher(webstore_item_id,
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               profile,
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               parent_window,
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               callback);
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  installer->set_install_source(WebstoreInstaller::INSTALL_SOURCE_APP_LAUNCHER);
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return installer;
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_refptr<EphemeralAppLauncher> EphemeralAppLauncher::CreateForWebContents(
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& webstore_item_id,
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::WebContents* web_contents,
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const LaunchCallback& callback) {
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<EphemeralAppLauncher> installer =
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new EphemeralAppLauncher(webstore_item_id, web_contents, callback);
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  installer->set_install_source(WebstoreInstaller::INSTALL_SOURCE_OTHER);
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return installer;
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void EphemeralAppLauncher::Start() {
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!IsFeatureEnabled()) {
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    InvokeCallback(webstore_install::LAUNCH_FEATURE_DISABLED,
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   kFeatureDisabledError);
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Check whether the app already exists in extension system before downloading
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // from the webstore.
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Extension* extension =
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ExtensionRegistry::Get(profile())
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          ->GetExtensionById(id(), ExtensionRegistry::EVERYTHING);
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (extension) {
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    webstore_install::Result result = webstore_install::OTHER_ERROR;
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::string error;
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!CanLaunchInstalledApp(extension, &result, &error)) {
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      InvokeCallback(result, error);
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return;
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (extensions::util::IsAppLaunchableWithoutEnabling(extension->id(),
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                         profile())) {
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LaunchApp(extension);
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      InvokeCallback(webstore_install::SUCCESS, std::string());
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EnableInstalledApp(extension);
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Install the app ephemerally and launch when complete.
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BeginInstall();
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuEphemeralAppLauncher::EphemeralAppLauncher(const std::string& webstore_item_id,
1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                           Profile* profile,
1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                           gfx::NativeWindow parent_window,
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           const LaunchCallback& callback)
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : WebstoreStandaloneInstaller(webstore_item_id, profile, Callback()),
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      launch_callback_(callback),
1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      parent_window_(parent_window),
1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      dummy_web_contents_(
1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          WebContents::Create(WebContents::CreateParams(profile))) {
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuEphemeralAppLauncher::EphemeralAppLauncher(const std::string& webstore_item_id,
1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                           content::WebContents* web_contents,
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           const LaunchCallback& callback)
1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : WebstoreStandaloneInstaller(webstore_item_id,
1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                  ProfileForWebContents(web_contents),
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  Callback()),
1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      content::WebContentsObserver(web_contents),
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      launch_callback_(callback),
1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      parent_window_(NativeWindowForWebContents(web_contents)) {
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)EphemeralAppLauncher::~EphemeralAppLauncher() {}
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<extensions::ExtensionInstallChecker>
182116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEphemeralAppLauncher::CreateInstallChecker() {
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return make_scoped_ptr(new ExtensionInstallChecker(profile()));
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<ExtensionInstallPrompt> EphemeralAppLauncher::CreateInstallUI() {
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (web_contents())
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return make_scoped_ptr(new ExtensionInstallPrompt(web_contents()));
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return make_scoped_ptr(
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new ExtensionInstallPrompt(profile(), parent_window_, NULL));
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<WebstoreInstaller::Approval> EphemeralAppLauncher::CreateApproval()
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const {
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<WebstoreInstaller::Approval> approval =
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      WebstoreStandaloneInstaller::CreateApproval();
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  approval->is_ephemeral = true;
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return approval.Pass();
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool EphemeralAppLauncher::CanLaunchInstalledApp(
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const extensions::Extension* extension,
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    webstore_install::Result* reason,
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::string* error) {
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!CheckCommonLaunchCriteria(profile(), extension, reason, error))
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Do not launch blacklisted apps.
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (ExtensionPrefs::Get(profile())->IsExtensionBlacklisted(extension->id())) {
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *reason = webstore_install::BLACKLISTED;
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *error = kBlacklistedError;
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If the app has missing requirements, it cannot be launched.
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!extensions::util::IsAppLaunchable(extension->id(), profile())) {
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *reason = webstore_install::REQUIREMENT_VIOLATIONS;
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *error = kRequirementsError;
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EphemeralAppLauncher::EnableInstalledApp(const Extension* extension) {
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Check whether an install is already in progress.
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  webstore_install::Result result = webstore_install::OTHER_ERROR;
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string error;
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!EnsureUniqueInstall(&result, &error)) {
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    InvokeCallback(result, error);
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Keep this object alive until the enable flow is complete. Either
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // ExtensionEnableFlowFinished() or ExtensionEnableFlowAborted() will be
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // called.
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddRef();
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extension_enable_flow_.reset(
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new ExtensionEnableFlow(profile(), extension->id(), this));
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (web_contents())
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    extension_enable_flow_->StartForWebContents(web_contents());
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    extension_enable_flow_->StartForNativeWindow(parent_window_);
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EphemeralAppLauncher::MaybeLaunchApp() {
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  webstore_install::Result result = webstore_install::OTHER_ERROR;
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string error;
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionRegistry* registry = ExtensionRegistry::Get(profile());
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const Extension* extension =
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      registry->GetExtensionById(id(), ExtensionRegistry::EVERYTHING);
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (extension) {
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Although the installation was successful, the app may not be
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // launchable.
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (registry->enabled_extensions().Contains(extension->id())) {
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      result = webstore_install::SUCCESS;
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      LaunchApp(extension);
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } else {
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      error = kAppDisabledError;
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // Determine why the app cannot be launched.
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CanLaunchInstalledApp(extension, &result, &error);
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // The extension must be present in the registry if installed.
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NOTREACHED();
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error = kMissingAppError;
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InvokeCallback(result, error);
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EphemeralAppLauncher::LaunchApp(const Extension* extension) const {
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(extension && extension->is_app() &&
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         ExtensionRegistry::Get(profile())
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch             ->GetExtensionById(extension->id(), ExtensionRegistry::ENABLED));
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppLaunchParams params(profile(), extension, NEW_FOREGROUND_TAB);
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  params.desktop_type =
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      chrome::GetHostDesktopTypeForNativeWindow(parent_window_);
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  OpenApplication(params);
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool EphemeralAppLauncher::LaunchHostedApp(const Extension* extension) const {
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GURL launch_url = extensions::AppLaunchInfo::GetLaunchWebURL(extension);
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!launch_url.is_valid())
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chrome::ScopedTabbedBrowserDisplayer displayer(
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile(), chrome::GetHostDesktopTypeForNativeWindow(parent_window_));
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chrome::NavigateParams params(
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      displayer.browser(), launch_url, ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  params.disposition = NEW_FOREGROUND_TAB;
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chrome::Navigate(&params);
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EphemeralAppLauncher::InvokeCallback(webstore_install::Result result,
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          const std::string& error) {
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!launch_callback_.is_null()) {
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    LaunchCallback callback = launch_callback_;
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    launch_callback_.Reset();
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    callback.Run(result, error);
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EphemeralAppLauncher::AbortLaunch(webstore_install::Result result,
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       const std::string& error) {
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InvokeCallback(result, error);
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebstoreStandaloneInstaller::CompleteInstall(result, error);
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EphemeralAppLauncher::CheckEphemeralInstallPermitted() {
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<const Extension> extension = GetLocalizedExtensionForDisplay();
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(extension.get());  // Checked in OnManifestParsed().
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  install_checker_ = CreateInstallChecker();
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(install_checker_.get());
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  install_checker_->set_extension(extension);
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  install_checker_->Start(ExtensionInstallChecker::CHECK_BLACKLIST |
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              ExtensionInstallChecker::CHECK_REQUIREMENTS,
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          true,
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          base::Bind(&EphemeralAppLauncher::OnInstallChecked,
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     base::Unretained(this)));
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EphemeralAppLauncher::OnInstallChecked(int check_failures) {
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!CheckRequestorAlive()) {
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    AbortLaunch(webstore_install::OTHER_ERROR, std::string());
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (install_checker_->blacklist_state() == extensions::BLACKLISTED_MALWARE) {
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AbortLaunch(webstore_install::BLACKLISTED, kBlacklistedError);
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!install_checker_->requirement_errors().empty()) {
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AbortLaunch(webstore_install::REQUIREMENT_VIOLATIONS,
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                install_checker_->requirement_errors().front());
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Proceed with the normal install flow.
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ProceedWithInstallPrompt();
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EphemeralAppLauncher::InitInstallData(
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    extensions::ActiveInstallData* install_data) const {
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  install_data->is_ephemeral = true;
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool EphemeralAppLauncher::CheckRequestorAlive() const {
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return dummy_web_contents_.get() != NULL || web_contents() != NULL;
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const GURL& EphemeralAppLauncher::GetRequestorURL() const {
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GURL::EmptyGURL();
362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool EphemeralAppLauncher::ShouldShowPostInstallUI() const {
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return false;
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool EphemeralAppLauncher::ShouldShowAppInstalledBubble() const {
369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return false;
370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)WebContents* EphemeralAppLauncher::GetWebContents() const {
373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return web_contents() ? web_contents() : dummy_web_contents_.get();
374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)scoped_refptr<ExtensionInstallPrompt::Prompt>
377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)EphemeralAppLauncher::CreateInstallPrompt() const {
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const Extension* extension = localized_extension_for_display();
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(extension);  // Checked in OnManifestParsed().
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Skip the prompt by returning null if the app does not need to display
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // permission warnings.
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::PermissionMessages permissions =
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extension->permissions_data()->GetPermissionMessages();
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (permissions.empty())
386f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return NULL;
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return make_scoped_refptr(new ExtensionInstallPrompt::Prompt(
389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ExtensionInstallPrompt::LAUNCH_PROMPT));
390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool EphemeralAppLauncher::CheckInlineInstallPermitted(
393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::DictionaryValue& webstore_data,
394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string* error) const {
395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  *error = "";
396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool EphemeralAppLauncher::CheckRequestorPermitted(
400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::DictionaryValue& webstore_data,
401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string* error) const {
402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  *error = "";
403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EphemeralAppLauncher::OnManifestParsed() {
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<const Extension> extension = GetLocalizedExtensionForDisplay();
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!extension.get()) {
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AbortLaunch(webstore_install::INVALID_MANIFEST, kInvalidManifestError);
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  webstore_install::Result result = webstore_install::OTHER_ERROR;
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string error;
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!CheckCommonLaunchCriteria(profile(), extension.get(), &result, &error)) {
416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AbortLaunch(result, error);
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (extension->is_legacy_packaged_app()) {
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AbortLaunch(webstore_install::LAUNCH_UNSUPPORTED_EXTENSION_TYPE,
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                kAppTypeError);
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (extension->is_hosted_app()) {
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Hosted apps do not need to be installed ephemerally. Just navigate to
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // their launch url.
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (LaunchHostedApp(extension.get()))
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      AbortLaunch(webstore_install::SUCCESS, std::string());
431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      AbortLaunch(webstore_install::INVALID_MANIFEST, kInvalidManifestError);
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckEphemeralInstallPermitted();
437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EphemeralAppLauncher::CompleteInstall(webstore_install::Result result,
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           const std::string& error) {
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (result == webstore_install::SUCCESS)
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    MaybeLaunchApp();
443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else if (!launch_callback_.is_null())
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    InvokeCallback(result, error);
445f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebstoreStandaloneInstaller::CompleteInstall(result, error);
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void EphemeralAppLauncher::WebContentsDestroyed() {
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  launch_callback_.Reset();
451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AbortInstall();
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EphemeralAppLauncher::ExtensionEnableFlowFinished() {
455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MaybeLaunchApp();
456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // CompleteInstall will call Release.
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebstoreStandaloneInstaller::CompleteInstall(webstore_install::SUCCESS,
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                               std::string());
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EphemeralAppLauncher::ExtensionEnableFlowAborted(bool user_initiated) {
463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // CompleteInstall will call Release.
464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CompleteInstall(webstore_install::USER_CANCELLED, kUserCancelledError);
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
466