Index: chrome/browser/character_encoding.cc |
=================================================================== |
--- chrome/browser/character_encoding.cc (revision 10076) |
+++ chrome/browser/character_encoding.cc (working copy) |
@@ -40,8 +40,8 @@ |
{ IDC_ENCODING_BIG5HKSCS, L"Big5-HKSCS", IDS_ENCODING_TRAD_CHINESE }, |
{ IDC_ENCODING_KOREAN, L"windows-949", IDS_ENCODING_KOREAN }, |
{ IDC_ENCODING_SHIFTJIS, L"Shift_JIS", IDS_ENCODING_JAPANESE }, |
+ { IDC_ENCODING_EUCJP, L"EUC-JP", IDS_ENCODING_JAPANESE }, |
{ IDC_ENCODING_ISO2022JP, L"ISO-2022-JP", IDS_ENCODING_JAPANESE }, |
- { IDC_ENCODING_EUCJP, L"EUC-JP", IDS_ENCODING_JAPANESE }, |
{ IDC_ENCODING_THAI, L"windows-874", IDS_ENCODING_THAI }, |
{ IDC_ENCODING_ISO885915, L"ISO-8859-15", IDS_ENCODING_WESTERN }, |
{ IDC_ENCODING_MACINTOSH, L"macintosh", IDS_ENCODING_WESTERN }, |
@@ -71,7 +71,8 @@ |
static const int canonical_encoding_names_length = |
arraysize(canonical_encoding_names); |
-typedef std::map<int, std::pair<const wchar_t*, int> > IdToCanonicalEncodingNameMapType; |
+typedef std::map<int, std::pair<const wchar_t*, int> > |
+ IdToCanonicalEncodingNameMapType; |
typedef std::map<const std::wstring, int> CanonicalEncodingNameToIdMapType; |
class CanonicalEncodingMap { |
@@ -85,15 +86,15 @@ |
return &locale_dependent_encoding_ids_; |
} |
- std::vector<int>* const current_display_encoding_ids() { |
- return ¤t_display_encoding_ids_; |
+ std::vector<CharacterEncoding::EncodingInfo>* const current_display_encodings() { |
+ return ¤t_display_encodings_; |
} |
private: |
scoped_ptr<IdToCanonicalEncodingNameMapType> id_to_encoding_name_map_; |
scoped_ptr<CanonicalEncodingNameToIdMapType> encoding_name_to_id_map_; |
std::vector<int> locale_dependent_encoding_ids_; |
- std::vector<int> current_display_encoding_ids_; |
+ std::vector<CharacterEncoding::EncodingInfo> current_display_encodings_; |
DISALLOW_EVIL_CONSTRUCTORS(CanonicalEncodingMap); |
}; |
@@ -131,33 +132,25 @@ |
const int default_encoding_menus[] = { |
IDC_ENCODING_UTF16LE, |
- 0, |
IDC_ENCODING_ISO88591, |
IDC_ENCODING_WINDOWS1252, |
- 0, |
IDC_ENCODING_GBK, |
IDC_ENCODING_GB18030, |
IDC_ENCODING_BIG5, |
IDC_ENCODING_BIG5HKSCS, |
- 0, |
IDC_ENCODING_KOREAN, |
- 0, |
IDC_ENCODING_SHIFTJIS, |
+ IDC_ENCODING_EUCJP, |
IDC_ENCODING_ISO2022JP, |
- IDC_ENCODING_EUCJP, |
- 0, |
IDC_ENCODING_THAI, |
- 0, |
IDC_ENCODING_ISO885915, |
IDC_ENCODING_MACINTOSH, |
IDC_ENCODING_ISO88592, |
IDC_ENCODING_WINDOWS1250, |
- 0, |
IDC_ENCODING_ISO88595, |
IDC_ENCODING_WINDOWS1251, |
IDC_ENCODING_KOI8R, |
IDC_ENCODING_KOI8U, |
- 0, |
IDC_ENCODING_ISO88597, |
IDC_ENCODING_WINDOWS1253, |
IDC_ENCODING_WINDOWS1254, |
@@ -166,7 +159,6 @@ |
IDC_ENCODING_ISO88598, |
IDC_ENCODING_WINDOWS1255, |
IDC_ENCODING_WINDOWS1258, |
- |
IDC_ENCODING_ISO88594, |
IDC_ENCODING_ISO885913, |
IDC_ENCODING_WINDOWS1257, |
@@ -182,7 +174,7 @@ |
// comma, get available encoding ids and save them to |available_list|. |
// The parameter |maximum_size| indicates maximum size of encoding items we |
// want to get from the |encoding_list|. |
-static void ParseEncodingListSeparatedWithComma( |
+void ParseEncodingListSeparatedWithComma( |
const std::wstring& encoding_list, std::vector<int>* const available_list, |
size_t maximum_size) { |
WStringTokenizer tokenizer(encoding_list, L","); |
@@ -211,8 +203,33 @@ |
return category_name; |
} |
+int GetEncodingCategoryStringIdByCommandId(int id) { |
+ const IdToCanonicalEncodingNameMapType* map = |
+ canonical_encoding_name_map_singleton. |
+ GetIdToCanonicalEncodingNameMapData(); |
+ DCHECK(map); |
+ |
+ IdToCanonicalEncodingNameMapType::const_iterator found_name = map->find(id); |
+ if (found_name != map->end()) |
+ return found_name->second.second; |
+ return 0; |
+} |
+ |
+std::wstring GetEncodingCategoryStringByCommandId(int id) { |
+ int category_id = GetEncodingCategoryStringIdByCommandId(id); |
+ if (category_id) |
+ return l10n_util::GetString(category_id); |
+ return std::wstring(); |
+} |
+ |
} // namespace |
+CharacterEncoding::EncodingInfo::EncodingInfo(int id) |
+ : encoding_id(id) { |
+ encoding_category_name = GetEncodingCategoryStringByCommandId(id), |
+ encoding_display_name = GetCanonicalEncodingDisplayNameByCommandId(id); |
+} |
+ |
// Static. |
int CharacterEncoding::GetCommandIdByCanonicalEncodingName( |
const std::wstring& encoding_name) { |
@@ -314,13 +331,14 @@ |
// FireFox, we always put UTF-8 as toppest position, after then put user |
// recently selected encodings, then put local dependent encoding items. |
// At last, we put all rest encoding items. |
-const std::vector<int>* CharacterEncoding::GetCurrentDisplayEncodings( |
+const std::vector<CharacterEncoding::EncodingInfo>* CharacterEncoding::GetCurrentDisplayEncodings( |
+ const std::wstring& locale, |
const std::wstring& locale_encodings, |
const std::wstring& recently_select_encodings) { |
std::vector<int>* const locale_dependent_encoding_list = |
canonical_encoding_name_map_singleton.locale_dependent_encoding_ids(); |
- std::vector<int>* const encoding_list = |
- canonical_encoding_name_map_singleton.current_display_encoding_ids(); |
+ std::vector<CharacterEncoding::EncodingInfo>* const encoding_list = |
+ canonical_encoding_name_map_singleton.current_display_encodings(); |
// Initialize locale dependent static encoding list. |
if (locale_dependent_encoding_list->empty() && !locale_encodings.empty()) |
@@ -337,7 +355,7 @@ |
// Clear old encoding list since user recently selected encodings changed. |
encoding_list->clear(); |
// Always add UTF-8 to first encoding position. |
- encoding_list->push_back(IDC_ENCODING_UTF8); |
+ encoding_list->push_back(EncodingInfo(IDC_ENCODING_UTF8)); |
std::set<int> inserted_encoding; |
inserted_encoding.insert(IDC_ENCODING_UTF8); |
@@ -352,8 +370,7 @@ |
recently_select_encoding_list.insert(recently_select_encoding_list.begin(), |
locale_dependent_encoding_list->begin(), |
locale_dependent_encoding_list->end()); |
- std::vector<int>::const_iterator it; |
- for (it = recently_select_encoding_list.begin(); |
+ for (std::vector<int>::iterator it = recently_select_encoding_list.begin(); |
it != recently_select_encoding_list.end(); ++it) { |
// Test whether we have met this encoding id. |
bool ok = inserted_encoding.insert(*it).second; |
@@ -361,27 +378,40 @@ |
// happened, but just in case some one manually edit preference file. |
if (!ok) |
continue; |
- encoding_list->push_back(*it); |
+ encoding_list->push_back(EncodingInfo(*it)); |
} |
// Append a separator; |
- encoding_list->push_back(0); |
+ encoding_list->push_back(EncodingInfo(0)); |
- // Add those encodings which are in default_encoding_menus and does not |
- // override with locale-dependent encodings list. |
- bool previous_is_separator = true; |
+ // We need to keep "Unicode (UTF-16LE)" always at the top (among the rest |
+ // of encodings) instead of being sorted along with other encodings. So if |
+ // "Unicode (UTF-16LE)" is already in previous encodings, sort the rest |
+ // of encodings. Otherwise Put "Unicode (UTF-16LE)" on the first of the |
+ // rest of encodings, skip "Unicode (UTF-16LE)" and sort all left encodings. |
+ int start_sorted_index = encoding_list->size(); |
+ if (inserted_encoding.find(IDC_ENCODING_UTF16LE) == |
+ inserted_encoding.end()) { |
+ encoding_list->push_back(EncodingInfo(IDC_ENCODING_UTF16LE)); |
+ inserted_encoding.insert(IDC_ENCODING_UTF16LE); |
+ start_sorted_index++; |
+ } |
+ |
+ // Add the rest of encodings that are neither in the static encoding list |
+ // nor in the list of recently selected encodings. |
+ // Build the encoding list sorted in the current locale sorting order. |
for (int i = 0; i < default_encoding_menus_length; ++i) { |
int id = default_encoding_menus[i]; |
- if (id) { |
- // We have inserted this encoding, skip it. |
- if (inserted_encoding.find(id) != inserted_encoding.end()) |
- continue; |
- encoding_list->push_back(id); |
- previous_is_separator = false; |
- } else if (!previous_is_separator) { |
- encoding_list->push_back(0); |
- previous_is_separator = true; |
- } |
+ // We have inserted this encoding, skip it. |
+ if (inserted_encoding.find(id) != inserted_encoding.end()) |
+ continue; |
+ encoding_list->push_back(EncodingInfo(id)); |
} |
+ // Sort the encoding list. |
+ l10n_util::SortVectorWithStringKey(locale, |
+ encoding_list, |
+ start_sorted_index, |
+ encoding_list->size(), |
+ true); |
} |
DCHECK(!encoding_list->empty()); |
return encoding_list; |