Remove most ScopedVector usage from c/b/extensions.

Replace them with vector<unique_ptr<T>>.

After this CL there will be only 3 places where ScopedVector
would still be around. Since those (language_settings_private_delegate.cc,
web_navigation_apitest.cc and chrome_content_browser_client_extensions_part.cc)
are non-trivial, I will try to remove ScopedVector from them in subsequent CLs.

BUG=556939
Test=None, internal only change.

Review-Url: https://codereview.chromium.org/2310683002
Cr-Commit-Position: refs/heads/master@{#417042}
diff --git a/chrome/browser/chromeos/customization/customization_document_unittest.cc b/chrome/browser/chromeos/customization/customization_document_unittest.cc
index 3ba0dac7..7ea30be 100644
--- a/chrome/browser/chromeos/customization/customization_document_unittest.cc
+++ b/chrome/browser/chromeos/customization/customization_document_unittest.cc
@@ -193,11 +193,12 @@
                bool(const ExternalInstallInfoUpdateUrl&, bool));
   MOCK_METHOD1(OnExternalProviderReady,
                void(const extensions::ExternalProviderInterface* provider));
-  MOCK_METHOD4(OnExternalProviderUpdateComplete,
-               void(const extensions::ExternalProviderInterface*,
-                    const ScopedVector<ExternalInstallInfoUpdateUrl>&,
-                    const ScopedVector<ExternalInstallInfoFile>&,
-                    const std::set<std::string>& removed_extensions));
+  MOCK_METHOD4(
+      OnExternalProviderUpdateComplete,
+      void(const extensions::ExternalProviderInterface*,
+           const std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>&,
+           const std::vector<std::unique_ptr<ExternalInstallInfoFile>>&,
+           const std::set<std::string>& removed_extensions));
 };
 
 class ServicesCustomizationDocumentTest : public testing::Test {
diff --git a/chrome/browser/chromeos/extensions/device_local_account_external_policy_loader_unittest.cc b/chrome/browser/chromeos/extensions/device_local_account_external_policy_loader_unittest.cc
index f4a3f46..4adcbd9 100644
--- a/chrome/browser/chromeos/extensions/device_local_account_external_policy_loader_unittest.cc
+++ b/chrome/browser/chromeos/extensions/device_local_account_external_policy_loader_unittest.cc
@@ -82,11 +82,12 @@
                bool(const ExternalInstallInfoUpdateUrl&, bool));
   MOCK_METHOD1(OnExternalProviderReady,
                void(const extensions::ExternalProviderInterface* provider));
-  MOCK_METHOD4(OnExternalProviderUpdateComplete,
-               void(const extensions::ExternalProviderInterface*,
-                    const ScopedVector<ExternalInstallInfoUpdateUrl>&,
-                    const ScopedVector<ExternalInstallInfoFile>&,
-                    const std::set<std::string>& removed_extensions));
+  MOCK_METHOD4(
+      OnExternalProviderUpdateComplete,
+      void(const extensions::ExternalProviderInterface*,
+           const std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>&,
+           const std::vector<std::unique_ptr<ExternalInstallInfoFile>>&,
+           const std::set<std::string>& removed_extensions));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockExternalPolicyProviderVisitor);
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc b/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
index 8e172c3..508c7db 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
@@ -106,7 +106,7 @@
   std::unique_ptr<TestBrowserWindow> browser_window_;
   std::unique_ptr<Browser> browser_;
 
-  ScopedVector<TestExtensionDir> test_extension_dirs_;
+  std::vector<std::unique_ptr<TestExtensionDir>> test_extension_dirs_;
 
   DISALLOW_COPY_AND_ASSIGN(DeveloperPrivateApiUnitTest);
 };
@@ -128,8 +128,8 @@
       " \"permissions\": [\"*://*/*\"]"
       "}";
 
-  test_extension_dirs_.push_back(new TestExtensionDir);
-  TestExtensionDir* dir = test_extension_dirs_.back();
+  test_extension_dirs_.push_back(base::MakeUnique<TestExtensionDir>());
+  TestExtensionDir* dir = test_extension_dirs_.back().get();
   dir->WriteManifest(kManifest);
 
   // TODO(devlin): We should extract out methods to load an unpacked extension
diff --git a/chrome/browser/extensions/api/gcd_private/privet_v3_session.cc b/chrome/browser/extensions/api/gcd_private/privet_v3_session.cc
index 8c22f78..adf66eb 100644
--- a/chrome/browser/extensions/api/gcd_private/privet_v3_session.cc
+++ b/chrome/browser/extensions/api/gcd_private/privet_v3_session.cc
@@ -10,6 +10,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -486,7 +487,7 @@
   FetcherDelegate* fetcher =
       new FetcherDelegate(weak_ptr_factory_.GetWeakPtr(), callback);
   if (!orphaned)
