OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/apps/ephemeral_app_launcher.h" | 5 #include "chrome/browser/apps/ephemeral_app_launcher.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
9 #include "chrome/browser/extensions/extension_install_checker.h" | 9 #include "chrome/browser/extensions/extension_install_checker.h" |
10 #include "chrome/browser/extensions/extension_install_prompt.h" | 10 #include "chrome/browser/extensions/extension_install_prompt.h" |
11 #include "chrome/browser/extensions/extension_util.h" | 11 #include "chrome/browser/extensions/extension_util.h" |
12 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
13 #include "chrome/browser/ui/browser_navigator.h" | 13 #include "chrome/browser/ui/browser_navigator.h" |
14 #include "chrome/browser/ui/extensions/application_launch.h" | 14 #include "chrome/browser/ui/extensions/application_launch.h" |
15 #include "chrome/browser/ui/extensions/extension_enable_flow.h" | 15 #include "chrome/browser/ui/extensions/extension_enable_flow.h" |
16 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" | 16 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" |
17 #include "chrome/common/chrome_switches.h" | 17 #include "chrome/common/chrome_switches.h" |
18 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" | 18 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" |
19 #include "content/public/browser/web_contents.h" | 19 #include "content/public/browser/web_contents.h" |
20 #include "extensions/browser/extension_prefs.h" | 20 #include "extensions/browser/extension_prefs.h" |
21 #include "extensions/browser/extension_registry.h" | 21 #include "extensions/browser/extension_registry.h" |
22 #include "extensions/browser/extension_system.h" | 22 #include "extensions/browser/extension_system.h" |
| 23 #include "extensions/browser/install_flag.h" |
23 #include "extensions/browser/management_policy.h" | 24 #include "extensions/browser/management_policy.h" |
24 #include "extensions/common/permissions/permissions_data.h" | 25 #include "extensions/common/permissions/permissions_data.h" |
25 | 26 |
26 using content::WebContents; | 27 using content::WebContents; |
27 using extensions::Extension; | 28 using extensions::Extension; |
28 using extensions::ExtensionInstallChecker; | 29 using extensions::ExtensionInstallChecker; |
29 using extensions::ExtensionPrefs; | 30 using extensions::ExtensionPrefs; |
30 using extensions::ExtensionRegistry; | 31 using extensions::ExtensionRegistry; |
31 using extensions::ExtensionSystem; | 32 using extensions::ExtensionSystem; |
32 using extensions::ManagementPolicy; | 33 using extensions::ManagementPolicy; |
33 using extensions::WebstoreInstaller; | 34 using extensions::WebstoreInstaller; |
34 namespace webstore_install = extensions::webstore_install; | 35 namespace webstore_install = extensions::webstore_install; |
35 | 36 |
36 namespace { | 37 namespace { |
37 | 38 |
38 const char kInvalidManifestError[] = "Invalid manifest"; | 39 const char kInvalidManifestError[] = "Invalid manifest"; |
39 const char kExtensionTypeError[] = "Not an app"; | 40 const char kExtensionTypeError[] = "Not an app"; |
40 const char kAppTypeError[] = "Ephemeral legacy packaged apps not supported"; | 41 const char kAppTypeError[] = "Ephemeral legacy packaged apps not supported"; |
41 const char kUserCancelledError[] = "Launch cancelled by the user"; | 42 const char kUserCancelledError[] = "Launch cancelled by the user"; |
42 const char kBlacklistedError[] = "App is blacklisted for malware"; | 43 const char kBlacklistedError[] = "App is blacklisted for malware"; |
43 const char kRequirementsError[] = "App has missing requirements"; | 44 const char kRequirementsError[] = "App has missing requirements"; |
44 const char kFeatureDisabledError[] = "Launching ephemeral apps is not enabled"; | 45 const char kFeatureDisabledError[] = "Launching ephemeral apps is not enabled"; |
45 const char kMissingAppError[] = "App is not installed"; | 46 const char kMissingAppError[] = "App is not installed"; |
46 const char kAppDisabledError[] = "App is disabled"; | 47 const char kAppDisabledError[] = "App is disabled"; |
47 | 48 |
| 49 const int kInstallFlags = extensions::kInstallFlagIsEphemeral; |
| 50 |
48 Profile* ProfileForWebContents(content::WebContents* contents) { | 51 Profile* ProfileForWebContents(content::WebContents* contents) { |
49 if (!contents) | 52 if (!contents) |
50 return NULL; | 53 return NULL; |
51 | 54 |
52 return Profile::FromBrowserContext(contents->GetBrowserContext()); | 55 return Profile::FromBrowserContext(contents->GetBrowserContext()); |
53 } | 56 } |
54 | 57 |
55 gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) { | 58 gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) { |
56 if (!contents) | 59 if (!contents) |
57 return NULL; | 60 return NULL; |
58 | 61 |
59 return contents->GetTopLevelNativeWindow(); | 62 return contents->GetTopLevelNativeWindow(); |
60 } | 63 } |
61 | 64 |
62 // Check whether an extension can be launched. The extension does not need to | 65 // Check whether an extension can be launched. The extension does not need to |
63 // be currently installed. | 66 // be currently installed. |
64 bool CheckCommonLaunchCriteria(Profile* profile, | 67 bool CheckCommonLaunchCriteria(Profile* profile, |
65 const Extension* extension, | 68 const Extension* extension, |
| 69 int install_flags, |
66 webstore_install::Result* reason, | 70 webstore_install::Result* reason, |
67 std::string* error) { | 71 std::string* error) { |
68 // Only apps can be launched. | 72 // Only apps can be launched. |
69 if (!extension->is_app()) { | 73 if (!extension->is_app()) { |
70 *reason = webstore_install::LAUNCH_UNSUPPORTED_EXTENSION_TYPE; | 74 *reason = webstore_install::LAUNCH_UNSUPPORTED_EXTENSION_TYPE; |
71 *error = kExtensionTypeError; | 75 *error = kExtensionTypeError; |
72 return false; | 76 return false; |
73 } | 77 } |
74 | 78 |
75 // Do not launch apps blocked by management policies. | 79 // Do not launch apps blocked by management policies. |
76 ManagementPolicy* management_policy = | 80 ManagementPolicy* management_policy = |
77 ExtensionSystem::Get(profile)->management_policy(); | 81 ExtensionSystem::Get(profile)->management_policy(); |
78 base::string16 policy_error; | 82 base::string16 policy_error; |
79 if (!management_policy->UserMayLoad(extension, &policy_error)) { | 83 if (!management_policy->UserMayLoad( |
| 84 extension, install_flags, &policy_error)) { |
80 *reason = webstore_install::BLOCKED_BY_POLICY; | 85 *reason = webstore_install::BLOCKED_BY_POLICY; |
81 *error = base::UTF16ToUTF8(policy_error); | 86 *error = base::UTF16ToUTF8(policy_error); |
82 return false; | 87 return false; |
83 } | 88 } |
84 | 89 |
85 return true; | 90 return true; |
86 } | 91 } |
87 | 92 |
88 } // namespace | 93 } // namespace |
89 | 94 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 scoped_ptr<WebstoreInstaller::Approval> approval = | 201 scoped_ptr<WebstoreInstaller::Approval> approval = |
197 WebstoreStandaloneInstaller::CreateApproval(); | 202 WebstoreStandaloneInstaller::CreateApproval(); |
198 approval->is_ephemeral = true; | 203 approval->is_ephemeral = true; |
199 return approval.Pass(); | 204 return approval.Pass(); |
200 } | 205 } |
201 | 206 |
202 bool EphemeralAppLauncher::CanLaunchInstalledApp( | 207 bool EphemeralAppLauncher::CanLaunchInstalledApp( |
203 const extensions::Extension* extension, | 208 const extensions::Extension* extension, |
204 webstore_install::Result* reason, | 209 webstore_install::Result* reason, |
205 std::string* error) { | 210 std::string* error) { |
206 if (!CheckCommonLaunchCriteria(profile(), extension, reason, error)) | 211 ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile()); |
| 212 int install_flags = extension_prefs->GetInstallFlags(extension->id()); |
| 213 if (!CheckCommonLaunchCriteria( |
| 214 profile(), extension, install_flags, reason, error)) |
207 return false; | 215 return false; |
208 | 216 |
209 // Do not launch blacklisted apps. | 217 // Do not launch blacklisted apps. |
210 if (ExtensionPrefs::Get(profile())->IsExtensionBlacklisted(extension->id())) { | 218 if (extension_prefs->IsExtensionBlacklisted(extension->id())) { |
211 *reason = webstore_install::BLACKLISTED; | 219 *reason = webstore_install::BLACKLISTED; |
212 *error = kBlacklistedError; | 220 *error = kBlacklistedError; |
213 return false; | 221 return false; |
214 } | 222 } |
215 | 223 |
216 // If the app has missing requirements, it cannot be launched. | 224 // If the app has missing requirements, it cannot be launched. |
217 if (!extensions::util::IsAppLaunchable(extension->id(), profile())) { | 225 if (!extensions::util::IsAppLaunchable(extension->id(), profile())) { |
218 *reason = webstore_install::REQUIREMENT_VIOLATIONS; | 226 *reason = webstore_install::REQUIREMENT_VIOLATIONS; |
219 *error = kRequirementsError; | 227 *error = kRequirementsError; |
220 return false; | 228 return false; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 WebstoreStandaloneInstaller::CompleteInstall(result, error); | 311 WebstoreStandaloneInstaller::CompleteInstall(result, error); |
304 } | 312 } |
305 | 313 |
306 void EphemeralAppLauncher::CheckEphemeralInstallPermitted() { | 314 void EphemeralAppLauncher::CheckEphemeralInstallPermitted() { |
307 scoped_refptr<const Extension> extension = GetLocalizedExtensionForDisplay(); | 315 scoped_refptr<const Extension> extension = GetLocalizedExtensionForDisplay(); |
308 DCHECK(extension.get()); // Checked in OnManifestParsed(). | 316 DCHECK(extension.get()); // Checked in OnManifestParsed(). |
309 | 317 |
310 install_checker_ = CreateInstallChecker(); | 318 install_checker_ = CreateInstallChecker(); |
311 DCHECK(install_checker_.get()); | 319 DCHECK(install_checker_.get()); |
312 | 320 |
313 install_checker_->set_extension(extension); | 321 install_checker_->set_extension(extension, kInstallFlags); |
314 install_checker_->Start(ExtensionInstallChecker::CHECK_BLACKLIST | | 322 install_checker_->Start(ExtensionInstallChecker::CHECK_BLACKLIST | |
315 ExtensionInstallChecker::CHECK_REQUIREMENTS, | 323 ExtensionInstallChecker::CHECK_REQUIREMENTS, |
316 true, | 324 true, |
317 base::Bind(&EphemeralAppLauncher::OnInstallChecked, | 325 base::Bind(&EphemeralAppLauncher::OnInstallChecked, |
318 base::Unretained(this))); | 326 base::Unretained(this))); |
319 } | 327 } |
320 | 328 |
321 void EphemeralAppLauncher::OnInstallChecked(int check_failures) { | 329 void EphemeralAppLauncher::OnInstallChecked(int check_failures) { |
322 if (!CheckRequestorAlive()) { | 330 if (!CheckRequestorAlive()) { |
323 AbortLaunch(webstore_install::UNKNOWN_ERROR, std::string()); | 331 AbortLaunch(webstore_install::UNKNOWN_ERROR, std::string()); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 | 399 |
392 void EphemeralAppLauncher::OnManifestParsed() { | 400 void EphemeralAppLauncher::OnManifestParsed() { |
393 const Extension* extension = GetLocalizedExtensionForDisplay(); | 401 const Extension* extension = GetLocalizedExtensionForDisplay(); |
394 if (!extension) { | 402 if (!extension) { |
395 AbortLaunch(webstore_install::INVALID_MANIFEST, kInvalidManifestError); | 403 AbortLaunch(webstore_install::INVALID_MANIFEST, kInvalidManifestError); |
396 return; | 404 return; |
397 } | 405 } |
398 | 406 |
399 webstore_install::Result result = webstore_install::UNKNOWN_ERROR; | 407 webstore_install::Result result = webstore_install::UNKNOWN_ERROR; |
400 std::string error; | 408 std::string error; |
401 if (!CheckCommonLaunchCriteria(profile(), extension, &result, &error)) { | 409 if (!CheckCommonLaunchCriteria( |
| 410 profile(), extension, kInstallFlags, &result, &error)) { |
402 AbortLaunch(result, error); | 411 AbortLaunch(result, error); |
403 return; | 412 return; |
404 } | 413 } |
405 | 414 |
406 if (extension->is_legacy_packaged_app()) { | 415 if (extension->is_legacy_packaged_app()) { |
407 AbortLaunch(webstore_install::LAUNCH_UNSUPPORTED_EXTENSION_TYPE, | 416 AbortLaunch(webstore_install::LAUNCH_UNSUPPORTED_EXTENSION_TYPE, |
408 kAppTypeError); | 417 kAppTypeError); |
409 return; | 418 return; |
410 } | 419 } |
411 | 420 |
(...skipping 27 matching lines...) Expand all Loading... |
439 | 448 |
440 void EphemeralAppLauncher::ExtensionEnableFlowFinished() { | 449 void EphemeralAppLauncher::ExtensionEnableFlowFinished() { |
441 MaybeLaunchApp(); | 450 MaybeLaunchApp(); |
442 Release(); // Matches the AddRef in EnableInstalledApp(). | 451 Release(); // Matches the AddRef in EnableInstalledApp(). |
443 } | 452 } |
444 | 453 |
445 void EphemeralAppLauncher::ExtensionEnableFlowAborted(bool user_initiated) { | 454 void EphemeralAppLauncher::ExtensionEnableFlowAborted(bool user_initiated) { |
446 InvokeCallback(webstore_install::USER_CANCELLED, kUserCancelledError); | 455 InvokeCallback(webstore_install::USER_CANCELLED, kUserCancelledError); |
447 Release(); // Matches the AddRef in EnableInstalledApp(). | 456 Release(); // Matches the AddRef in EnableInstalledApp(). |
448 } | 457 } |
OLD | NEW |