WebApp: Expose InstallFinalizer::Source enum and option for FinalizeInstall.

We will need it to implement InstallWebAppWithOptions.

Bug: 901226
Change-Id: I88797140789a06eb9915a22c81b50d0f1bc20471
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1616923
Commit-Queue: Alexey Baskakov <loyso@chromium.org>
Reviewed-by: Dominick Ng <dominickn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#661248}
diff --git a/chrome/browser/web_applications/components/install_finalizer.h b/chrome/browser/web_applications/components/install_finalizer.h
index 8235135..376ff207 100644
--- a/chrome/browser/web_applications/components/install_finalizer.h
+++ b/chrome/browser/web_applications/components/install_finalizer.h
@@ -33,13 +33,20 @@
   using CreateOsShortcutsCallback =
       base::OnceCallback<void(bool shortcuts_created)>;
 
+  enum class Source {
+    kUser,
+    kDefaultInstalled,
+    kPolicyInstalled,
+    kSystemInstalled,
+  };
+
   struct FinalizeOptions {
     // If |force_launch_container| defined as non-kDefault then the installed
     // app will launch in |force_launch_container|.
     LaunchContainer force_launch_container = LaunchContainer::kDefault;
+    Source source = Source::kUser;
     bool error_on_unsupported_requirements = false;
     bool locally_installed = true;
-    bool policy_installed = false;
     bool no_network_install = false;
   };
 
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
index 5c1875f..47ff5910 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
@@ -112,8 +112,28 @@
       OnExtensionInstalled, web_app_info.app_url, launch_type,
       options.locally_installed, std::move(callback), crx_installer));
 
-  if (options.policy_installed)
-    crx_installer->set_install_source(Manifest::EXTERNAL_POLICY_DOWNLOAD);
+  switch (options.source) {
+    case web_app::InstallFinalizer::Source::kDefaultInstalled:
+      crx_installer->set_install_source(Manifest::EXTERNAL_PREF_DOWNLOAD);
+      // CrxInstaller::InstallWebApp will OR the creation flags with
+      // FROM_BOOKMARK.
+      crx_installer->set_creation_flags(Extension::WAS_INSTALLED_BY_DEFAULT);
+      break;
+    case web_app::InstallFinalizer::Source::kPolicyInstalled:
+      crx_installer->set_install_source(Manifest::EXTERNAL_POLICY_DOWNLOAD);
+      break;
+    case web_app::InstallFinalizer::Source::kSystemInstalled:
+      // System Apps are considered EXTERNAL_COMPONENT as they are downloaded
+      // from the WebUI they point to. COMPONENT seems like the more correct
+      // value, but usages (icon loading, filesystem cleanup), are tightly
+      // coupled to this value, making it unsuitable.
+      crx_installer->set_install_source(Manifest::EXTERNAL_COMPONENT);
+      // InstallWebApp will OR the creation flags with FROM_BOOKMARK.
+      crx_installer->set_creation_flags(Extension::WAS_INSTALLED_BY_DEFAULT);
+      break;
+    case web_app::InstallFinalizer::Source::kUser:
+      break;
+  }
 
   if (options.no_network_install) {
     // Ensure that this app is not synced. A no-network install means we have
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc
index f2644fe..e81c4f4 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc
@@ -100,7 +100,7 @@
     info->title = base::ASCIIToUTF16(kWebAppTitle);
 
     web_app::InstallFinalizer::FinalizeOptions options;
-    options.policy_installed = true;
+    options.source = web_app::InstallFinalizer::Source::kPolicyInstalled;
 
     web_app::AppId app_id;
     base::RunLoop run_loop;
@@ -252,7 +252,7 @@
   EXPECT_TRUE(callback2_called);
 }
 
