| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/character_encoding.h" | 5 #include "chrome/browser/character_encoding.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 { IDC_ENCODING_UTF8, L"UTF-8", IDS_ENCODING_UNICODE }, | 33 { IDC_ENCODING_UTF8, L"UTF-8", IDS_ENCODING_UNICODE }, |
| 34 { IDC_ENCODING_UTF16LE, L"UTF-16LE", IDS_ENCODING_UNICODE }, | 34 { IDC_ENCODING_UTF16LE, L"UTF-16LE", IDS_ENCODING_UNICODE }, |
| 35 { IDC_ENCODING_ISO88591, L"ISO-8859-1", IDS_ENCODING_WESTERN }, | 35 { IDC_ENCODING_ISO88591, L"ISO-8859-1", IDS_ENCODING_WESTERN }, |
| 36 { IDC_ENCODING_WINDOWS1252, L"windows-1252", IDS_ENCODING_WESTERN }, | 36 { IDC_ENCODING_WINDOWS1252, L"windows-1252", IDS_ENCODING_WESTERN }, |
| 37 { IDC_ENCODING_GBK, L"GBK", IDS_ENCODING_SIMP_CHINESE }, | 37 { IDC_ENCODING_GBK, L"GBK", IDS_ENCODING_SIMP_CHINESE }, |
| 38 { IDC_ENCODING_GB18030, L"gb18030", IDS_ENCODING_SIMP_CHINESE }, | 38 { IDC_ENCODING_GB18030, L"gb18030", IDS_ENCODING_SIMP_CHINESE }, |
| 39 { IDC_ENCODING_BIG5, L"Big5", IDS_ENCODING_TRAD_CHINESE }, | 39 { IDC_ENCODING_BIG5, L"Big5", IDS_ENCODING_TRAD_CHINESE }, |
| 40 { IDC_ENCODING_BIG5HKSCS, L"Big5-HKSCS", IDS_ENCODING_TRAD_CHINESE }, | 40 { IDC_ENCODING_BIG5HKSCS, L"Big5-HKSCS", IDS_ENCODING_TRAD_CHINESE }, |
| 41 { IDC_ENCODING_KOREAN, L"windows-949", IDS_ENCODING_KOREAN }, | 41 { IDC_ENCODING_KOREAN, L"windows-949", IDS_ENCODING_KOREAN }, |
| 42 { IDC_ENCODING_SHIFTJIS, L"Shift_JIS", IDS_ENCODING_JAPANESE }, | 42 { IDC_ENCODING_SHIFTJIS, L"Shift_JIS", IDS_ENCODING_JAPANESE }, |
| 43 { IDC_ENCODING_EUCJP, L"EUC-JP", IDS_ENCODING_JAPANESE }, |
| 43 { IDC_ENCODING_ISO2022JP, L"ISO-2022-JP", IDS_ENCODING_JAPANESE }, | 44 { IDC_ENCODING_ISO2022JP, L"ISO-2022-JP", IDS_ENCODING_JAPANESE }, |
| 44 { IDC_ENCODING_EUCJP, L"EUC-JP", IDS_ENCODING_JAPANESE }, | |
| 45 { IDC_ENCODING_THAI, L"windows-874", IDS_ENCODING_THAI }, | 45 { IDC_ENCODING_THAI, L"windows-874", IDS_ENCODING_THAI }, |
| 46 { IDC_ENCODING_ISO885915, L"ISO-8859-15", IDS_ENCODING_WESTERN }, | 46 { IDC_ENCODING_ISO885915, L"ISO-8859-15", IDS_ENCODING_WESTERN }, |
| 47 { IDC_ENCODING_MACINTOSH, L"macintosh", IDS_ENCODING_WESTERN }, | 47 { IDC_ENCODING_MACINTOSH, L"macintosh", IDS_ENCODING_WESTERN }, |
| 48 { IDC_ENCODING_ISO88592, L"ISO-8859-2", IDS_ENCODING_CENTRAL_EUROPEAN }, | 48 { IDC_ENCODING_ISO88592, L"ISO-8859-2", IDS_ENCODING_CENTRAL_EUROPEAN }, |
| 49 { IDC_ENCODING_WINDOWS1250, L"windows-1250", IDS_ENCODING_CENTRAL_EUROPEAN }, | 49 { IDC_ENCODING_WINDOWS1250, L"windows-1250", IDS_ENCODING_CENTRAL_EUROPEAN }, |
| 50 { IDC_ENCODING_ISO88595, L"ISO-8859-5", IDS_ENCODING_CYRILLIC }, | 50 { IDC_ENCODING_ISO88595, L"ISO-8859-5", IDS_ENCODING_CYRILLIC }, |
| 51 { IDC_ENCODING_WINDOWS1251, L"windows-1251", IDS_ENCODING_CYRILLIC }, | 51 { IDC_ENCODING_WINDOWS1251, L"windows-1251", IDS_ENCODING_CYRILLIC }, |
| 52 { IDC_ENCODING_KOI8R, L"KOI8-R", IDS_ENCODING_CYRILLIC }, | 52 { IDC_ENCODING_KOI8R, L"KOI8-R", IDS_ENCODING_CYRILLIC }, |
| 53 { IDC_ENCODING_KOI8U, L"KOI8-U", IDS_ENCODING_CYRILLIC }, | 53 { IDC_ENCODING_KOI8U, L"KOI8-U", IDS_ENCODING_CYRILLIC }, |
| 54 { IDC_ENCODING_ISO88597, L"ISO-8859-7", IDS_ENCODING_GREEK }, | 54 { IDC_ENCODING_ISO88597, L"ISO-8859-7", IDS_ENCODING_GREEK }, |
| 55 { IDC_ENCODING_WINDOWS1253, L"windows-1253", IDS_ENCODING_GREEK }, | 55 { IDC_ENCODING_WINDOWS1253, L"windows-1253", IDS_ENCODING_GREEK }, |
| 56 { IDC_ENCODING_WINDOWS1254, L"windows-1254", IDS_ENCODING_TURKISH }, | 56 { IDC_ENCODING_WINDOWS1254, L"windows-1254", IDS_ENCODING_TURKISH }, |
| 57 { IDC_ENCODING_ISO88596, L"ISO-8859-6", IDS_ENCODING_ARABIC }, | 57 { IDC_ENCODING_ISO88596, L"ISO-8859-6", IDS_ENCODING_ARABIC }, |
| 58 { IDC_ENCODING_WINDOWS1256, L"windows-1256", IDS_ENCODING_ARABIC }, | 58 { IDC_ENCODING_WINDOWS1256, L"windows-1256", IDS_ENCODING_ARABIC }, |
| 59 { IDC_ENCODING_ISO88598, L"ISO-8859-8", IDS_ENCODING_HEBREW }, | 59 { IDC_ENCODING_ISO88598, L"ISO-8859-8", IDS_ENCODING_HEBREW }, |
| 60 { IDC_ENCODING_WINDOWS1255, L"windows-1255", IDS_ENCODING_HEBREW }, | 60 { IDC_ENCODING_WINDOWS1255, L"windows-1255", IDS_ENCODING_HEBREW }, |
| 61 { IDC_ENCODING_WINDOWS1258, L"windows-1258", IDS_ENCODING_VIETNAMESE }, | 61 { IDC_ENCODING_WINDOWS1258, L"windows-1258", IDS_ENCODING_VIETNAMESE }, |
| 62 { IDC_ENCODING_ISO88594, L"ISO-8859-4", IDS_ENCODING_BALTIC }, | 62 { IDC_ENCODING_ISO88594, L"ISO-8859-4", IDS_ENCODING_BALTIC }, |
| 63 { IDC_ENCODING_ISO885913, L"ISO-8859-13", IDS_ENCODING_BALTIC }, | 63 { IDC_ENCODING_ISO885913, L"ISO-8859-13", IDS_ENCODING_BALTIC }, |
| 64 { IDC_ENCODING_WINDOWS1257, L"windows-1257", IDS_ENCODING_BALTIC }, | 64 { IDC_ENCODING_WINDOWS1257, L"windows-1257", IDS_ENCODING_BALTIC }, |
| 65 { IDC_ENCODING_ISO88593, L"ISO-8859-3", IDS_ENCODING_SOUTH_EUROPEAN }, | 65 { IDC_ENCODING_ISO88593, L"ISO-8859-3", IDS_ENCODING_SOUTH_EUROPEAN }, |
| 66 { IDC_ENCODING_ISO885910, L"ISO-8859-10", IDS_ENCODING_NORDIC }, | 66 { IDC_ENCODING_ISO885910, L"ISO-8859-10", IDS_ENCODING_NORDIC }, |
| 67 { IDC_ENCODING_ISO885914, L"ISO-8859-14", IDS_ENCODING_CELTIC }, | 67 { IDC_ENCODING_ISO885914, L"ISO-8859-14", IDS_ENCODING_CELTIC }, |
| 68 { IDC_ENCODING_ISO885916, L"ISO-8859-16", IDS_ENCODING_ROMANIAN }, | 68 { IDC_ENCODING_ISO885916, L"ISO-8859-16", IDS_ENCODING_ROMANIAN }, |
| 69 }; | 69 }; |
| 70 | 70 |
| 71 static const int canonical_encoding_names_length = | 71 static const int canonical_encoding_names_length = |
| 72 arraysize(canonical_encoding_names); | 72 arraysize(canonical_encoding_names); |
| 73 | 73 |
| 74 typedef std::map<int, std::pair<const wchar_t*, int> > IdToCanonicalEncodingName
MapType; | 74 typedef std::map<int, std::pair<const wchar_t*, int> > |
| 75 IdToCanonicalEncodingNameMapType; |
| 75 typedef std::map<const std::wstring, int> CanonicalEncodingNameToIdMapType; | 76 typedef std::map<const std::wstring, int> CanonicalEncodingNameToIdMapType; |
| 76 | 77 |
| 77 class CanonicalEncodingMap { | 78 class CanonicalEncodingMap { |
| 78 public: | 79 public: |
| 79 CanonicalEncodingMap() | 80 CanonicalEncodingMap() |
| 80 : id_to_encoding_name_map_(NULL), | 81 : id_to_encoding_name_map_(NULL), |
| 81 encoding_name_to_id_map_(NULL) { } | 82 encoding_name_to_id_map_(NULL) { } |
| 82 const IdToCanonicalEncodingNameMapType* GetIdToCanonicalEncodingNameMapData(); | 83 const IdToCanonicalEncodingNameMapType* GetIdToCanonicalEncodingNameMapData(); |
| 83 const CanonicalEncodingNameToIdMapType* GetCanonicalEncodingNameToIdMapData(); | 84 const CanonicalEncodingNameToIdMapType* GetCanonicalEncodingNameToIdMapData(); |
| 84 std::vector<int>* const locale_dependent_encoding_ids() { | 85 std::vector<int>* const locale_dependent_encoding_ids() { |
| 85 return &locale_dependent_encoding_ids_; | 86 return &locale_dependent_encoding_ids_; |
| 86 } | 87 } |
| 87 | 88 |
| 88 std::vector<int>* const current_display_encoding_ids() { | 89 std::vector<CharacterEncoding::EncodingInfo>* const current_display_encodings(
) { |
| 89 return ¤t_display_encoding_ids_; | 90 return ¤t_display_encodings_; |
| 90 } | 91 } |
| 91 | 92 |
| 92 private: | 93 private: |
| 93 scoped_ptr<IdToCanonicalEncodingNameMapType> id_to_encoding_name_map_; | 94 scoped_ptr<IdToCanonicalEncodingNameMapType> id_to_encoding_name_map_; |
| 94 scoped_ptr<CanonicalEncodingNameToIdMapType> encoding_name_to_id_map_; | 95 scoped_ptr<CanonicalEncodingNameToIdMapType> encoding_name_to_id_map_; |
| 95 std::vector<int> locale_dependent_encoding_ids_; | 96 std::vector<int> locale_dependent_encoding_ids_; |
| 96 std::vector<int> current_display_encoding_ids_; | 97 std::vector<CharacterEncoding::EncodingInfo> current_display_encodings_; |
| 97 | 98 |
| 98 DISALLOW_EVIL_CONSTRUCTORS(CanonicalEncodingMap); | 99 DISALLOW_EVIL_CONSTRUCTORS(CanonicalEncodingMap); |
| 99 }; | 100 }; |
| 100 | 101 |
| 101 const IdToCanonicalEncodingNameMapType* CanonicalEncodingMap::GetIdToCanonicalEn
codingNameMapData() { | 102 const IdToCanonicalEncodingNameMapType* CanonicalEncodingMap::GetIdToCanonicalEn
codingNameMapData() { |
| 102 // Testing and building map is not thread safe, this function is supposed to | 103 // Testing and building map is not thread safe, this function is supposed to |
| 103 // only run in UI thread. Myabe I should add a lock in here for making it as | 104 // only run in UI thread. Myabe I should add a lock in here for making it as |
| 104 // thread safe. | 105 // thread safe. |
| 105 if (!id_to_encoding_name_map_.get()) { | 106 if (!id_to_encoding_name_map_.get()) { |
| 106 id_to_encoding_name_map_.reset(new IdToCanonicalEncodingNameMapType); | 107 id_to_encoding_name_map_.reset(new IdToCanonicalEncodingNameMapType); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 124 } | 125 } |
| 125 return encoding_name_to_id_map_.get(); | 126 return encoding_name_to_id_map_.get(); |
| 126 } | 127 } |
| 127 | 128 |
| 128 // A static map object which contains all resourceid-nonsequenced canonical | 129 // A static map object which contains all resourceid-nonsequenced canonical |
| 129 // encoding names. | 130 // encoding names. |
| 130 static CanonicalEncodingMap canonical_encoding_name_map_singleton; | 131 static CanonicalEncodingMap canonical_encoding_name_map_singleton; |
| 131 | 132 |
| 132 const int default_encoding_menus[] = { | 133 const int default_encoding_menus[] = { |
| 133 IDC_ENCODING_UTF16LE, | 134 IDC_ENCODING_UTF16LE, |
| 134 0, | |
| 135 IDC_ENCODING_ISO88591, | 135 IDC_ENCODING_ISO88591, |
| 136 IDC_ENCODING_WINDOWS1252, | 136 IDC_ENCODING_WINDOWS1252, |
| 137 0, | |
| 138 IDC_ENCODING_GBK, | 137 IDC_ENCODING_GBK, |
| 139 IDC_ENCODING_GB18030, | 138 IDC_ENCODING_GB18030, |
| 140 IDC_ENCODING_BIG5, | 139 IDC_ENCODING_BIG5, |
| 141 IDC_ENCODING_BIG5HKSCS, | 140 IDC_ENCODING_BIG5HKSCS, |
| 142 0, | |
| 143 IDC_ENCODING_KOREAN, | 141 IDC_ENCODING_KOREAN, |
| 144 0, | |
| 145 IDC_ENCODING_SHIFTJIS, | 142 IDC_ENCODING_SHIFTJIS, |
| 143 IDC_ENCODING_EUCJP, |
| 146 IDC_ENCODING_ISO2022JP, | 144 IDC_ENCODING_ISO2022JP, |
| 147 IDC_ENCODING_EUCJP, | |
| 148 0, | |
| 149 IDC_ENCODING_THAI, | 145 IDC_ENCODING_THAI, |
| 150 0, | |
| 151 IDC_ENCODING_ISO885915, | 146 IDC_ENCODING_ISO885915, |
| 152 IDC_ENCODING_MACINTOSH, | 147 IDC_ENCODING_MACINTOSH, |
| 153 IDC_ENCODING_ISO88592, | 148 IDC_ENCODING_ISO88592, |
| 154 IDC_ENCODING_WINDOWS1250, | 149 IDC_ENCODING_WINDOWS1250, |
| 155 0, | |
| 156 IDC_ENCODING_ISO88595, | 150 IDC_ENCODING_ISO88595, |
| 157 IDC_ENCODING_WINDOWS1251, | 151 IDC_ENCODING_WINDOWS1251, |
| 158 IDC_ENCODING_KOI8R, | 152 IDC_ENCODING_KOI8R, |
| 159 IDC_ENCODING_KOI8U, | 153 IDC_ENCODING_KOI8U, |
| 160 0, | |
| 161 IDC_ENCODING_ISO88597, | 154 IDC_ENCODING_ISO88597, |
| 162 IDC_ENCODING_WINDOWS1253, | 155 IDC_ENCODING_WINDOWS1253, |
| 163 IDC_ENCODING_WINDOWS1254, | 156 IDC_ENCODING_WINDOWS1254, |
| 164 IDC_ENCODING_ISO88596, | 157 IDC_ENCODING_ISO88596, |
| 165 IDC_ENCODING_WINDOWS1256, | 158 IDC_ENCODING_WINDOWS1256, |
| 166 IDC_ENCODING_ISO88598, | 159 IDC_ENCODING_ISO88598, |
| 167 IDC_ENCODING_WINDOWS1255, | 160 IDC_ENCODING_WINDOWS1255, |
| 168 IDC_ENCODING_WINDOWS1258, | 161 IDC_ENCODING_WINDOWS1258, |
| 169 | |
| 170 IDC_ENCODING_ISO88594, | 162 IDC_ENCODING_ISO88594, |
| 171 IDC_ENCODING_ISO885913, | 163 IDC_ENCODING_ISO885913, |
| 172 IDC_ENCODING_WINDOWS1257, | 164 IDC_ENCODING_WINDOWS1257, |
| 173 IDC_ENCODING_ISO88593, | 165 IDC_ENCODING_ISO88593, |
| 174 IDC_ENCODING_ISO885910, | 166 IDC_ENCODING_ISO885910, |
| 175 IDC_ENCODING_ISO885914, | 167 IDC_ENCODING_ISO885914, |
| 176 IDC_ENCODING_ISO885916, | 168 IDC_ENCODING_ISO885916, |
| 177 }; | 169 }; |
| 178 | 170 |
| 179 const int default_encoding_menus_length = arraysize(default_encoding_menus); | 171 const int default_encoding_menus_length = arraysize(default_encoding_menus); |
| 180 | 172 |
| 181 // Parse the input |encoding_list| which is a encoding list separated with | 173 // Parse the input |encoding_list| which is a encoding list separated with |
| 182 // comma, get available encoding ids and save them to |available_list|. | 174 // comma, get available encoding ids and save them to |available_list|. |
| 183 // The parameter |maximum_size| indicates maximum size of encoding items we | 175 // The parameter |maximum_size| indicates maximum size of encoding items we |
| 184 // want to get from the |encoding_list|. | 176 // want to get from the |encoding_list|. |
| 185 static void ParseEncodingListSeparatedWithComma( | 177 void ParseEncodingListSeparatedWithComma( |
| 186 const std::wstring& encoding_list, std::vector<int>* const available_list, | 178 const std::wstring& encoding_list, std::vector<int>* const available_list, |
| 187 size_t maximum_size) { | 179 size_t maximum_size) { |
| 188 WStringTokenizer tokenizer(encoding_list, L","); | 180 WStringTokenizer tokenizer(encoding_list, L","); |
| 189 while (tokenizer.GetNext()) { | 181 while (tokenizer.GetNext()) { |
| 190 int id = CharacterEncoding::GetCommandIdByCanonicalEncodingName( | 182 int id = CharacterEncoding::GetCommandIdByCanonicalEncodingName( |
| 191 tokenizer.token()); | 183 tokenizer.token()); |
| 192 // Ignore invalid encoding. | 184 // Ignore invalid encoding. |
| 193 if (!id) | 185 if (!id) |
| 194 continue; | 186 continue; |
| 195 available_list->push_back(id); | 187 available_list->push_back(id); |
| 196 if (available_list->size() == maximum_size) | 188 if (available_list->size() == maximum_size) |
| 197 return; | 189 return; |
| 198 } | 190 } |
| 199 } | 191 } |
| 200 | 192 |
| 201 std::wstring GetEncodingDisplayName(std::wstring encoding_name, | 193 std::wstring GetEncodingDisplayName(std::wstring encoding_name, |
| 202 int category_string_id) { | 194 int category_string_id) { |
| 203 std::wstring category_name = l10n_util::GetString(category_string_id); | 195 std::wstring category_name = l10n_util::GetString(category_string_id); |
| 204 if (category_string_id != IDS_ENCODING_KOREAN && | 196 if (category_string_id != IDS_ENCODING_KOREAN && |
| 205 category_string_id != IDS_ENCODING_THAI && | 197 category_string_id != IDS_ENCODING_THAI && |
| 206 category_string_id != IDS_ENCODING_TURKISH) { | 198 category_string_id != IDS_ENCODING_TURKISH) { |
| 207 return l10n_util::GetStringF(IDS_ENCODING_DISPLAY_TEMPLATE, | 199 return l10n_util::GetStringF(IDS_ENCODING_DISPLAY_TEMPLATE, |
| 208 category_name, | 200 category_name, |
| 209 encoding_name); | 201 encoding_name); |
| 210 } | 202 } |
| 211 return category_name; | 203 return category_name; |
| 212 } | 204 } |
| 213 | 205 |
| 206 int GetEncodingCategoryStringIdByCommandId(int id) { |
| 207 const IdToCanonicalEncodingNameMapType* map = |
| 208 canonical_encoding_name_map_singleton. |
| 209 GetIdToCanonicalEncodingNameMapData(); |
| 210 DCHECK(map); |
| 211 |
| 212 IdToCanonicalEncodingNameMapType::const_iterator found_name = map->find(id); |
| 213 if (found_name != map->end()) |
| 214 return found_name->second.second; |
| 215 return 0; |
| 216 } |
| 217 |
| 218 std::wstring GetEncodingCategoryStringByCommandId(int id) { |
| 219 int category_id = GetEncodingCategoryStringIdByCommandId(id); |
| 220 if (category_id) |
| 221 return l10n_util::GetString(category_id); |
| 222 return std::wstring(); |
| 223 } |
| 224 |
| 214 } // namespace | 225 } // namespace |
| 215 | 226 |
| 227 CharacterEncoding::EncodingInfo::EncodingInfo(int id) |
| 228 : encoding_id(id) { |
| 229 encoding_category_name = GetEncodingCategoryStringByCommandId(id), |
| 230 encoding_display_name = GetCanonicalEncodingDisplayNameByCommandId(id); |
| 231 } |
| 232 |
| 216 // Static. | 233 // Static. |
| 217 int CharacterEncoding::GetCommandIdByCanonicalEncodingName( | 234 int CharacterEncoding::GetCommandIdByCanonicalEncodingName( |
| 218 const std::wstring& encoding_name) { | 235 const std::wstring& encoding_name) { |
| 219 const CanonicalEncodingNameToIdMapType* map = | 236 const CanonicalEncodingNameToIdMapType* map = |
| 220 canonical_encoding_name_map_singleton. | 237 canonical_encoding_name_map_singleton. |
| 221 GetCanonicalEncodingNameToIdMapData(); | 238 GetCanonicalEncodingNameToIdMapData(); |
| 222 DCHECK(map); | 239 DCHECK(map); |
| 223 | 240 |
| 224 CanonicalEncodingNameToIdMapType::const_iterator found_id = | 241 CanonicalEncodingNameToIdMapType::const_iterator found_id = |
| 225 map->find(encoding_name); | 242 map->find(encoding_name); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 return ASCIIToWide(canonical_name); | 324 return ASCIIToWide(canonical_name); |
| 308 else | 325 else |
| 309 return std::wstring(); | 326 return std::wstring(); |
| 310 } | 327 } |
| 311 | 328 |
| 312 // Static | 329 // Static |
| 313 // According to the behavior of user recently selected encoding short list in | 330 // According to the behavior of user recently selected encoding short list in |
| 314 // FireFox, we always put UTF-8 as toppest position, after then put user | 331 // FireFox, we always put UTF-8 as toppest position, after then put user |
| 315 // recently selected encodings, then put local dependent encoding items. | 332 // recently selected encodings, then put local dependent encoding items. |
| 316 // At last, we put all rest encoding items. | 333 // At last, we put all rest encoding items. |
| 317 const std::vector<int>* CharacterEncoding::GetCurrentDisplayEncodings( | 334 const std::vector<CharacterEncoding::EncodingInfo>* CharacterEncoding::GetCurren
tDisplayEncodings( |
| 335 const std::wstring& locale, |
| 318 const std::wstring& locale_encodings, | 336 const std::wstring& locale_encodings, |
| 319 const std::wstring& recently_select_encodings) { | 337 const std::wstring& recently_select_encodings) { |
| 320 std::vector<int>* const locale_dependent_encoding_list = | 338 std::vector<int>* const locale_dependent_encoding_list = |
| 321 canonical_encoding_name_map_singleton.locale_dependent_encoding_ids(); | 339 canonical_encoding_name_map_singleton.locale_dependent_encoding_ids(); |
| 322 std::vector<int>* const encoding_list = | 340 std::vector<CharacterEncoding::EncodingInfo>* const encoding_list = |
| 323 canonical_encoding_name_map_singleton.current_display_encoding_ids(); | 341 canonical_encoding_name_map_singleton.current_display_encodings(); |
| 324 | 342 |
| 325 // Initialize locale dependent static encoding list. | 343 // Initialize locale dependent static encoding list. |
| 326 if (locale_dependent_encoding_list->empty() && !locale_encodings.empty()) | 344 if (locale_dependent_encoding_list->empty() && !locale_encodings.empty()) |
| 327 ParseEncodingListSeparatedWithComma(locale_encodings, | 345 ParseEncodingListSeparatedWithComma(locale_encodings, |
| 328 locale_dependent_encoding_list, | 346 locale_dependent_encoding_list, |
| 329 kUserSelectedEncodingsMaxLength); | 347 kUserSelectedEncodingsMaxLength); |
| 330 | 348 |
| 331 static std::wstring cached_user_selected_encodings; | 349 static std::wstring cached_user_selected_encodings; |
| 332 // Build current display encoding list. | 350 // Build current display encoding list. |
| 333 if (encoding_list->empty() || | 351 if (encoding_list->empty() || |
| 334 cached_user_selected_encodings != recently_select_encodings) { | 352 cached_user_selected_encodings != recently_select_encodings) { |
| 335 // Update user recently selected encodings. | 353 // Update user recently selected encodings. |
| 336 cached_user_selected_encodings = recently_select_encodings; | 354 cached_user_selected_encodings = recently_select_encodings; |
| 337 // Clear old encoding list since user recently selected encodings changed. | 355 // Clear old encoding list since user recently selected encodings changed. |
| 338 encoding_list->clear(); | 356 encoding_list->clear(); |
| 339 // Always add UTF-8 to first encoding position. | 357 // Always add UTF-8 to first encoding position. |
| 340 encoding_list->push_back(IDC_ENCODING_UTF8); | 358 encoding_list->push_back(EncodingInfo(IDC_ENCODING_UTF8)); |
| 341 std::set<int> inserted_encoding; | 359 std::set<int> inserted_encoding; |
| 342 inserted_encoding.insert(IDC_ENCODING_UTF8); | 360 inserted_encoding.insert(IDC_ENCODING_UTF8); |
| 343 | 361 |
| 344 // Parse user recently selected encodings and get list | 362 // Parse user recently selected encodings and get list |
| 345 std::vector<int> recently_select_encoding_list; | 363 std::vector<int> recently_select_encoding_list; |
| 346 ParseEncodingListSeparatedWithComma(recently_select_encodings, | 364 ParseEncodingListSeparatedWithComma(recently_select_encodings, |
| 347 &recently_select_encoding_list, | 365 &recently_select_encoding_list, |
| 348 kUserSelectedEncodingsMaxLength); | 366 kUserSelectedEncodingsMaxLength); |
| 349 | 367 |
| 350 // Put 'cached encodings' (dynamic encoding list) after 'local dependent | 368 // Put 'cached encodings' (dynamic encoding list) after 'local dependent |
| 351 // encoding list'. | 369 // encoding list'. |
| 352 recently_select_encoding_list.insert(recently_select_encoding_list.begin(), | 370 recently_select_encoding_list.insert(recently_select_encoding_list.begin(), |
| 353 locale_dependent_encoding_list->begin(), | 371 locale_dependent_encoding_list->begin(), |
| 354 locale_dependent_encoding_list->end()); | 372 locale_dependent_encoding_list->end()); |
| 355 std::vector<int>::const_iterator it; | 373 for (std::vector<int>::iterator it = recently_select_encoding_list.begin(); |
| 356 for (it = recently_select_encoding_list.begin(); | |
| 357 it != recently_select_encoding_list.end(); ++it) { | 374 it != recently_select_encoding_list.end(); ++it) { |
| 358 // Test whether we have met this encoding id. | 375 // Test whether we have met this encoding id. |
| 359 bool ok = inserted_encoding.insert(*it).second; | 376 bool ok = inserted_encoding.insert(*it).second; |
| 360 // Duplicated encoding, ignore it. Ideally, this situation should not | 377 // Duplicated encoding, ignore it. Ideally, this situation should not |
| 361 // happened, but just in case some one manually edit preference file. | 378 // happened, but just in case some one manually edit preference file. |
| 362 if (!ok) | 379 if (!ok) |
| 363 continue; | 380 continue; |
| 364 encoding_list->push_back(*it); | 381 encoding_list->push_back(EncodingInfo(*it)); |
| 365 } | 382 } |
| 366 // Append a separator; | 383 // Append a separator; |
| 367 encoding_list->push_back(0); | 384 encoding_list->push_back(EncodingInfo(0)); |
| 368 | 385 |
| 369 // Add those encodings which are in default_encoding_menus and does not | 386 // We need to keep "Unicode (UTF-16LE)" always at the top (among the rest |
| 370 // override with locale-dependent encodings list. | 387 // of encodings) instead of being sorted along with other encodings. So if |
| 371 bool previous_is_separator = true; | 388 // "Unicode (UTF-16LE)" is already in previous encodings, sort the rest |
| 389 // of encodings. Otherwise Put "Unicode (UTF-16LE)" on the first of the |
| 390 // rest of encodings, skip "Unicode (UTF-16LE)" and sort all left encodings. |
| 391 int start_sorted_index = encoding_list->size(); |
| 392 if (inserted_encoding.find(IDC_ENCODING_UTF16LE) == |
| 393 inserted_encoding.end()) { |
| 394 encoding_list->push_back(EncodingInfo(IDC_ENCODING_UTF16LE)); |
| 395 inserted_encoding.insert(IDC_ENCODING_UTF16LE); |
| 396 start_sorted_index++; |
| 397 } |
| 398 |
| 399 // Add the rest of encodings that are neither in the static encoding list |
| 400 // nor in the list of recently selected encodings. |
| 401 // Build the encoding list sorted in the current locale sorting order. |
| 372 for (int i = 0; i < default_encoding_menus_length; ++i) { | 402 for (int i = 0; i < default_encoding_menus_length; ++i) { |
| 373 int id = default_encoding_menus[i]; | 403 int id = default_encoding_menus[i]; |
| 374 if (id) { | 404 // We have inserted this encoding, skip it. |
| 375 // We have inserted this encoding, skip it. | 405 if (inserted_encoding.find(id) != inserted_encoding.end()) |
| 376 if (inserted_encoding.find(id) != inserted_encoding.end()) | 406 continue; |
| 377 continue; | 407 encoding_list->push_back(EncodingInfo(id)); |
| 378 encoding_list->push_back(id); | |
| 379 previous_is_separator = false; | |
| 380 } else if (!previous_is_separator) { | |
| 381 encoding_list->push_back(0); | |
| 382 previous_is_separator = true; | |
| 383 } | |
| 384 } | 408 } |
| 409 // Sort the encoding list. |
| 410 l10n_util::SortVectorWithStringKey(locale, |
| 411 encoding_list, |
| 412 start_sorted_index, |
| 413 encoding_list->size(), |
| 414 true); |
| 385 } | 415 } |
| 386 DCHECK(!encoding_list->empty()); | 416 DCHECK(!encoding_list->empty()); |
| 387 return encoding_list; | 417 return encoding_list; |
| 388 } | 418 } |
| 389 | 419 |
| 390 // Static | 420 // Static |
| 391 bool CharacterEncoding::UpdateRecentlySelectdEncoding( | 421 bool CharacterEncoding::UpdateRecentlySelectdEncoding( |
| 392 const std::wstring& original_selected_encodings, | 422 const std::wstring& original_selected_encodings, |
| 393 int new_selected_encoding_id, | 423 int new_selected_encoding_id, |
| 394 std::wstring* selected_encodings) { | 424 std::wstring* selected_encodings) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 424 // Insert new encoding to head of selected encoding list. | 454 // Insert new encoding to head of selected encoding list. |
| 425 *selected_encodings = encoding_name; | 455 *selected_encodings = encoding_name; |
| 426 // Generate the string for rest selected encoding list. | 456 // Generate the string for rest selected encoding list. |
| 427 for (std::vector<int>::const_iterator it = selected_encoding_list.begin(); | 457 for (std::vector<int>::const_iterator it = selected_encoding_list.begin(); |
| 428 it != selected_encoding_list.end(); ++it) { | 458 it != selected_encoding_list.end(); ++it) { |
| 429 selected_encodings->append(1, L','); | 459 selected_encodings->append(1, L','); |
| 430 selected_encodings->append(GetCanonicalEncodingNameByCommandId(*it)); | 460 selected_encodings->append(GetCanonicalEncodingNameByCommandId(*it)); |
| 431 } | 461 } |
| 432 return true; | 462 return true; |
| 433 } | 463 } |
| OLD | NEW |