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/utility/importer/ie_importer_win.h" | 5 #include "chrome/utility/importer/ie_importer_win.h" |
6 | 6 |
7 #include <ole2.h> | 7 #include <ole2.h> |
8 #include <intshcut.h> | 8 #include <intshcut.h> |
9 #include <shlobj.h> | 9 #include <shlobj.h> |
| 10 #include <stddef.h> |
10 #include <urlhist.h> | 11 #include <urlhist.h> |
11 #include <wininet.h> | 12 #include <wininet.h> |
12 | 13 |
13 #include <algorithm> | 14 #include <algorithm> |
14 #include <map> | 15 #include <map> |
15 #include <string> | 16 #include <string> |
16 #include <vector> | 17 #include <vector> |
17 | 18 |
18 #include "base/files/file_enumerator.h" | 19 #include "base/files/file_enumerator.h" |
19 #include "base/files/file_path.h" | 20 #include "base/files/file_path.h" |
20 #include "base/files/file_util.h" | 21 #include "base/files/file_util.h" |
| 22 #include "base/macros.h" |
21 #include "base/strings/string16.h" | 23 #include "base/strings/string16.h" |
22 #include "base/strings/string_split.h" | 24 #include "base/strings/string_split.h" |
23 #include "base/strings/string_util.h" | 25 #include "base/strings/string_util.h" |
24 #include "base/strings/utf_string_conversions.h" | 26 #include "base/strings/utf_string_conversions.h" |
25 #include "base/time/time.h" | 27 #include "base/time/time.h" |
26 #include "base/win/registry.h" | 28 #include "base/win/registry.h" |
27 #include "base/win/scoped_co_mem.h" | 29 #include "base/win/scoped_co_mem.h" |
28 #include "base/win/scoped_comptr.h" | 30 #include "base/win/scoped_comptr.h" |
29 #include "base/win/scoped_handle.h" | 31 #include "base/win/scoped_handle.h" |
30 #include "base/win/scoped_propvariant.h" | 32 #include "base/win/scoped_propvariant.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL)); | 75 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL)); |
74 FILETIME creation_filetime; | 76 FILETIME creation_filetime; |
75 if (!file_handle.IsValid()) | 77 if (!file_handle.IsValid()) |
76 return creation_time; | 78 return creation_time; |
77 if (GetFileTime(file_handle.Get(), &creation_filetime, NULL, NULL)) | 79 if (GetFileTime(file_handle.Get(), &creation_filetime, NULL, NULL)) |
78 creation_time = base::Time::FromFileTime(creation_filetime); | 80 creation_time = base::Time::FromFileTime(creation_filetime); |
79 return creation_time; | 81 return creation_time; |
80 } | 82 } |
81 | 83 |
82 // Safely read an object of type T from a raw sequence of bytes. | 84 // Safely read an object of type T from a raw sequence of bytes. |
83 template<typename T> | 85 template <typename T> |
84 bool BinaryRead(T* data, size_t offset, const std::vector<uint8>& blob) { | 86 bool BinaryRead(T* data, size_t offset, const std::vector<uint8_t>& blob) { |
85 if (offset + sizeof(T) > blob.size()) | 87 if (offset + sizeof(T) > blob.size()) |
86 return false; | 88 return false; |
87 memcpy(data, &blob[offset], sizeof(T)); | 89 memcpy(data, &blob[offset], sizeof(T)); |
88 return true; | 90 return true; |
89 } | 91 } |
90 | 92 |
91 // Safely read an ITEMIDLIST from a raw sequence of bytes. | 93 // Safely read an ITEMIDLIST from a raw sequence of bytes. |
92 // | 94 // |
93 // An ITEMIDLIST is a list of SHITEMIDs, terminated by a SHITEMID with | 95 // An ITEMIDLIST is a list of SHITEMIDs, terminated by a SHITEMID with |
94 // .cb = 0. Here, before simply casting &blob[offset] to LPITEMIDLIST, | 96 // .cb = 0. Here, before simply casting &blob[offset] to LPITEMIDLIST, |
95 // we verify that the list structure is not overrunning the boundary of | 97 // we verify that the list structure is not overrunning the boundary of |
96 // the binary blob. | 98 // the binary blob. |
97 LPCITEMIDLIST BinaryReadItemIDList(size_t offset, size_t idlist_size, | 99 LPCITEMIDLIST BinaryReadItemIDList(size_t offset, |
98 const std::vector<uint8>& blob) { | 100 size_t idlist_size, |
| 101 const std::vector<uint8_t>& blob) { |
99 size_t head = 0; | 102 size_t head = 0; |
100 while (true) { | 103 while (true) { |
101 // Use a USHORT instead of SHITEMID to avoid buffer over read. | 104 // Use a USHORT instead of SHITEMID to avoid buffer over read. |
102 USHORT id_cb; | 105 USHORT id_cb; |
103 if (head >= idlist_size || !BinaryRead(&id_cb, offset + head, blob)) | 106 if (head >= idlist_size || !BinaryRead(&id_cb, offset + head, blob)) |
104 return NULL; | 107 return NULL; |
105 if (id_cb == 0) | 108 if (id_cb == 0) |
106 break; | 109 break; |
107 head += id_cb; | 110 head += id_cb; |
108 } | 111 } |
109 return reinterpret_cast<LPCITEMIDLIST>(&blob[offset]); | 112 return reinterpret_cast<LPCITEMIDLIST>(&blob[offset]); |
110 } | 113 } |
111 | 114 |
112 // Compares the two bookmarks in the order of IE's Favorites menu. | 115 // Compares the two bookmarks in the order of IE's Favorites menu. |
113 // Returns true if rhs should come later than lhs (lhs < rhs). | 116 // Returns true if rhs should come later than lhs (lhs < rhs). |
114 struct IEOrderBookmarkComparator { | 117 struct IEOrderBookmarkComparator { |
115 bool operator()(const ImportedBookmarkEntry& lhs, | 118 bool operator()(const ImportedBookmarkEntry& lhs, |
116 const ImportedBookmarkEntry& rhs) const { | 119 const ImportedBookmarkEntry& rhs) const { |
117 static const uint32 kNotSorted = 0xfffffffb; // IE uses this magic value. | 120 static const uint32_t kNotSorted = 0xfffffffb; // IE uses this magic value. |
118 base::FilePath lhs_prefix; | 121 base::FilePath lhs_prefix; |
119 base::FilePath rhs_prefix; | 122 base::FilePath rhs_prefix; |
120 for (size_t i = 0; i <= lhs.path.size() && i <= rhs.path.size(); ++i) { | 123 for (size_t i = 0; i <= lhs.path.size() && i <= rhs.path.size(); ++i) { |
121 const base::FilePath::StringType lhs_i = | 124 const base::FilePath::StringType lhs_i = |
122 (i < lhs.path.size() ? lhs.path[i] : lhs.title + L".url"); | 125 (i < lhs.path.size() ? lhs.path[i] : lhs.title + L".url"); |
123 const base::FilePath::StringType rhs_i = | 126 const base::FilePath::StringType rhs_i = |
124 (i < rhs.path.size() ? rhs.path[i] : rhs.title + L".url"); | 127 (i < rhs.path.size() ? rhs.path[i] : rhs.title + L".url"); |
125 lhs_prefix = lhs_prefix.Append(lhs_i); | 128 lhs_prefix = lhs_prefix.Append(lhs_i); |
126 rhs_prefix = rhs_prefix.Append(rhs_i); | 129 rhs_prefix = rhs_prefix.Append(rhs_i); |
127 if (lhs_i == rhs_i) | 130 if (lhs_i == rhs_i) |
128 continue; | 131 continue; |
129 // The first path element that differs between the two. | 132 // The first path element that differs between the two. |
130 std::map<base::FilePath, uint32>::const_iterator lhs_iter = | 133 std::map<base::FilePath, uint32_t>::const_iterator lhs_iter = |
131 sort_index_->find(lhs_prefix); | 134 sort_index_->find(lhs_prefix); |
132 std::map<base::FilePath, uint32>::const_iterator rhs_iter = | 135 std::map<base::FilePath, uint32_t>::const_iterator rhs_iter = |
133 sort_index_->find(rhs_prefix); | 136 sort_index_->find(rhs_prefix); |
134 uint32 lhs_sort_index = (lhs_iter == sort_index_->end() ? kNotSorted | 137 uint32_t lhs_sort_index = |
135 : lhs_iter->second); | 138 (lhs_iter == sort_index_->end() ? kNotSorted : lhs_iter->second); |
136 uint32 rhs_sort_index = (rhs_iter == sort_index_->end() ? kNotSorted | 139 uint32_t rhs_sort_index = |
137 : rhs_iter->second); | 140 (rhs_iter == sort_index_->end() ? kNotSorted : rhs_iter->second); |
138 if (lhs_sort_index != rhs_sort_index) | 141 if (lhs_sort_index != rhs_sort_index) |
139 return lhs_sort_index < rhs_sort_index; | 142 return lhs_sort_index < rhs_sort_index; |
140 // If they have the same sort order, sort alphabetically. | 143 // If they have the same sort order, sort alphabetically. |
141 return lhs_i < rhs_i; | 144 return lhs_i < rhs_i; |
142 } | 145 } |
143 return lhs.path.size() < rhs.path.size(); | 146 return lhs.path.size() < rhs.path.size(); |
144 } | 147 } |
145 const std::map<base::FilePath, uint32>* sort_index_; | 148 const std::map<base::FilePath, uint32_t>* sort_index_; |
146 }; | 149 }; |
147 | 150 |
148 // IE stores the order of the Favorites menu in registry under: | 151 // IE stores the order of the Favorites menu in registry under: |
149 // HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Favorites. | 152 // HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Favorites. |
150 // The folder hierarchy of Favorites menu is directly mapped to the key | 153 // The folder hierarchy of Favorites menu is directly mapped to the key |
151 // hierarchy in the registry. | 154 // hierarchy in the registry. |
152 // | 155 // |
153 // If the order of the items in a folder is customized by user, the order is | 156 // If the order of the items in a folder is customized by user, the order is |
154 // recorded in the REG_BINARY value named "Order" of the corresponding key. | 157 // recorded in the REG_BINARY value named "Order" of the corresponding key. |
155 // The content of the "Order" value is a raw binary dump of an array of the | 158 // The content of the "Order" value is a raw binary dump of an array of the |
156 // following data structure | 159 // following data structure |
157 // struct { | 160 // struct { |
158 // uint32 size; // Note that ITEMIDLIST is variably-sized. | 161 // uint32_t size; // Note that ITEMIDLIST is variably-sized. |
159 // uint32 sort_index; // 0 means this is the first item, 1 the second, ... | 162 // uint32_t sort_index; // 0 means this is the first item, 1 the second, |
| 163 // ... |
160 // ITEMIDLIST item_id; | 164 // ITEMIDLIST item_id; |
161 // }; | 165 // }; |
162 // where each item_id should correspond to a favorites link file (*.url) in | 166 // where each item_id should correspond to a favorites link file (*.url) in |
163 // the current folder. | 167 // the current folder. |
164 // gcc, in its infinite wisdom, only allows WARN_UNUSED_RESULT for prototypes. | 168 // gcc, in its infinite wisdom, only allows WARN_UNUSED_RESULT for prototypes. |
165 // Clang, to be compatible with gcc, warns if WARN_UNUSED_RESULT is used in a | 169 // Clang, to be compatible with gcc, warns if WARN_UNUSED_RESULT is used in a |
166 // non-gcc compatible manner (-Wgcc-compat). So even though gcc isn't used to | 170 // non-gcc compatible manner (-Wgcc-compat). So even though gcc isn't used to |
167 // build on Windows, declare some prototypes anyway to satisfy Clang's gcc | 171 // build on Windows, declare some prototypes anyway to satisfy Clang's gcc |
168 // compatibility warnings. | 172 // compatibility warnings. |
169 bool ParseFavoritesOrderBlob(const Importer* importer, | 173 bool ParseFavoritesOrderBlob(const Importer* importer, |
170 const std::vector<uint8>& blob, | 174 const std::vector<uint8_t>& blob, |
171 const base::FilePath& path, | 175 const base::FilePath& path, |
172 std::map<base::FilePath, uint32>* sort_index) | 176 std::map<base::FilePath, uint32_t>* sort_index) |
173 WARN_UNUSED_RESULT; | 177 WARN_UNUSED_RESULT; |
174 bool ParseFavoritesOrderBlob(const Importer* importer, | 178 bool ParseFavoritesOrderBlob(const Importer* importer, |
175 const std::vector<uint8>& blob, | 179 const std::vector<uint8_t>& blob, |
176 const base::FilePath& path, | 180 const base::FilePath& path, |
177 std::map<base::FilePath, uint32>* sort_index) { | 181 std::map<base::FilePath, uint32_t>* sort_index) { |
178 static const int kItemCountOffset = 16; | 182 static const int kItemCountOffset = 16; |
179 static const int kItemListStartOffset = 20; | 183 static const int kItemListStartOffset = 20; |
180 | 184 |
181 // Read the number of items. | 185 // Read the number of items. |
182 uint32 item_count = 0; | 186 uint32_t item_count = 0; |
183 if (!BinaryRead(&item_count, kItemCountOffset, blob)) | 187 if (!BinaryRead(&item_count, kItemCountOffset, blob)) |
184 return false; | 188 return false; |
185 | 189 |
186 // Traverse over the items. | 190 // Traverse over the items. |
187 size_t base_offset = kItemListStartOffset; | 191 size_t base_offset = kItemListStartOffset; |
188 for (uint32 i = 0; i < item_count && !importer->cancelled(); ++i) { | 192 for (uint32_t i = 0; i < item_count && !importer->cancelled(); ++i) { |
189 static const int kSizeOffset = 0; | 193 static const int kSizeOffset = 0; |
190 static const int kSortIndexOffset = 4; | 194 static const int kSortIndexOffset = 4; |
191 static const int kItemIDListOffset = 8; | 195 static const int kItemIDListOffset = 8; |
192 | 196 |
193 // Read the size (number of bytes) of the current item. | 197 // Read the size (number of bytes) of the current item. |
194 uint32 item_size = 0; | 198 uint32_t item_size = 0; |
195 if (!BinaryRead(&item_size, base_offset + kSizeOffset, blob) || | 199 if (!BinaryRead(&item_size, base_offset + kSizeOffset, blob) || |
196 base_offset + item_size <= base_offset || // checking overflow | 200 base_offset + item_size <= base_offset || // checking overflow |
197 base_offset + item_size > blob.size()) | 201 base_offset + item_size > blob.size()) |
198 return false; | 202 return false; |
199 | 203 |
200 // Read the sort index of the current item. | 204 // Read the sort index of the current item. |
201 uint32 item_sort_index = 0; | 205 uint32_t item_sort_index = 0; |
202 if (!BinaryRead(&item_sort_index, base_offset + kSortIndexOffset, blob)) | 206 if (!BinaryRead(&item_sort_index, base_offset + kSortIndexOffset, blob)) |
203 return false; | 207 return false; |
204 | 208 |
205 // Read the file name from the ITEMIDLIST structure. | 209 // Read the file name from the ITEMIDLIST structure. |
206 LPCITEMIDLIST idlist = BinaryReadItemIDList( | 210 LPCITEMIDLIST idlist = BinaryReadItemIDList( |
207 base_offset + kItemIDListOffset, item_size - kItemIDListOffset, blob); | 211 base_offset + kItemIDListOffset, item_size - kItemIDListOffset, blob); |
208 TCHAR item_filename[MAX_PATH]; | 212 TCHAR item_filename[MAX_PATH]; |
209 if (!idlist || !SHGetPathFromIDList(idlist, item_filename)) | 213 if (!idlist || !SHGetPathFromIDList(idlist, item_filename)) |
210 return false; | 214 return false; |
211 base::FilePath item_relative_path = | 215 base::FilePath item_relative_path = |
212 path.Append(base::FilePath(item_filename).BaseName()); | 216 path.Append(base::FilePath(item_filename).BaseName()); |
213 | 217 |
214 // Record the retrieved information and go to the next item. | 218 // Record the retrieved information and go to the next item. |
215 sort_index->insert(std::make_pair(item_relative_path, item_sort_index)); | 219 sort_index->insert(std::make_pair(item_relative_path, item_sort_index)); |
216 base_offset += item_size; | 220 base_offset += item_size; |
217 } | 221 } |
218 return true; | 222 return true; |
219 } | 223 } |
220 | 224 |
221 bool ParseFavoritesOrderRegistryTree( | 225 bool ParseFavoritesOrderRegistryTree( |
222 const Importer* importer, | 226 const Importer* importer, |
223 const base::win::RegKey& key, | 227 const base::win::RegKey& key, |
224 const base::FilePath& path, | 228 const base::FilePath& path, |
225 std::map<base::FilePath, uint32>* sort_index) WARN_UNUSED_RESULT; | 229 std::map<base::FilePath, uint32_t>* sort_index) WARN_UNUSED_RESULT; |
226 bool ParseFavoritesOrderRegistryTree( | 230 bool ParseFavoritesOrderRegistryTree( |
227 const Importer* importer, | 231 const Importer* importer, |
228 const base::win::RegKey& key, | 232 const base::win::RegKey& key, |
229 const base::FilePath& path, | 233 const base::FilePath& path, |
230 std::map<base::FilePath, uint32>* sort_index) { | 234 std::map<base::FilePath, uint32_t>* sort_index) { |
231 // Parse the order information of the current folder. | 235 // Parse the order information of the current folder. |
232 DWORD blob_length = 0; | 236 DWORD blob_length = 0; |
233 if (key.ReadValue(L"Order", NULL, &blob_length, NULL) == ERROR_SUCCESS) { | 237 if (key.ReadValue(L"Order", NULL, &blob_length, NULL) == ERROR_SUCCESS) { |
234 std::vector<uint8> blob(blob_length); | 238 std::vector<uint8_t> blob(blob_length); |
235 if (blob_length > 0 && | 239 if (blob_length > 0 && |
236 key.ReadValue(L"Order", reinterpret_cast<DWORD*>(&blob[0]), | 240 key.ReadValue(L"Order", reinterpret_cast<DWORD*>(&blob[0]), |
237 &blob_length, NULL) == ERROR_SUCCESS) { | 241 &blob_length, NULL) == ERROR_SUCCESS) { |
238 if (!ParseFavoritesOrderBlob(importer, blob, path, sort_index)) | 242 if (!ParseFavoritesOrderBlob(importer, blob, path, sort_index)) |
239 return false; | 243 return false; |
240 } | 244 } |
241 } | 245 } |
242 | 246 |
243 // Recursively parse subfolders. | 247 // Recursively parse subfolders. |
244 for (base::win::RegistryKeyIterator child(key.Handle(), L""); | 248 for (base::win::RegistryKeyIterator child(key.Handle(), L""); |
245 child.Valid() && !importer->cancelled(); | 249 child.Valid() && !importer->cancelled(); |
246 ++child) { | 250 ++child) { |
247 base::win::RegKey subkey(key.Handle(), child.Name(), KEY_READ); | 251 base::win::RegKey subkey(key.Handle(), child.Name(), KEY_READ); |
248 if (subkey.Valid()) { | 252 if (subkey.Valid()) { |
249 base::FilePath subpath(path.Append(child.Name())); | 253 base::FilePath subpath(path.Append(child.Name())); |
250 if (!ParseFavoritesOrderRegistryTree(importer, subkey, subpath, | 254 if (!ParseFavoritesOrderRegistryTree(importer, subkey, subpath, |
251 sort_index)) { | 255 sort_index)) { |
252 return false; | 256 return false; |
253 } | 257 } |
254 } | 258 } |
255 } | 259 } |
256 return true; | 260 return true; |
257 } | 261 } |
258 | 262 |
259 bool ParseFavoritesOrderInfo(const Importer* importer, | 263 bool ParseFavoritesOrderInfo(const Importer* importer, |
260 std::map<base::FilePath, uint32>* sort_index) | 264 std::map<base::FilePath, uint32_t>* sort_index) |
261 WARN_UNUSED_RESULT; | 265 WARN_UNUSED_RESULT; |
262 bool ParseFavoritesOrderInfo(const Importer* importer, | 266 bool ParseFavoritesOrderInfo(const Importer* importer, |
263 std::map<base::FilePath, uint32>* sort_index) { | 267 std::map<base::FilePath, uint32_t>* sort_index) { |
264 base::string16 key_path(importer::GetIEFavoritesOrderKey()); | 268 base::string16 key_path(importer::GetIEFavoritesOrderKey()); |
265 base::win::RegKey key(HKEY_CURRENT_USER, key_path.c_str(), KEY_READ); | 269 base::win::RegKey key(HKEY_CURRENT_USER, key_path.c_str(), KEY_READ); |
266 if (!key.Valid()) | 270 if (!key.Valid()) |
267 return false; | 271 return false; |
268 return ParseFavoritesOrderRegistryTree(importer, key, base::FilePath(), | 272 return ParseFavoritesOrderRegistryTree(importer, key, base::FilePath(), |
269 sort_index); | 273 sort_index); |
270 } | 274 } |
271 | 275 |
272 // Reads the sort order from registry. If failed, we don't touch the list | 276 // Reads the sort order from registry. If failed, we don't touch the list |
273 // and use the default (alphabetical) order. | 277 // and use the default (alphabetical) order. |
274 void SortBookmarksInIEOrder( | 278 void SortBookmarksInIEOrder( |
275 const Importer* importer, | 279 const Importer* importer, |
276 std::vector<ImportedBookmarkEntry>* bookmarks) { | 280 std::vector<ImportedBookmarkEntry>* bookmarks) { |
277 std::map<base::FilePath, uint32> sort_index; | 281 std::map<base::FilePath, uint32_t> sort_index; |
278 if (!ParseFavoritesOrderInfo(importer, &sort_index)) | 282 if (!ParseFavoritesOrderInfo(importer, &sort_index)) |
279 return; | 283 return; |
280 IEOrderBookmarkComparator compare = {&sort_index}; | 284 IEOrderBookmarkComparator compare = {&sort_index}; |
281 std::sort(bookmarks->begin(), bookmarks->end(), compare); | 285 std::sort(bookmarks->begin(), bookmarks->end(), compare); |
282 } | 286 } |
283 | 287 |
284 // Reads an internet shortcut (*.url) |file| and returns a COM object | 288 // Reads an internet shortcut (*.url) |file| and returns a COM object |
285 // representing it. | 289 // representing it. |
286 bool LoadInternetShortcut( | 290 bool LoadInternetShortcut( |
287 const base::string16& file, | 291 const base::string16& file, |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 }; | 421 }; |
418 // {A79029D6-753E-4e27-B807-3D46AB1545DF} | 422 // {A79029D6-753E-4e27-B807-3D46AB1545DF} |
419 const GUID IEImporter::kUnittestGUID = { | 423 const GUID IEImporter::kUnittestGUID = { |
420 0xa79029d6, 0x753e, 0x4e27, | 424 0xa79029d6, 0x753e, 0x4e27, |
421 { 0xb8, 0x7, 0x3d, 0x46, 0xab, 0x15, 0x45, 0xdf } | 425 { 0xb8, 0x7, 0x3d, 0x46, 0xab, 0x15, 0x45, 0xdf } |
422 }; | 426 }; |
423 | 427 |
424 IEImporter::IEImporter() : edge_import_mode_(false) {} | 428 IEImporter::IEImporter() : edge_import_mode_(false) {} |
425 | 429 |
426 void IEImporter::StartImport(const importer::SourceProfile& source_profile, | 430 void IEImporter::StartImport(const importer::SourceProfile& source_profile, |
427 uint16 items, | 431 uint16_t items, |
428 ImporterBridge* bridge) { | 432 ImporterBridge* bridge) { |
429 edge_import_mode_ = source_profile.importer_type == importer::TYPE_EDGE; | 433 edge_import_mode_ = source_profile.importer_type == importer::TYPE_EDGE; |
430 bridge_ = bridge; | 434 bridge_ = bridge; |
431 | 435 |
432 if (edge_import_mode_) { | 436 if (edge_import_mode_) { |
433 // When using for Edge imports we only support Favorites. | 437 // When using for Edge imports we only support Favorites. |
434 DCHECK_EQ(items, importer::FAVORITES); | 438 DCHECK_EQ(items, importer::FAVORITES); |
435 // As coming from untrusted source ensure items is correct. | 439 // As coming from untrusted source ensure items is correct. |
436 items = importer::FAVORITES; | 440 items = importer::FAVORITES; |
437 } | 441 } |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
914 static int version = -1; | 918 static int version = -1; |
915 if (version < 0) { | 919 if (version < 0) { |
916 wchar_t buffer[128]; | 920 wchar_t buffer[128]; |
917 DWORD buffer_length = sizeof(buffer); | 921 DWORD buffer_length = sizeof(buffer); |
918 base::win::RegKey reg_key(HKEY_LOCAL_MACHINE, kIEVersionKey, KEY_READ); | 922 base::win::RegKey reg_key(HKEY_LOCAL_MACHINE, kIEVersionKey, KEY_READ); |
919 LONG result = reg_key.ReadValue(L"Version", buffer, &buffer_length, NULL); | 923 LONG result = reg_key.ReadValue(L"Version", buffer, &buffer_length, NULL); |
920 version = ((result == ERROR_SUCCESS)? _wtoi(buffer) : 0); | 924 version = ((result == ERROR_SUCCESS)? _wtoi(buffer) : 0); |
921 } | 925 } |
922 return version; | 926 return version; |
923 } | 927 } |
OLD | NEW |