kiosk: Ensure launching latest version.

- Add a install_immediately flag to ExternalProviderImpl;
- Set install_immediately flag to true for kiosk app provider
  so that updated app install is not delayed;
- Set auto acknowledge since kiosk should not show external
  install alert;

BUG=461419

Review URL: https://codereview.chromium.org/974713002

Cr-Commit-Position: refs/heads/master@{#319005}
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 0e9e757..3b0a8b3 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -270,7 +270,7 @@
 
       visitor_->OnExternalExtensionFileFound(
           i->first, &version, i->second.second, location_,
-          Extension::NO_FLAGS, false);
+          Extension::NO_FLAGS, false, false);
     }
     visitor_->OnExternalProviderReady(this);
   }
@@ -377,7 +377,8 @@
                                     const base::FilePath& path,
                                     Manifest::Location unused,
                                     int creation_flags,
-                                    bool mark_acknowledged) override {
+                                    bool mark_acknowledged,
+                                    bool install_immediately) override {
     EXPECT_EQ(expected_creation_flags_, creation_flags);
 
     ++ids_found_;
@@ -1564,12 +1565,14 @@
   content::WindowedNotificationObserver observer(
       extensions::NOTIFICATION_CRX_INSTALLER_DONE,
       content::NotificationService::AllSources());
-  if (service()->OnExternalExtensionFileFound(good_crx,
-                                              &version,
-                                              path,
-                                              Manifest::EXTERNAL_PREF,
-                                              Extension::FROM_BOOKMARK,
-                                              false /* mark_acknowledged */)) {
+  if (service()->OnExternalExtensionFileFound(
+          good_crx,
+          &version,
+          path,
+          Manifest::EXTERNAL_PREF,
+          Extension::FROM_BOOKMARK,
+          false /* mark_acknowledged */,
+          false /* install_immediately */)) {
     observer.Wait();
   }
 
@@ -1604,6 +1607,7 @@
                                               path,
                                               Manifest::EXTERNAL_PREF,
                                               Extension::NO_FLAGS,
+                                              false,
                                               false)) {
     observer.Wait();
   }
@@ -1621,6 +1625,7 @@
                                           path,
                                           Manifest::EXTERNAL_PREF,
                                           Extension::NO_FLAGS,
+                                          false,
                                           false);
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false));
@@ -1635,6 +1640,7 @@
                                           path,
                                           Manifest::EXTERNAL_PREF,
                                           Extension::NO_FLAGS,
+                                          false,
                                           false);
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false));
@@ -1702,6 +1708,7 @@
                                           path,
                                           Manifest::EXTERNAL_PREF,
                                           Extension::NO_FLAGS,
+                                          false,
                                           false);
 
   observer.Wait();
@@ -1716,6 +1723,7 @@
                                               path,
                                               Manifest::EXTERNAL_PREF,
                                               Extension::NO_FLAGS,
+                                              false,
                                               false)) {
     observer2.Wait();
   }
@@ -1739,6 +1747,7 @@
                                           path,
                                           Manifest::EXTERNAL_PREF,
                                           Extension::NO_FLAGS,
+                                          false,
                                           false);
 
   observer.Wait();
@@ -1755,6 +1764,7 @@
                                               path,
                                               Manifest::EXTERNAL_PREF,
                                               Extension::NO_FLAGS,
+                                              false,
                                               false)) {
     observer2.Wait();
   }
@@ -6825,6 +6835,7 @@
 
   const int kCreationFlags = 0;
   const bool kDontMarkAcknowledged = false;
+  const bool kDontInstallImmediately = false;
 
   InitializeEmptyExtensionService();
 
@@ -6852,12 +6863,14 @@
     content::WindowedNotificationObserver observer(
         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
         content::NotificationService::AllSources());
-    EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                        &older_version,
-                                                        kInvalidPathToCrx,
-                                                        Manifest::INTERNAL,
-                                                        kCreationFlags,
-                                                        kDontMarkAcknowledged));
+    EXPECT_TRUE(service()->OnExternalExtensionFileFound(
+        kGoodId,
+        &older_version,
+        kInvalidPathToCrx,
+        Manifest::INTERNAL,
+        kCreationFlags,
+        kDontMarkAcknowledged,
+        kDontInstallImmediately));
     EXPECT_TRUE(pending->IsIdPending(kGoodId));
     observer.Wait();
     VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
@@ -6868,12 +6881,14 @@
     content::WindowedNotificationObserver observer(
         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
         content::NotificationService::AllSources());
-    EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                        &older_version,
-                                                        kInvalidPathToCrx,
-                                                        Manifest::EXTERNAL_PREF,
-                                                        kCreationFlags,
-                                                        kDontMarkAcknowledged));
+    EXPECT_TRUE(service()->OnExternalExtensionFileFound(
+        kGoodId,
+        &older_version,
+        kInvalidPathToCrx,
+        Manifest::EXTERNAL_PREF,
+        kCreationFlags,
+        kDontMarkAcknowledged,
+        kDontInstallImmediately));
     EXPECT_TRUE(pending->IsIdPending(kGoodId));
     observer.Wait();
     VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
