| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/extensions/external_registry_loader_win.h" | 5 #include "chrome/browser/extensions/external_registry_loader_win.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/memory/scoped_handle.h" | 10 #include "base/memory/scoped_handle.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 } | 49 } |
| 50 | 50 |
| 51 void ExternalRegistryLoader::LoadOnFileThread() { | 51 void ExternalRegistryLoader::LoadOnFileThread() { |
| 52 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 52 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 53 base::TimeTicks start_time = base::TimeTicks::Now(); | 53 base::TimeTicks start_time = base::TimeTicks::Now(); |
| 54 scoped_ptr<DictionaryValue> prefs(new DictionaryValue); | 54 scoped_ptr<DictionaryValue> prefs(new DictionaryValue); |
| 55 | 55 |
| 56 // A map of IDs, to weed out duplicates between HKCU and HKLM. | 56 // A map of IDs, to weed out duplicates between HKCU and HKLM. |
| 57 std::set<string16> keys; | 57 std::set<string16> keys; |
| 58 base::win::RegistryKeyIterator iterator_machine_key( | 58 base::win::RegistryKeyIterator iterator_machine_key( |
| 59 HKEY_LOCAL_MACHINE, ASCIIToWide(kRegistryExtensions).c_str()); | 59 HKEY_LOCAL_MACHINE, base::ASCIIToWide(kRegistryExtensions).c_str()); |
| 60 for (; iterator_machine_key.Valid(); ++iterator_machine_key) | 60 for (; iterator_machine_key.Valid(); ++iterator_machine_key) |
| 61 keys.insert(iterator_machine_key.Name()); | 61 keys.insert(iterator_machine_key.Name()); |
| 62 base::win::RegistryKeyIterator iterator_user_key( | 62 base::win::RegistryKeyIterator iterator_user_key( |
| 63 HKEY_CURRENT_USER, ASCIIToWide(kRegistryExtensions).c_str()); | 63 HKEY_CURRENT_USER, base::ASCIIToWide(kRegistryExtensions).c_str()); |
| 64 for (; iterator_user_key.Valid(); ++iterator_user_key) | 64 for (; iterator_user_key.Valid(); ++iterator_user_key) |
| 65 keys.insert(iterator_user_key.Name()); | 65 keys.insert(iterator_user_key.Name()); |
| 66 | 66 |
| 67 // Iterate over the keys found, first trying HKLM, then HKCU, as per Windows | 67 // Iterate over the keys found, first trying HKLM, then HKCU, as per Windows |
| 68 // policy conventions. We only fall back to HKCU if the HKLM key cannot be | 68 // policy conventions. We only fall back to HKCU if the HKLM key cannot be |
| 69 // opened, not if the data within the key is invalid, for example. | 69 // opened, not if the data within the key is invalid, for example. |
| 70 for (std::set<string16>::const_iterator it = keys.begin(); | 70 for (std::set<string16>::const_iterator it = keys.begin(); |
| 71 it != keys.end(); ++it) { | 71 it != keys.end(); ++it) { |
| 72 base::win::RegKey key; | 72 base::win::RegKey key; |
| 73 string16 key_path = ASCIIToWide(kRegistryExtensions); | 73 string16 key_path = base::ASCIIToWide(kRegistryExtensions); |
| 74 key_path.append(L"\\"); | 74 key_path.append(L"\\"); |
| 75 key_path.append(*it); | 75 key_path.append(*it); |
| 76 if (key.Open(HKEY_LOCAL_MACHINE, | 76 if (key.Open(HKEY_LOCAL_MACHINE, |
| 77 key_path.c_str(), KEY_READ) != ERROR_SUCCESS) { | 77 key_path.c_str(), KEY_READ) != ERROR_SUCCESS) { |
| 78 if (key.Open(HKEY_CURRENT_USER, | 78 if (key.Open(HKEY_CURRENT_USER, |
| 79 key_path.c_str(), KEY_READ) != ERROR_SUCCESS) { | 79 key_path.c_str(), KEY_READ) != ERROR_SUCCESS) { |
| 80 LOG(ERROR) << "Unable to read registry key at path (HKLM & HKCU): " | 80 LOG(ERROR) << "Unable to read registry key at path (HKLM & HKCU): " |
| 81 << key_path << "."; | 81 << key_path << "."; |
| 82 continue; | 82 continue; |
| 83 } | 83 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 | 117 |
| 118 string16 extension_version; | 118 string16 extension_version; |
| 119 if (key.ReadValue(kRegistryExtensionVersion, &extension_version) | 119 if (key.ReadValue(kRegistryExtensionVersion, &extension_version) |
| 120 != ERROR_SUCCESS) { | 120 != ERROR_SUCCESS) { |
| 121 // TODO(erikkay): find a way to get this into about:extensions | 121 // TODO(erikkay): find a way to get this into about:extensions |
| 122 LOG(ERROR) << "Missing value " << kRegistryExtensionVersion | 122 LOG(ERROR) << "Missing value " << kRegistryExtensionVersion |
| 123 << " for key " << key_path << "."; | 123 << " for key " << key_path << "."; |
| 124 continue; | 124 continue; |
| 125 } | 125 } |
| 126 | 126 |
| 127 std::string id = WideToASCII(*it); | 127 std::string id = base::WideToASCII(*it); |
| 128 StringToLowerASCII(&id); | 128 StringToLowerASCII(&id); |
| 129 if (!Extension::IdIsValid(id)) { | 129 if (!Extension::IdIsValid(id)) { |
| 130 LOG(ERROR) << "Invalid id value " << id | 130 LOG(ERROR) << "Invalid id value " << id |
| 131 << " for key " << key_path << "."; | 131 << " for key " << key_path << "."; |
| 132 continue; | 132 continue; |
| 133 } | 133 } |
| 134 | 134 |
| 135 Version version(WideToASCII(extension_version)); | 135 Version version(base::WideToASCII(extension_version)); |
| 136 if (!version.IsValid()) { | 136 if (!version.IsValid()) { |
| 137 LOG(ERROR) << "Invalid version value " << extension_version | 137 LOG(ERROR) << "Invalid version value " << extension_version |
| 138 << " for key " << key_path << "."; | 138 << " for key " << key_path << "."; |
| 139 continue; | 139 continue; |
| 140 } | 140 } |
| 141 | 141 |
| 142 prefs->SetString( | 142 prefs->SetString( |
| 143 id + "." + ExternalProviderImpl::kExternalVersion, | 143 id + "." + ExternalProviderImpl::kExternalVersion, |
| 144 WideToASCII(extension_version)); | 144 base::WideToASCII(extension_version)); |
| 145 prefs->SetString( | 145 prefs->SetString( |
| 146 id + "." + ExternalProviderImpl::kExternalCrx, | 146 id + "." + ExternalProviderImpl::kExternalCrx, |
| 147 extension_path_str); | 147 extension_path_str); |
| 148 } | 148 } |
| 149 | 149 |
| 150 prefs_.reset(prefs.release()); | 150 prefs_.reset(prefs.release()); |
| 151 HISTOGRAM_TIMES("Extensions.ExternalRegistryLoaderWin", | 151 HISTOGRAM_TIMES("Extensions.ExternalRegistryLoaderWin", |
| 152 base::TimeTicks::Now() - start_time); | 152 base::TimeTicks::Now() - start_time); |
| 153 BrowserThread::PostTask( | 153 BrowserThread::PostTask( |
| 154 BrowserThread::UI, FROM_HERE, | 154 BrowserThread::UI, FROM_HERE, |
| 155 base::Bind(&ExternalRegistryLoader::LoadFinished, this)); | 155 base::Bind(&ExternalRegistryLoader::LoadFinished, this)); |
| 156 } | 156 } |
| 157 | 157 |
| 158 } // namespace extensions | 158 } // namespace extensions |
| OLD | NEW |