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(¶ms); 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