@@ -6882,21 +6897,25 @@
   // Simulate an external source adding as EXTERNAL_PREF again.
   // This is rejected because the version and the location are the same as
   // the previous installation, which is still pending.
-  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                       &older_version,
-                                                       kInvalidPathToCrx,
-                                                       Manifest::EXTERNAL_PREF,
-                                                       kCreationFlags,
-                                                       kDontMarkAcknowledged));
+  EXPECT_FALSE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &older_version,
+      kInvalidPathToCrx,
+      Manifest::EXTERNAL_PREF,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE(pending->IsIdPending(kGoodId));
 
   // Try INTERNAL again.  Should fail.
-  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                       &older_version,
-                                                       kInvalidPathToCrx,
-                                                       Manifest::INTERNAL,
-                                                       kCreationFlags,
-                                                       kDontMarkAcknowledged));
+  EXPECT_FALSE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &older_version,
+      kInvalidPathToCrx,
+      Manifest::INTERNAL,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE(pending->IsIdPending(kGoodId));
 
   {
@@ -6904,33 +6923,38 @@
     content::WindowedNotificationObserver observer(
         extensions::NOTIFICATION_CRX_INSTALLER_DONE,
         content::NotificationService::AllSources());
-    EXPECT_TRUE(
-        service()->OnExternalExtensionFileFound(kGoodId,
-                                                &older_version,
-                                                kInvalidPathToCrx,
-                                                Manifest::EXTERNAL_REGISTRY,
-                                                kCreationFlags,
-                                                kDontMarkAcknowledged));
+    EXPECT_TRUE(service()->OnExternalExtensionFileFound(
+        kGoodId,
+        &older_version,
+        kInvalidPathToCrx,
+        Manifest::EXTERNAL_REGISTRY,
+        kCreationFlags,
+        kDontMarkAcknowledged,
+        kDontInstallImmediately));
     EXPECT_TRUE(pending->IsIdPending(kGoodId));
     observer.Wait();
     VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
   }
 
   // Registry outranks both external pref and internal, so both fail.
-  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                       &older_version,
-                                                       kInvalidPathToCrx,
-                                                       Manifest::EXTERNAL_PREF,
-                                                       kCreationFlags,
-                                                       kDontMarkAcknowledged));
+  EXPECT_FALSE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &older_version,
+      kInvalidPathToCrx,
+      Manifest::EXTERNAL_PREF,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE(pending->IsIdPending(kGoodId));
 
-  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                       &older_version,
-                                                       kInvalidPathToCrx,
-                                                       Manifest::INTERNAL,
-                                                       kCreationFlags,
-                                                       kDontMarkAcknowledged));
+  EXPECT_FALSE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &older_version,
+      kInvalidPathToCrx,
+      Manifest::INTERNAL,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE(pending->IsIdPending(kGoodId));
 
   pending->Remove(kGoodId);
@@ -6954,70 +6978,83 @@
   // older, or the same, and succeed if the version is newer.
 
   // Older than the installed version...
-  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                       &older_version,
-                                                       kInvalidPathToCrx,
-                                                       Manifest::INTERNAL,
-                                                       kCreationFlags,
-                                                       kDontMarkAcknowledged));
+  EXPECT_FALSE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &older_version,
+      kInvalidPathToCrx,
+      Manifest::INTERNAL,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_FALSE(pending->IsIdPending(kGoodId));
 
   // Same version as the installed version...
-  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                       ext->version(),
-                                                       kInvalidPathToCrx,
-                                                       Manifest::INTERNAL,
-                                                       kCreationFlags,
-                                                       kDontMarkAcknowledged));
+  EXPECT_FALSE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      ext->version(),
+      kInvalidPathToCrx,
+      Manifest::INTERNAL,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_FALSE(pending->IsIdPending(kGoodId));
 
   // Newer than the installed version...
-  EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                      &newer_version,
-                                                      kInvalidPathToCrx,
-                                                      Manifest::INTERNAL,
-                                                      kCreationFlags,
-                                                      kDontMarkAcknowledged));
+  EXPECT_TRUE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &newer_version,
+      kInvalidPathToCrx,
+      Manifest::INTERNAL,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE(pending->IsIdPending(kGoodId));
 
   // An external install for a higher priority install source should succeed
   // if the version is greater.  |older_version| is not...
-  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                       &older_version,
-                                                       kInvalidPathToCrx,
-                                                       Manifest::EXTERNAL_PREF,
-                                                       kCreationFlags,
-                                                       kDontMarkAcknowledged));
+  EXPECT_FALSE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &older_version,
+      kInvalidPathToCrx,
+      Manifest::EXTERNAL_PREF,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE(pending->IsIdPending(kGoodId));
 
   // |newer_version| is newer.