-    fetchers_.push_back(fetcher);
+    fetchers_.push_back(base::WrapUnique(fetcher));
   net::URLFetcher* url_fetcher =
       fetcher->CreateURLFetcher(url, request_type, orphaned);
   url_fetcher->SetLoadFlags(url_fetcher->GetLoadFlags() |
@@ -500,7 +501,14 @@
 }
 
 void PrivetV3Session::DeleteFetcher(const FetcherDelegate* fetcher) {
-  fetchers_.erase(std::find(fetchers_.begin(), fetchers_.end(), fetcher));
+  for (std::vector<std::unique_ptr<FetcherDelegate>>::iterator iter =
+           fetchers_.begin();
+       iter != fetchers_.end(); ++iter) {
+    if (iter->get() == fetcher) {
+      fetchers_.erase(iter);
+      break;
+    }
+  }
 }
 
 void PrivetV3Session::Cancel() {
diff --git a/chrome/browser/extensions/api/gcd_private/privet_v3_session.h b/chrome/browser/extensions/api/gcd_private/privet_v3_session.h
index f653959b..8a29a5f 100644
--- a/chrome/browser/extensions/api/gcd_private/privet_v3_session.h
+++ b/chrome/browser/extensions/api/gcd_private/privet_v3_session.h
@@ -13,7 +13,6 @@
 #include "base/callback.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
-#include "base/memory/scoped_vector.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/common/extensions/api/gcd_private.h"
 #include "net/url_request/url_fetcher.h"
@@ -125,7 +124,7 @@
   bool use_https_ = false;
 
   // List of fetches to cancel when session is destroyed.
-  ScopedVector<FetcherDelegate> fetchers_;
+  std::vector<std::unique_ptr<FetcherDelegate>> fetchers_;
 
   // Intercepts POST requests. Used by tests only.
   base::Callback<void(const base::DictionaryValue&)> on_post_data_;
diff --git a/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc b/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc
index 602195e2..4c7b585 100644
--- a/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc
+++ b/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "base/memory/scoped_vector.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
@@ -69,16 +68,15 @@
 }
 
 void CreateMappingForUnmappedDevices(
-    std::vector<DeviceInfo*>* device_info,
+    const std::vector<std::unique_ptr<DeviceInfo>>& device_info,
     base::DictionaryValue* value) {
-  for (unsigned int i = 0; i < device_info->size(); ++i) {
-    DeviceInfo* device = (*device_info)[i];
+  for (const std::unique_ptr<DeviceInfo>& device : device_info) {
     std::string local_id = GetPublicIdFromGUID(*value,
                                                device->guid());
 
     // If the device does not have a local id, set one.
     if (local_id.empty()) {
-      local_id = GetRandomId(*value, device_info->size());
+      local_id = GetRandomId(*value, device_info.size());
       value->SetString(local_id, device->guid());
     }
     device->set_public_id(local_id);
@@ -91,14 +89,11 @@
     Profile* profile) {
   DCHECK(crx_file::id_util::IdIsValid(extension_id)) << extension_id
                                                      << " is not valid";
-  ScopedVector<DeviceInfo> devices = GetAllSignedInDevices(extension_id,
-                                                           profile);
-  for (ScopedVector<DeviceInfo>::iterator it = devices.begin();
-       it != devices.end();
-       ++it) {
-    if ((*it)->guid() == client_id) {
-      std::unique_ptr<DeviceInfo> device(*it);
-      devices.weak_erase(it);
+  std::vector<std::unique_ptr<DeviceInfo>> devices =
+      GetAllSignedInDevices(extension_id, profile);
+  for (auto& iter : devices) {
+    if (iter->guid() == client_id) {
+      std::unique_ptr<DeviceInfo> device = std::move(iter);
       return device;
     }
   }
diff --git a/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.h b/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.h
index 69a8dfa..046ff752 100644
--- a/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.h
+++ b/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.h
@@ -45,7 +45,7 @@
 // The dictionary would have the public id as the key and the
 // device guid as the value.
 void CreateMappingForUnmappedDevices(
-    std::vector<sync_driver::DeviceInfo*>* device_info,
+    const std::vector<std::unique_ptr<sync_driver::DeviceInfo>>& device_info,
     base::DictionaryValue* value);
 
 // Gets the device info for a given client id. If the device is not found
diff --git a/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper_unittest.cc b/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper_unittest.cc
index 9396b873..61a441b0 100644
--- a/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper_unittest.cc
+++ b/chrome/browser/extensions/api/signed_in_devices/id_mapping_helper_unittest.cc
@@ -8,7 +8,7 @@
 #include <string>
 
 #include "base/guid.h"
-#include "base/memory/scoped_vector.h"
+#include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "components/sync/device_info/device_info.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -30,25 +30,19 @@
 }
 
 TEST(IdMappingHelperTest, SetIdsForDevices) {
-  ScopedVector<DeviceInfo> devices;
+  std::vector<std::unique_ptr<DeviceInfo>> devices;
 
-  devices.push_back(new DeviceInfo(base::GenerateGUID(),
-                                   "abc Device",
-                                   "XYZ v1",
-                                   "XYZ SyncAgent v1",
-                                   sync_pb::SyncEnums_DeviceType_TYPE_LINUX,
-                                   "device_id1"));
+  devices.push_back(base::MakeUnique<DeviceInfo>(
+      base::GenerateGUID(), "abc Device", "XYZ v1", "XYZ SyncAgent v1",
+      sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id1"));
 
-  devices.push_back(new DeviceInfo(base::GenerateGUID(),
-                                   "def Device",
-                                   "XYZ v1",
-                                   "XYZ SyncAgent v1",
-                                   sync_pb::SyncEnums_DeviceType_TYPE_LINUX,
-                                   "device_id2"));
+  devices.push_back(base::MakeUnique<DeviceInfo>(
+      base::GenerateGUID(), "def Device", "XYZ v1", "XYZ SyncAgent v1",
+      sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id2"));
 
   base::DictionaryValue dictionary;
 
-  CreateMappingForUnmappedDevices(&(devices.get()), &dictionary);
+  CreateMappingForUnmappedDevices(devices, &dictionary);
 
   std::string public_id1 = devices[0]->public_id();
   std::string public_id2 = devices[1]->public_id();
@@ -59,14 +53,11 @@
   EXPECT_NE(public_id1, public_id2);
 
   // Now add a third device.
-  devices.push_back(new DeviceInfo(base::GenerateGUID(),
-                                   "ghi Device",
-                                   "XYZ v1",
-                                   "XYZ SyncAgent v1",
-                                   sync_pb::SyncEnums_DeviceType_TYPE_LINUX,
-                                   "device_id3"));
+  devices.push_back(base::MakeUnique<DeviceInfo>(
+      base::GenerateGUID(), "ghi Device", "XYZ v1", "XYZ SyncAgent v1",
+      sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id3"));
 
-  CreateMappingForUnmappedDevices(&(devices.get()), &dictionary);
+  CreateMappingForUnmappedDevices(devices, &dictionary);
 
   // Now make sure the existing ids are not changed.
   EXPECT_EQ(public_id1, devices[0]->public_id());
diff --git a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.cc b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.cc
index 53e7dd7..e30c239 100644
--- a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.cc
+++ b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.cc
@@ -7,7 +7,6 @@
 #include <memory>
 #include <utility>
 
-#include "base/memory/scoped_vector.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/api/signed_in_devices/id_mapping_helper.h"
 #include "chrome/browser/profiles/profile.h"
@@ -54,12 +53,13 @@
 // Helper routine to get all signed in devices. The helper takes in
 // the pointers for |DeviceInfoTracker| and |Extensionprefs|. This
 // makes it easier to test by passing mock values for these pointers.
-ScopedVector<DeviceInfo> GetAllSignedInDevices(
+std::vector<std::unique_ptr<DeviceInfo>> GetAllSignedInDevices(
     const std::string& extension_id,
     DeviceInfoTracker* device_tracker,
     ExtensionPrefs* extension_prefs) {
   DCHECK(device_tracker);
-  ScopedVector<DeviceInfo> devices = device_tracker->GetAllDeviceInfo();
+  std::vector<std::unique_ptr<DeviceInfo>> devices =
+      device_tracker->GetAllDeviceInfo();
   const base::DictionaryValue* mapping_dictionary = GetIdMappingDictionary(
       extension_prefs,
       extension_id);
@@ -70,8 +70,7 @@
   std::unique_ptr<base::DictionaryValue> editable_mapping_dictionary(
       mapping_dictionary->DeepCopy());
 
-  CreateMappingForUnmappedDevices(&(devices.get()),
-                                  editable_mapping_dictionary.get());
+  CreateMappingForUnmappedDevices(devices, editable_mapping_dictionary.get());
 
   // Write into |ExtensionPrefs| which will get persisted in disk.
   extension_prefs->UpdateExtensionPref(extension_id,
@@ -80,7 +79,7 @@
   return devices;
 }
 
-ScopedVector<DeviceInfo> GetAllSignedInDevices(
+std::vector<std::unique_ptr<DeviceInfo>> GetAllSignedInDevices(
     const std::string& extension_id,
     Profile* profile) {
   // Get the device tracker and extension prefs pointers
@@ -90,7 +89,7 @@
   DCHECK(device_tracker);
   if (!device_tracker->IsSyncing()) {
     // Devices are not sync'ing.
-    return ScopedVector<DeviceInfo>();
+    return std::vector<std::unique_ptr<DeviceInfo>>();
   }
 
   ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile);
@@ -131,16 +130,13 @@
     return true;
   }
 
-  ScopedVector<DeviceInfo> devices =
+  std::vector<std::unique_ptr<DeviceInfo>> devices =
       GetAllSignedInDevices(extension_id(), GetProfile());
 
   std::unique_ptr<base::ListValue> result(new base::ListValue());
 
-  for (ScopedVector<DeviceInfo>::const_iterator it = devices.begin();
-       it != devices.end();
-       ++it) {
-    result->Append((*it)->ToValue());
-  }
+  for (const std::unique_ptr<DeviceInfo>& device : devices)
+    result->Append(device->ToValue());
 
   SetResult(std::move(result));
   return true;
diff --git a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.h b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.h
index 1d1c09223..ef6d31f 100644
--- a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.h
+++ b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.h
@@ -8,7 +8,6 @@
 #include <string>
 #include <vector>
 
-#include "base/memory/scoped_vector.h"
 #include "chrome/browser/extensions/chrome_extension_function.h"
 
 namespace sync_driver {
@@ -28,11 +27,11 @@
 // filled with the list of devices associated with the account signed into this
 // |profile|. This function needs the |extension_id| because the
 // public device ids are set per extension.
-ScopedVector<sync_driver::DeviceInfo> GetAllSignedInDevices(
+std::vector<std::unique_ptr<sync_driver::DeviceInfo>> GetAllSignedInDevices(
     const std::string& extension_id,
     Profile* profile);
 
-ScopedVector<sync_driver::DeviceInfo> GetAllSignedInDevices(
+std::vector<std::unique_ptr<sync_driver::DeviceInfo>> GetAllSignedInDevices(
     const std::string& extension_id,
     sync_driver::DeviceInfoTracker* device_tracker,
     ExtensionPrefs* extension_prefs);
diff --git a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc
index 03fc72d..6215435 100644
--- a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc
+++ b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc
@@ -44,23 +44,19 @@
     return std::unique_ptr<DeviceInfo>();
   }
 
-  static DeviceInfo* CloneDeviceInfo(const DeviceInfo* device_info) {
-    return new DeviceInfo(device_info->guid(),
-                          device_info->client_name(),
-                          device_info->chrome_version(),
-                          device_info->sync_user_agent(),
-                          device_info->device_type(),
-                          device_info->signin_scoped_device_id());
+  static std::unique_ptr<DeviceInfo> CloneDeviceInfo(
+      const DeviceInfo& device_info) {
+    return base::MakeUnique<DeviceInfo>(
+        device_info.guid(), device_info.client_name(),
+        device_info.chrome_version(), device_info.sync_user_agent(),
+        device_info.device_type(), device_info.signin_scoped_device_id());
   }
 
-  ScopedVector<DeviceInfo> GetAllDeviceInfo() const override {
-    ScopedVector<DeviceInfo> list;
+  std::vector<std::unique_ptr<DeviceInfo>> GetAllDeviceInfo() const override {
+    std::vector<std::unique_ptr<DeviceInfo>> list;
 
-    for (std::vector<const DeviceInfo*>::const_iterator iter = devices_.begin();
-         iter != devices_.end();
-         ++iter) {
-      list.push_back(CloneDeviceInfo(*iter));
-    }
+    for (const DeviceInfo* device : devices_)
+      list.push_back(CloneDeviceInfo(*device));
 
     return list;
   }
@@ -109,7 +105,7 @@
   device_tracker.Add(&device_info1);
   device_tracker.Add(&device_info2);
 
-  ScopedVector<DeviceInfo> output1 = GetAllSignedInDevices(
+  std::vector<std::unique_ptr<DeviceInfo>> output1 = GetAllSignedInDevices(
       extension_test->id(), &device_tracker, extension_prefs.prefs());
 
   std::string public_id1 = output1[0]->public_id();
@@ -130,7 +126,7 @@
 
   device_tracker.Add(&device_info3);
 
-  ScopedVector<DeviceInfo> output2 = GetAllSignedInDevices(
+  std::vector<std::unique_ptr<DeviceInfo>> output2 = GetAllSignedInDevices(
       extension_test->id(), &device_tracker, extension_prefs.prefs());
 
   EXPECT_EQ(output2[0]->public_id(), public_id1);
@@ -254,8 +250,8 @@
       .WillOnce(Return(&device_tracker));
   EXPECT_CALL(*pss_mock, Shutdown());
 
-  ScopedVector<DeviceInfo> output = GetAllSignedInDevices(
-      extension()->id(), profile());
+  std::vector<std::unique_ptr<DeviceInfo>> output =
+      GetAllSignedInDevices(extension()->id(), profile());
 
   EXPECT_TRUE(output.empty());
 }
diff --git a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.cc b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.cc
index b21ff2174d..8bea7cd 100644
--- a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.cc
+++ b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.cc
@@ -10,7 +10,7 @@
 #include <vector>
 
 #include "base/lazy_instance.h"
-#include "base/memory/scoped_vector.h"
+#include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api.h"
 #include "chrome/browser/extensions/extension_service.h"
@@ -61,11 +61,11 @@
 void SignedInDevicesChangeObserver::OnDeviceInfoChange() {
   // There is a change in the list of devices. Get all devices and send them to
   // the listener.
-  ScopedVector<DeviceInfo> devices = GetAllSignedInDevices(extension_id_,
-                                                           profile_);
+  std::vector<std::unique_ptr<DeviceInfo>> devices =
+      GetAllSignedInDevices(extension_id_, profile_);
 
   std::vector<api::signed_in_devices::DeviceInfo> args;
-  for (const DeviceInfo* info : devices) {
+  for (const std::unique_ptr<DeviceInfo>& info : devices) {
     api::signed_in_devices::DeviceInfo api_device;
     FillDeviceInfo(*info, &api_device);
     args.push_back(std::move(api_device));
@@ -122,19 +122,16 @@
 
 void SignedInDevicesManager::OnListenerAdded(
     const EventListenerInfo& details) {
-  for (ScopedVector<SignedInDevicesChangeObserver>::const_iterator it =
-           change_observers_.begin();
-           it != change_observers_.end();
-           ++it) {
-    if ((*it)->extension_id() == details.extension_id) {
+  for (const std::unique_ptr<SignedInDevicesChangeObserver>& observer :
+       change_observers_) {
+    if (observer->extension_id() == details.extension_id) {
       DCHECK(false) <<"OnListenerAded fired twice for same extension";
       return;
     }
   }
 
-  change_observers_.push_back(new SignedInDevicesChangeObserver(
-      details.extension_id,
-      profile_));
+  change_observers_.push_back(base::MakeUnique<SignedInDevicesChangeObserver>(
+      details.extension_id, profile_));
 }
 
 void SignedInDevicesManager::OnListenerRemoved(
@@ -144,10 +141,9 @@
 
 void SignedInDevicesManager::RemoveChangeObserverForExtension(
     const std::string& extension_id) {
-  for (ScopedVector<SignedInDevicesChangeObserver>::iterator it =
-           change_observers_.begin();
-           it != change_observers_.end();
-           ++it) {
+  for (std::vector<std::unique_ptr<SignedInDevicesChangeObserver>>::iterator
+           it = change_observers_.begin();
+       it != change_observers_.end(); ++it) {
     if ((*it)->extension_id() == extension_id) {
       change_observers_.erase(it);
       return;
diff --git a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h
index 8bc591b7..ba7a0802 100644
--- a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h
+++ b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h
@@ -9,7 +9,6 @@
 
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
-#include "base/memory/scoped_vector.h"
 #include "base/scoped_observer.h"
 #include "components/sync/device_info/device_info_tracker.h"
 #include "extensions/browser/browser_context_keyed_api_factory.h"
@@ -91,7 +90,7 @@
   void RemoveChangeObserverForExtension(const std::string& extension_id);
 
   Profile* const profile_;
-  ScopedVector<SignedInDevicesChangeObserver> change_observers_;
+  std::vector<std::unique_ptr<SignedInDevicesChangeObserver>> change_observers_;
 
   // Listen to extension unloaded notification.
   ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
diff --git a/chrome/browser/extensions/api/storage/setting_sync_data.h b/chrome/browser/extensions/api/storage/setting_sync_data.h
index e8f21e58..fd843fb 100644
--- a/chrome/browser/extensions/api/storage/setting_sync_data.h
+++ b/chrome/browser/extensions/api/storage/setting_sync_data.h
@@ -9,7 +9,6 @@
 #include <string>
 
 #include "base/macros.h"
-#include "base/memory/scoped_vector.h"
 #include "base/values.h"
 #include "components/sync/api/sync_change.h"
 
@@ -68,7 +67,7 @@
   DISALLOW_COPY_AND_ASSIGN(SettingSyncData);
 };
 
-typedef ScopedVector<SettingSyncData> SettingSyncDataList;
+using SettingSyncDataList = std::vector<std::unique_ptr<SettingSyncData>>;
 
 }  // namespace extensions
 
diff --git a/chrome/browser/extensions/api/storage/settings_sync_unittest.cc b/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
index c35a85d0..0e27331c 100644
--- a/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
+++ b/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
@@ -11,7 +11,6 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
-#include "base/memory/linked_ptr.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
@@ -54,7 +53,7 @@
 // More saving typing. Maps extension IDs to a list of sync changes for that
 // extension.
 using SettingSyncDataMultimap =
-    std::map<std::string, linked_ptr<SettingSyncDataList>>;
+    std::map<std::string, std::unique_ptr<SettingSyncDataList>>;
 
 // Gets the pretty-printed JSON for a value.
 static std::string GetJson(const base::Value& value) {
@@ -120,7 +119,7 @@
     }
     for (syncer::SyncChangeList::const_iterator it = change_list.begin();
         it != change_list.end(); ++it) {
-      changes_.push_back(new SettingSyncData(*it));
+      changes_.push_back(base::MakeUnique<SettingSyncData>(*it));
     }
     return syncer::SyncError();
   }
@@ -146,11 +145,9 @@
   SettingSyncData* GetOnlyChange(const std::string& extension_id,
                                  const std::string& key) {
     std::vector<SettingSyncData*> matching_changes;
-    for (SettingSyncDataList::iterator it = changes_.begin();
-        it != changes_.end(); ++it) {
-      if ((*it)->extension_id() == extension_id && (*it)->key() == key) {
-        matching_changes.push_back(*it);
-      }
+    for (const std::unique_ptr<SettingSyncData>& change : changes_) {
+      if (change->extension_id() == extension_id && change->key() == key)
+        matching_changes.push_back(change.get());
     }
     if (matching_changes.empty()) {
       ADD_FAILURE() << "No matching changes for " << extension_id << "/" <<
@@ -240,12 +237,12 @@
     SettingSyncDataMultimap as_map;
     for (syncer::SyncDataList::iterator it = as_list.begin();
         it != as_list.end(); ++it) {
-      SettingSyncData* sync_data = new SettingSyncData(*it);
-      linked_ptr<SettingSyncDataList>& list_for_extension =
+      std::unique_ptr<SettingSyncData> sync_data(new SettingSyncData(*it));
+      std::unique_ptr<SettingSyncDataList>& list_for_extension =
           as_map[sync_data->extension_id()];
-      if (!list_for_extension.get())
+      if (!list_for_extension)
         list_for_extension.reset(new SettingSyncDataList());
-      list_for_extension->push_back(sync_data);
+      list_for_extension->push_back(std::move(sync_data));
     }
     return as_map;
   }
@@ -1350,7 +1347,7 @@
     storage->Set(DEFAULTS, "key.with.spot", *string_value);
 
     ASSERT_EQ(1u, sync_processor_->changes().size());
-    SettingSyncData* sync_data = sync_processor_->changes()[0];
+    SettingSyncData* sync_data = sync_processor_->changes()[0].get();
     EXPECT_EQ(syncer::SyncChange::ACTION_ADD, sync_data->change_type());
     EXPECT_EQ("ext", sync_data->extension_id());
     EXPECT_EQ("key.with.spot", sync_data->key());
diff --git a/chrome/browser/extensions/api/storage/syncable_settings_storage.cc b/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
index 811dd363..102e2b34 100644
--- a/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
+++ b/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/extensions/api/storage/settings_sync_processor.h"
 #include "chrome/browser/extensions/api/storage/settings_sync_util.h"
@@ -219,13 +220,13 @@
         // Sync and local values are the same, no changes to send.
       } else {
         // Sync value is different, update local setting with new value.
-        changes->push_back(new SettingSyncData(
+        changes->push_back(base::MakeUnique<SettingSyncData>(
             syncer::SyncChange::ACTION_UPDATE, extension_id_, it.key(),
             std::move(sync_value)));
       }
     } else {
       // Not synced, delete local setting.
-      changes->push_back(new SettingSyncData(
+      changes->push_back(base::MakeUnique<SettingSyncData>(
           syncer::SyncChange::ACTION_DELETE, extension_id_, it.key(),
           std::unique_ptr<base::Value>(new base::DictionaryValue())));
     }
@@ -238,7 +239,7 @@
     std::string key = base::DictionaryValue::Iterator(*sync_state).key();
     std::unique_ptr<base::Value> value;
     CHECK(sync_state->RemoveWithoutPathExpansion(key, &value));
-    changes->push_back(new SettingSyncData(
+    changes->push_back(base::MakeUnique<SettingSyncData>(
         syncer::SyncChange::ACTION_ADD, extension_id_, key, std::move(value)));
   }
 
@@ -268,11 +269,10 @@
   std::vector<syncer::SyncError> errors;
   ValueStoreChangeList changes;
 
-  for (SettingSyncDataList::iterator it = sync_changes->begin();
-       it != sync_changes->end(); ++it) {
-    DCHECK_EQ(extension_id_, (*it)->extension_id());
-    const std::string& key = (*it)->key();
-    std::unique_ptr<base::Value> change_value = (*it)->PassValue();
+  for (const std::unique_ptr<SettingSyncData>& sync_change : *sync_changes) {
+    DCHECK_EQ(extension_id_, sync_change->extension_id());
+    const std::string& key = sync_change->key();
+    std::unique_ptr<base::Value> change_value = sync_change->PassValue();
 
     std::unique_ptr<base::Value> current_value;
     {
@@ -292,7 +292,7 @@
 
     syncer::SyncError error;
 
-    switch ((*it)->change_type()) {
+    switch (sync_change->change_type()) {
       case syncer::SyncChange::ACTION_ADD:
         if (!current_value.get()) {
           error = OnSyncAdd(key, std::move(change_value), &changes);
diff --git a/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc b/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc
index d7e2677..f50fdf9 100644
--- a/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc
+++ b/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/web_contents_sizer.h"
@@ -57,15 +58,24 @@
   if (tabs_.size() >= kMaxOffscreenTabsPerExtension)
     return nullptr;  // Maximum number of offscreen tabs reached.
 
-  tabs_.push_back(new OffscreenTab(this));
+  // OffscreenTab cannot be created with MakeUnique<OffscreenTab> since the
+  // constructor is protected. So create it separately, and then move it to
+  // |tabs_| below.
+  std::unique_ptr<OffscreenTab> offscreen_tab(new OffscreenTab(this));
+  tabs_.push_back(std::move(offscreen_tab));
   tabs_.back()->Start(start_url, initial_size, optional_presentation_id);
-  return tabs_.back();
+  return tabs_.back().get();
 }
 
 void OffscreenTabsOwner::DestroyTab(OffscreenTab* tab) {
-  const auto it = std::find(tabs_.begin(), tabs_.end(), tab);
-  if (it != tabs_.end())
-    tabs_.erase(it);
+  for (std::vector<std::unique_ptr<OffscreenTab>>::iterator iter =
+           tabs_.begin();
+       iter != tabs_.end(); ++iter) {
+    if (iter->get() == tab) {
+      tabs_.erase(iter);
+      break;
+    }
+  }
 }
 
 OffscreenTab::OffscreenTab(OffscreenTabsOwner* owner)
diff --git a/chrome/browser/extensions/api/tab_capture/offscreen_tab.h b/chrome/browser/extensions/api/tab_capture/offscreen_tab.h
index 712c117..e639319 100644
--- a/chrome/browser/extensions/api/tab_capture/offscreen_tab.h
+++ b/chrome/browser/extensions/api/tab_capture/offscreen_tab.h
@@ -11,7 +11,6 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/memory/scoped_vector.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "content/public/browser/web_contents_delegate.h"
@@ -75,7 +74,7 @@
   explicit OffscreenTabsOwner(content::WebContents* extension_web_contents);
 
   content::WebContents* const extension_web_contents_;
-  ScopedVector<OffscreenTab> tabs_;
+  std::vector<std::unique_ptr<OffscreenTab>> tabs_;
 
   DISALLOW_COPY_AND_ASSIGN(OffscreenTabsOwner);
 };
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
index 5745674d..c415de6 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
@@ -8,6 +8,7 @@
 
 #include "base/lazy_instance.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "chrome/browser/sessions/session_tab_helper.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
@@ -272,7 +273,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(list_of_capture_info);
   list_of_capture_info->Clear();
-  for (const LiveRequest* request : requests_) {
+  for (const std::unique_ptr<LiveRequest>& request : requests_) {
     if (request->is_anonymous() || !request->is_verified() ||
         request->extension_id() != extension_id)
       continue;
@@ -287,7 +288,8 @@
     const Extension* extension,
     UnloadedExtensionInfo::Reason reason) {
   // Cleanup all the requested media streams for this extension.
-  for (ScopedVector<LiveRequest>::iterator it = requests_.begin();
+  for (std::vector<std::unique_ptr<LiveRequest>>::iterator it =
+           requests_.begin();
        it != requests_.end();) {
     if ((*it)->extension_id() == extension->id()) {
       it = requests_.erase(it);
@@ -313,8 +315,8 @@
     }
   }
 
-  requests_.push_back(
-      new LiveRequest(target_contents, extension_id, is_anonymous, this));
+  requests_.push_back(base::MakeUnique<LiveRequest>(
+      target_contents, extension_id, is_anonymous, this));
   return true;
 }
 
@@ -436,31 +438,31 @@
 
 TabCaptureRegistry::LiveRequest* TabCaptureRegistry::FindRequest(
     const content::WebContents* target_contents) const {
-  for (ScopedVector<LiveRequest>::const_iterator it = requests_.begin();
-       it != requests_.end(); ++it) {
-    if ((*it)->web_contents() == target_contents)
-      return *it;
+  for (const auto& request : requests_) {
+    if (request->web_contents() == target_contents)
+      return request.get();
   }
-  return NULL;
+  return nullptr;
 }
 
 TabCaptureRegistry::LiveRequest* TabCaptureRegistry::FindRequest(
     int original_target_render_process_id,
     int original_target_render_frame_id) const {
-  for (ScopedVector<LiveRequest>::const_iterator it = requests_.begin();
-       it != requests_.end(); ++it) {
-    if ((*it)->WasOriginallyTargettingRenderFrameID(
+  for (const std::unique_ptr<LiveRequest>& request : requests_) {
+    if (request->WasOriginallyTargettingRenderFrameID(
             original_target_render_process_id,
-            original_target_render_frame_id))
-      return *it;
+            original_target_render_frame_id)) {
+      return request.get();
+    }
   }
-  return NULL;
+  return nullptr;
 }
 
 void TabCaptureRegistry::KillRequest(LiveRequest* request) {
-  for (ScopedVector<LiveRequest>::iterator it = requests_.begin();
+  for (std::vector<std::unique_ptr<LiveRequest>>::iterator it =
+           requests_.begin();
        it != requests_.end(); ++it) {
-    if ((*it) == request) {
+    if (it->get() == request) {
       requests_.erase(it);
       return;
     }
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_registry.h b/chrome/browser/extensions/api/tab_capture/tab_capture_registry.h
index 5698fed0e..5b64283 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_registry.h
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_registry.h
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/memory/scoped_vector.h"
 #include "base/scoped_observer.h"
 #include "chrome/browser/media/media_capture_devices_dispatcher.h"
 #include "chrome/common/extensions/api/tab_capture.h"
@@ -110,7 +109,7 @@
   void KillRequest(LiveRequest* request);
 
   content::BrowserContext* const browser_context_;
-  ScopedVector<LiveRequest> requests_;
+  std::vector<std::unique_ptr<LiveRequest>> requests_;
 
   ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
       extension_registry_observer_;
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
index 5ab2706..36188eb 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -10,7 +10,6 @@
 #include "base/bind.h"
 #include "base/lazy_instance.h"
 #include "base/macros.h"
-#include "base/memory/scoped_vector.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -73,7 +72,8 @@
       const std::string& id);
 
  private:
-  typedef ScopedVector<WebstoreInstaller::Approval> ApprovalList;
+  using ApprovalList =
+      std::vector<std::unique_ptr<WebstoreInstaller::Approval>>;
 
   ApprovalList approvals_;
 
@@ -85,18 +85,19 @@
 
 void PendingApprovals::PushApproval(
     std::unique_ptr<WebstoreInstaller::Approval> approval) {
-  approvals_.push_back(approval.release());
+  approvals_.push_back(std::move(approval));
 }
 
 std::unique_ptr<WebstoreInstaller::Approval> PendingApprovals::PopApproval(
     Profile* profile,
     const std::string& id) {
-  for (size_t i = 0; i < approvals_.size(); ++i) {
-    WebstoreInstaller::Approval* approval = approvals_[i];
-    if (approval->extension_id == id &&
-        profile->IsSameProfile(approval->profile)) {
-      approvals_.weak_erase(approvals_.begin() + i);
-      return std::unique_ptr<WebstoreInstaller::Approval>(approval);
+  for (ApprovalList::iterator iter = approvals_.begin();
+       iter != approvals_.end(); ++iter) {
+    if (iter->get()->extension_id == id &&
+        profile->IsSameProfile(iter->get()->profile)) {
+      std::unique_ptr<WebstoreInstaller::Approval> approval = std::move(*iter);
+      approvals_.erase(iter);
+      return approval;
     }
   }
   return std::unique_ptr<WebstoreInstaller::Approval>();
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc
index 6b926d7..c7e5f4f 100644
--- a/chrome/browser/extensions/extension_management.cc
+++ b/chrome/browser/extensions/extension_management.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_util.h"
@@ -59,8 +60,10 @@
   // before first call to Refresh(), so in order to resolve this, Refresh() must
   // be called in the initialization of ExtensionManagement.
   Refresh();
-  providers_.push_back(new StandardManagementPolicyProvider(this));
-  providers_.push_back(new PermissionsBasedManagementPolicyProvider(this));
+  providers_.push_back(
+      base::MakeUnique<StandardManagementPolicyProvider>(this));
+  providers_.push_back(
+      base::MakeUnique<PermissionsBasedManagementPolicyProvider>(this));
 }
 
 ExtensionManagement::~ExtensionManagement() {
@@ -79,9 +82,9 @@
   observer_list_.RemoveObserver(observer);
 }
 
-std::vector<ManagementPolicy::Provider*> ExtensionManagement::GetProviders()
-    const {
-  return providers_.get();
+const std::vector<std::unique_ptr<ManagementPolicy::Provider>>&
+ExtensionManagement::GetProviders() const {
+  return providers_;
 }
 
 bool ExtensionManagement::BlacklistedByDefault() const {
diff --git a/chrome/browser/extensions/extension_management.h b/chrome/browser/extensions/extension_management.h
index b3010588..9d9831e8 100644
--- a/chrome/browser/extensions/extension_management.h
+++ b/chrome/browser/extensions/extension_management.h
@@ -12,7 +12,6 @@
 #include "base/containers/scoped_ptr_hash_map.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/memory/scoped_vector.h"
 #include "base/memory/singleton.h"
 #include "base/observer_list.h"
 #include "base/values.h"
@@ -82,7 +81,8 @@
 
   // Get the list of ManagementPolicy::Provider controlled by extension
   // management policy settings.
-  std::vector<ManagementPolicy::Provider*> GetProviders() const;
+  const std::vector<std::unique_ptr<ManagementPolicy::Provider>>& GetProviders()
+      const;
 
   // Checks if extensions are blacklisted by default, by policy. When true,
   // this means that even extensions without an ID should be blacklisted (e.g.
@@ -187,7 +187,7 @@
 
   base::ObserverList<Observer, true> observer_list_;
   PrefChangeRegistrar pref_change_registrar_;
-  ScopedVector<ManagementPolicy::Provider> providers_;
+  std::vector<std::unique_ptr<ManagementPolicy::Provider>> providers_;
 
   DISALLOW_COPY_AND_ASSIGN(ExtensionManagement);
 };
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index cfd8ba1..4be4f7f1 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -231,20 +231,22 @@
 
 void ExtensionService::OnExternalProviderUpdateComplete(
     const ExternalProviderInterface* provider,
-    const ScopedVector<ExternalInstallInfoUpdateUrl>& update_url_extensions,
-    const ScopedVector<ExternalInstallInfoFile>& file_extensions,
+    const std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>&
+        update_url_extensions,
+    const std::vector<std::unique_ptr<ExternalInstallInfoFile>>&
+        file_extensions,
     const std::set<std::string>& removed_extensions) {
   // Update pending_extension_manager() with the new extensions first.
-  for (auto* extension : update_url_extensions)
+  for (const auto& extension : update_url_extensions)
     OnExternalExtensionUpdateUrlFound(*extension, false);
-  for (auto* extension : file_extensions)
+  for (const auto& extension : file_extensions)
     OnExternalExtensionFileFound(*extension);
 
 #if DCHECK_IS_ON()
   for (const std::string& id : removed_extensions) {
-    for (auto* extension : update_url_extensions)
+    for (const auto& extension : update_url_extensions)
       DCHECK_NE(id, extension->extension_id);
-    for (auto* extension : file_extensions)
+    for (const auto& extension : file_extensions)
       DCHECK_NE(id, extension->extension_id);
   }
 #endif
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h
index 55a8b3f..942e974 100644
--- a/chrome/browser/extensions/extension_service.h
+++ b/chrome/browser/extensions/extension_service.h
@@ -242,9 +242,10 @@
       const extensions::ExternalProviderInterface* provider) override;
   void OnExternalProviderUpdateComplete(
       const extensions::ExternalProviderInterface* provider,
-      const ScopedVector<extensions::ExternalInstallInfoUpdateUrl>&
+      const std::vector<
+          std::unique_ptr<extensions::ExternalInstallInfoUpdateUrl>>&
           external_update_url_extensions,
-      const ScopedVector<extensions::ExternalInstallInfoFile>&
+      const std::vector<std::unique_ptr<extensions::ExternalInstallInfoFile>>&
           external_file_extensions,
       const std::set<std::string>& removed_extensions) override;
 
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 604796b..57e06b16 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -466,8 +466,10 @@
 
   void OnExternalProviderUpdateComplete(
       const ExternalProviderInterface* provider,
-      const ScopedVector<ExternalInstallInfoUpdateUrl>& update_url_extensions,
-      const ScopedVector<ExternalInstallInfoFile>& file_extensions,
+      const std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>&
+          update_url_extensions,
+      const std::vector<std::unique_ptr<ExternalInstallInfoFile>>&
+          file_extensions,
       const std::set<std::string>& removed_extensions) override {
     ADD_FAILURE() << "MockProviderVisitor does not provide incremental updates,"
                      " use MockUpdateProviderVisitor instead.";
@@ -535,14 +537,16 @@
 
   void OnExternalProviderUpdateComplete(
       const ExternalProviderInterface* provider,
-      const ScopedVector<ExternalInstallInfoUpdateUrl>& update_url_extensions,
-      const ScopedVector<ExternalInstallInfoFile>& file_extensions,
+      const std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>&
+          update_url_extensions,
+      const std::vector<std::unique_ptr<ExternalInstallInfoFile>>&
+          file_extensions,
       const std::set<std::string>& removed_extensions) override {
-    for (auto* extension_info : update_url_extensions)
+    for (const auto& extension_info : update_url_extensions)
       update_url_extension_ids_.insert(extension_info->extension_id);
     EXPECT_EQ(update_url_extension_ids_.size(), update_url_extensions.size());
 
-    for (auto* extension_info : file_extensions)
+    for (const auto& extension_info : file_extensions)
       file_extension_ids_.insert(extension_info->extension_id);
     EXPECT_EQ(file_extension_ids_.size(), file_extensions.size());
 
diff --git a/chrome/browser/extensions/external_policy_loader_unittest.cc b/chrome/browser/extensions/external_policy_loader_unittest.cc
index 9aaae08..540ef99 100644
--- a/chrome/browser/extensions/external_policy_loader_unittest.cc
+++ b/chrome/browser/extensions/external_policy_loader_unittest.cc
@@ -103,8 +103,10 @@
 
   void OnExternalProviderUpdateComplete(
       const ExternalProviderInterface* provider,
-      const ScopedVector<ExternalInstallInfoUpdateUrl>& update_url_extensions,
-      const ScopedVector<ExternalInstallInfoFile>& file_extensions,
+      const std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>&
+          update_url_extensions,
+      const std::vector<std::unique_ptr<ExternalInstallInfoFile>>&
+          file_extensions,
       const std::set<std::string>& removed_extensions) override {
     ADD_FAILURE() << "Only win registry provider is expected to call this.";
   }
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc
index fe47198..750228c1 100644
--- a/chrome/browser/extensions/external_provider_impl.cc
+++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -122,15 +122,17 @@
   prefs_.reset(prefs);
   ready_ = true;  // Queries for extensions are allowed from this point.
 
-  ScopedVector<ExternalInstallInfoUpdateUrl> external_update_url_extensions;
-  ScopedVector<ExternalInstallInfoFile> external_file_extensions;
+  std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>
+      external_update_url_extensions;
+  std::vector<std::unique_ptr<ExternalInstallInfoFile>>
+      external_file_extensions;
 
   RetrieveExtensionsFromPrefs(&external_update_url_extensions,
                               &external_file_extensions);
-  for (auto* extension : external_update_url_extensions)
+  for (const auto& extension : external_update_url_extensions)
     service_->OnExternalExtensionUpdateUrlFound(*extension, true);
 
-  for (auto* extension : external_file_extensions)
+  for (const auto& extension : external_file_extensions)
     service_->OnExternalExtensionFileFound(*extension);
 
   service_->OnExternalProviderReady(this);
@@ -159,8 +161,10 @@
 
   prefs_.reset(prefs);
 
-  ScopedVector<ExternalInstallInfoUpdateUrl> external_update_url_extensions;
-  ScopedVector<ExternalInstallInfoFile> external_file_extensions;
+  std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>
+      external_update_url_extensions;
+  std::vector<std::unique_ptr<ExternalInstallInfoFile>>
+      external_file_extensions;
   RetrieveExtensionsFromPrefs(&external_update_url_extensions,
                               &external_file_extensions);
 
@@ -173,8 +177,10 @@
 }
 
 void ExternalProviderImpl::RetrieveExtensionsFromPrefs(
-    ScopedVector<ExternalInstallInfoUpdateUrl>* external_update_url_extensions,
-    ScopedVector<ExternalInstallInfoFile>* external_file_extensions) {
+    std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>*
+        external_update_url_extensions,
+    std::vector<std::unique_ptr<ExternalInstallInfoFile>>*
+        external_file_extensions) {
   // Set of unsupported extensions that need to be deleted from prefs_.
   std::set<std::string> unsupported_extensions;
 
@@ -351,9 +357,10 @@
                      << external_version << "\".";
         continue;
       }
-      external_file_extensions->push_back(new ExternalInstallInfoFile(
-          extension_id, std::move(version), path, crx_location_, creation_flags,
-          auto_acknowledge_, install_immediately_));
+      external_file_extensions->push_back(
+          base::MakeUnique<ExternalInstallInfoFile>(
+              extension_id, std::move(version), path, crx_location_,
+              creation_flags, auto_acknowledge_, install_immediately_));
     } else {  // if (has_external_update_url)
       CHECK(has_external_update_url);  // Checking of keys above ensures this.
       if (download_location_ == Manifest::INVALID_LOCATION) {
@@ -370,7 +377,7 @@
         continue;
       }
       external_update_url_extensions->push_back(
-          new ExternalInstallInfoUpdateUrl(
+          base::MakeUnique<ExternalInstallInfoUpdateUrl>(
               extension_id, install_parameter, std::move(update_url),
               download_location_, creation_flags, auto_acknowledge_));
     }
diff --git a/chrome/browser/extensions/external_provider_impl.h b/chrome/browser/extensions/external_provider_impl.h
index d1bb516..10d92f2a1 100644
--- a/chrome/browser/extensions/external_provider_impl.h
+++ b/chrome/browser/extensions/external_provider_impl.h
@@ -10,7 +10,6 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/memory/scoped_vector.h"
 #include "chrome/browser/extensions/external_loader.h"
 #include "extensions/browser/external_provider_interface.h"
 #include "extensions/common/manifest.h"
@@ -104,9 +103,10 @@
 
   // Retrieves the extensions that were found in this provider.
   void RetrieveExtensionsFromPrefs(
-      ScopedVector<ExternalInstallInfoUpdateUrl>*
+      std::vector<std::unique_ptr<ExternalInstallInfoUpdateUrl>>*
           external_update_url_extensions,
-      ScopedVector<ExternalInstallInfoFile>* external_file_extensions);
+      std::vector<std::unique_ptr<ExternalInstallInfoFile>>*
+          external_file_extensions);
 
   // Location for external extensions that are provided by this provider from
   // local crx files.
diff --git a/chrome/browser/extensions/window_open_apitest.cc b/chrome/browser/extensions/window_open_apitest.cc
index 6608957f..fd74795 100644
--- a/chrome/browser/extensions/window_open_apitest.cc
+++ b/chrome/browser/extensions/window_open_apitest.cc
@@ -4,7 +4,6 @@
 
 #include <stddef.h>
 
-#include "base/memory/scoped_vector.h"
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
 #include "build/build_config.h"