-TEST_F(BookmarkAppInstallFinalizerTest, PolicyInstallSucceeds) {
+TEST_F(BookmarkAppInstallFinalizerTest, DefaultInstalledSucceeds) {
   BookmarkAppInstallFinalizer installer(profile());
 
   auto info = std::make_unique<WebApplicationInfo>();
@@ -260,7 +260,36 @@
   info->title = base::ASCIIToUTF16(kWebAppTitle);
 
   web_app::InstallFinalizer::FinalizeOptions options;
-  options.policy_installed = true;
+  options.source = web_app::InstallFinalizer::Source::kDefaultInstalled;
+
+  base::RunLoop run_loop;
+  installer.FinalizeInstall(
+      *info, options,
+      base::BindLambdaForTesting([&](const web_app::AppId& installed_app_id,
+                                     web_app::InstallResultCode code) {
+        EXPECT_EQ(web_app::InstallResultCode::kSuccess, code);
+
+        auto* extension =
+            ExtensionRegistry::Get(profile())->GetInstalledExtension(
+                installed_app_id);
+        EXPECT_TRUE(Manifest::IsExternalLocation(extension->location()));
+        EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, extension->location());
+        EXPECT_TRUE(extension->was_installed_by_default());
+
+        run_loop.Quit();
+      }));
+  run_loop.Run();
+}
+
+TEST_F(BookmarkAppInstallFinalizerTest, PolicyInstalledSucceeds) {
+  BookmarkAppInstallFinalizer installer(profile());
+
+  auto info = std::make_unique<WebApplicationInfo>();
+  info->app_url = kWebAppUrl;
+  info->title = base::ASCIIToUTF16(kWebAppTitle);
+
+  web_app::InstallFinalizer::FinalizeOptions options;
+  options.source = web_app::InstallFinalizer::Source::kPolicyInstalled;
 
   base::RunLoop run_loop;
   installer.FinalizeInstall(
@@ -280,6 +309,35 @@
   run_loop.Run();
 }
 
+TEST_F(BookmarkAppInstallFinalizerTest, SystemInstalledSucceeds) {
+  BookmarkAppInstallFinalizer installer(profile());
+
+  auto info = std::make_unique<WebApplicationInfo>();
+  info->app_url = kWebAppUrl;
+  info->title = base::ASCIIToUTF16(kWebAppTitle);
+
+  web_app::InstallFinalizer::FinalizeOptions options;
+  options.source = web_app::InstallFinalizer::Source::kSystemInstalled;
+
+  base::RunLoop run_loop;
+  installer.FinalizeInstall(
+      *info, options,
+      base::BindLambdaForTesting([&](const web_app::AppId& installed_app_id,
+                                     web_app::InstallResultCode code) {
+        EXPECT_EQ(web_app::InstallResultCode::kSuccess, code);
+
+        auto* extension =
+            ExtensionRegistry::Get(profile())->GetInstalledExtension(
+                installed_app_id);
+        EXPECT_TRUE(Manifest::IsExternalLocation(extension->location()));
+        EXPECT_EQ(Manifest::EXTERNAL_COMPONENT, extension->location());
+        EXPECT_TRUE(extension->was_installed_by_default());
+
+        run_loop.Quit();
+      }));
+  run_loop.Run();
+}
+
 TEST_F(BookmarkAppInstallFinalizerTest, NoNetworkInstallSucceeds) {
   BookmarkAppInstallFinalizer installer(profile());
 
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
index 519bd2e..33ea208 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
@@ -154,7 +154,7 @@
   }
 
   web_app::InstallFinalizer::FinalizeOptions options;
-  options.policy_installed = true;
+  options.source = web_app::InstallFinalizer::Source::kPolicyInstalled;
 
   install_finalizer_->FinalizeInstall(
       web_app_info, options,
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
index 444150b9..7da4865c 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
@@ -655,8 +655,8 @@
 
         EXPECT_EQ(1u, install_finalizer()->num_create_os_shortcuts_calls());
         EXPECT_EQ(1u, install_finalizer()->finalize_options_list().size());
-        EXPECT_TRUE(
-            install_finalizer()->finalize_options_list()[0].policy_installed);
+        EXPECT_EQ(web_app::InstallFinalizer::Source::kPolicyInstalled,
+                  install_finalizer()->finalize_options_list()[0].source);
         const WebApplicationInfo& web_app_info =
             install_finalizer()->web_app_info_list().at(0);