-  EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                      &newer_version,
-                                                      kInvalidPathToCrx,
-                                                      Manifest::EXTERNAL_PREF,
-                                                      kCreationFlags,
-                                                      kDontMarkAcknowledged));
+  EXPECT_TRUE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &newer_version,
+      kInvalidPathToCrx,
+      Manifest::EXTERNAL_PREF,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE(pending->IsIdPending(kGoodId));
 
   // An external install for an even higher priority install source should
   // succeed if the version is greater.
-  EXPECT_TRUE(
-      service()->OnExternalExtensionFileFound(kGoodId,
-                                              &newer_version,
-                                              kInvalidPathToCrx,
-                                              Manifest::EXTERNAL_REGISTRY,
-                                              kCreationFlags,
-                                              kDontMarkAcknowledged));
+  EXPECT_TRUE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &newer_version,
+      kInvalidPathToCrx,
+      Manifest::EXTERNAL_REGISTRY,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE(pending->IsIdPending(kGoodId));
 
   // Because EXTERNAL_PREF is a lower priority source than EXTERNAL_REGISTRY,
   // adding from external pref will now fail.
-  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                       &newer_version,
-                                                       kInvalidPathToCrx,
-                                                       Manifest::EXTERNAL_PREF,
-                                                       kCreationFlags,
-                                                       kDontMarkAcknowledged));
+  EXPECT_FALSE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &newer_version,
+      kInvalidPathToCrx,
+      Manifest::EXTERNAL_PREF,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE(pending->IsIdPending(kGoodId));
 }
 
@@ -7028,6 +7065,7 @@
   const base::FilePath kInvalidPathToCrx(FILE_PATH_LITERAL("invalid_path"));
   const int kCreationFlags = 0;
   const bool kDontMarkAcknowledged = false;
+  const bool kDontInstallImmediately = false;
 
   InitializeEmptyExtensionService();
 
@@ -7036,48 +7074,55 @@
   EXPECT_FALSE(pending->IsIdPending(kGoodId));
 
   // An external provider starts installing from a local crx.
-  EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                      &kVersion123,
-                                                      kInvalidPathToCrx,
-                                                      Manifest::EXTERNAL_PREF,
-                                                      kCreationFlags,
-                                                      kDontMarkAcknowledged));
+  EXPECT_TRUE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &kVersion123,
+      kInvalidPathToCrx,
+      Manifest::EXTERNAL_PREF,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   const extensions::PendingExtensionInfo* info;
   EXPECT_TRUE((info = pending->GetById(kGoodId)));
   EXPECT_TRUE(info->version().IsValid());
   EXPECT_TRUE(info->version().Equals(kVersion123));
 
   // Adding a newer version overrides the currently pending version.
-  EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                      &kVersion124,
-                                                      kInvalidPathToCrx,
-                                                      Manifest::EXTERNAL_PREF,
-                                                      kCreationFlags,
-                                                      kDontMarkAcknowledged));
+  EXPECT_TRUE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &kVersion124,
+      kInvalidPathToCrx,
+      Manifest::EXTERNAL_PREF,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE((info = pending->GetById(kGoodId)));
   EXPECT_TRUE(info->version().IsValid());
   EXPECT_TRUE(info->version().Equals(kVersion124));
 
   // Adding an older version fails.
-  EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId,
-                                                       &kVersion123,
-                                                       kInvalidPathToCrx,
-                                                       Manifest::EXTERNAL_PREF,
-                                                       kCreationFlags,
-                                                       kDontMarkAcknowledged));
+  EXPECT_FALSE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &kVersion123,
+      kInvalidPathToCrx,
+      Manifest::EXTERNAL_PREF,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE((info = pending->GetById(kGoodId)));
   EXPECT_TRUE(info->version().IsValid());
   EXPECT_TRUE(info->version().Equals(kVersion124));
 
   // Adding an older version fails even when coming from a higher-priority
   // location.
-  EXPECT_FALSE(
-      service()->OnExternalExtensionFileFound(kGoodId,
-                                              &kVersion123,
-                                              kInvalidPathToCrx,
-                                              Manifest::EXTERNAL_REGISTRY,
-                                              kCreationFlags,
-                                              kDontMarkAcknowledged));
+  EXPECT_FALSE(service()->OnExternalExtensionFileFound(
+      kGoodId,
+      &kVersion123,
+      kInvalidPathToCrx,
+      Manifest::EXTERNAL_REGISTRY,
+      kCreationFlags,
+      kDontMarkAcknowledged,
+      kDontInstallImmediately));
   EXPECT_TRUE((info = pending->GetById(kGoodId)));
   EXPECT_TRUE(info->version().IsValid());
   EXPECT_TRUE(info->version().Equals(kVersion124));
@@ -7150,6 +7195,7 @@
                                                    crx_path_,
                                                    Manifest::EXTERNAL_PREF,
                                                    Extension::NO_FLAGS,
+                                                   false,
                                                    false);
   }