Index: chrome/browser/character_encoding.cc |
diff --git a/chrome/browser/character_encoding.cc b/chrome/browser/character_encoding.cc |
index b7c9f6fdd38818eb27dc2d3dadb4d8af12d18bc5..2d4b059550a434f4eec2ee958a9d3ec7d9c882c4 100644 |
--- a/chrome/browser/character_encoding.cc |
+++ b/chrome/browser/character_encoding.cc |
@@ -4,384 +4,57 @@ |
#include "chrome/browser/character_encoding.h" |
-#include <stddef.h> |
- |
-#include <map> |
-#include <memory> |
-#include <set> |
- |
-#include "base/logging.h" |
#include "base/macros.h" |
-#include "base/strings/string_tokenizer.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "chrome/app/chrome_command_ids.h" |
-#include "chrome/grit/generated_resources.h" |
-#include "content/public/browser/browser_thread.h" |
#include "third_party/icu/source/common/unicode/ucnv.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/l10n/l10n_util_collator.h" |
- |
-using content::BrowserThread; |
namespace { |
-// The maximum length of short list of recently user selected encodings is 3. |
-const size_t kUserSelectedEncodingsMaxLength = 3; |
- |
-typedef struct { |
- int resource_id; |
- const char* name; |
- int category_string_id; |
-} CanonicalEncodingData; |
- |
// An array of all supported canonical encoding names. |
-const CanonicalEncodingData kCanonicalEncodingNames[] = { |
- { IDC_ENCODING_UTF8, "UTF-8", IDS_ENCODING_UNICODE }, |
- { IDC_ENCODING_UTF16LE, "UTF-16LE", IDS_ENCODING_UNICODE }, |
- { IDC_ENCODING_WINDOWS1252, "windows-1252", IDS_ENCODING_WESTERN }, |
- { IDC_ENCODING_GBK, "GBK", IDS_ENCODING_SIMP_CHINESE }, |
- { IDC_ENCODING_GB18030, "gb18030", IDS_ENCODING_SIMP_CHINESE }, |
- { IDC_ENCODING_BIG5, "Big5", IDS_ENCODING_TRAD_CHINESE }, |
- { IDC_ENCODING_KOREAN, "EUC-KR", IDS_ENCODING_KOREAN }, |
- { IDC_ENCODING_SHIFTJIS, "Shift_JIS", IDS_ENCODING_JAPANESE }, |
- { IDC_ENCODING_EUCJP, "EUC-JP", IDS_ENCODING_JAPANESE }, |
- { IDC_ENCODING_ISO2022JP, "ISO-2022-JP", IDS_ENCODING_JAPANESE }, |
- { IDC_ENCODING_THAI, "windows-874", IDS_ENCODING_THAI }, |
- { IDC_ENCODING_ISO885915, "ISO-8859-15", IDS_ENCODING_WESTERN }, |
- { IDC_ENCODING_MACINTOSH, "macintosh", IDS_ENCODING_WESTERN }, |
- { IDC_ENCODING_ISO88592, "ISO-8859-2", IDS_ENCODING_CENTRAL_EUROPEAN }, |
- { IDC_ENCODING_WINDOWS1250, "windows-1250", IDS_ENCODING_CENTRAL_EUROPEAN }, |
- { IDC_ENCODING_ISO88595, "ISO-8859-5", IDS_ENCODING_CYRILLIC }, |
- { IDC_ENCODING_WINDOWS1251, "windows-1251", IDS_ENCODING_CYRILLIC }, |
- { IDC_ENCODING_KOI8R, "KOI8-R", IDS_ENCODING_CYRILLIC }, |
- { IDC_ENCODING_KOI8U, "KOI8-U", IDS_ENCODING_CYRILLIC }, |
- { IDC_ENCODING_IBM866, "IBM866", IDS_ENCODING_CYRILLIC }, |
- { IDC_ENCODING_ISO88597, "ISO-8859-7", IDS_ENCODING_GREEK }, |
- { IDC_ENCODING_WINDOWS1253, "windows-1253", IDS_ENCODING_GREEK }, |
- { IDC_ENCODING_WINDOWS1254, "windows-1254", IDS_ENCODING_TURKISH }, |
- { IDC_ENCODING_WINDOWS1256, "windows-1256", IDS_ENCODING_ARABIC }, |
- { IDC_ENCODING_ISO88596, "ISO-8859-6", IDS_ENCODING_ARABIC }, |
- { IDC_ENCODING_WINDOWS1255, "windows-1255", IDS_ENCODING_HEBREW }, |
- { IDC_ENCODING_ISO88598I, "ISO-8859-8-I", IDS_ENCODING_HEBREW }, |
- { IDC_ENCODING_ISO88598, "ISO-8859-8", IDS_ENCODING_HEBREW }, |
- { IDC_ENCODING_WINDOWS1258, "windows-1258", IDS_ENCODING_VIETNAMESE }, |
- { IDC_ENCODING_ISO88594, "ISO-8859-4", IDS_ENCODING_BALTIC }, |
- { IDC_ENCODING_ISO885913, "ISO-8859-13", IDS_ENCODING_BALTIC }, |
- { IDC_ENCODING_WINDOWS1257, "windows-1257", IDS_ENCODING_BALTIC }, |
- { IDC_ENCODING_ISO88593, "ISO-8859-3", IDS_ENCODING_SOUTH_EUROPEAN }, |
- { IDC_ENCODING_ISO885910, "ISO-8859-10", IDS_ENCODING_NORDIC }, |
- { IDC_ENCODING_ISO885914, "ISO-8859-14", IDS_ENCODING_CELTIC }, |
- { IDC_ENCODING_ISO885916, "ISO-8859-16", IDS_ENCODING_ROMANIAN }, |
+const char* const kCanonicalEncodingNames[] = { |
+ "Big5", |
+ "EUC-JP", |
+ "EUC-KR", |
+ "gb18030", |
+ "GBK", |
+ "IBM866", |
+ "ISO-2022-JP", |
+ "ISO-8859-10", |
+ "ISO-8859-13", |
+ "ISO-8859-14", |
+ "ISO-8859-15", |
+ "ISO-8859-16", |
+ "ISO-8859-2", |
+ "ISO-8859-3", |
+ "ISO-8859-4", |
+ "ISO-8859-5", |
+ "ISO-8859-6", |
+ "ISO-8859-7", |
+ "ISO-8859-8", |
+ "ISO-8859-8-I", |
+ "KOI8-R", |
+ "KOI8-U", |
+ "macintosh", |
+ "Shift_JIS", |
+ "UTF-16LE", |
+ "UTF-8", |
+ "windows-1250", |
+ "windows-1251", |
+ "windows-1252", |
+ "windows-1253", |
+ "windows-1254", |
+ "windows-1255", |
+ "windows-1256", |
+ "windows-1257", |
+ "windows-1258", |
+ "windows-874" |
}; |
+} // namespace |
-const int kCanonicalEncodingNamesLength = arraysize(kCanonicalEncodingNames); |
- |
-typedef std::map<int, std::pair<const char*, int> > |
- IdToCanonicalEncodingNameMapType; |
-typedef std::map<const std::string, int> CanonicalEncodingNameToIdMapType; |
- |
-typedef struct { |
- const char* canonical_form; |
- const char* display_form; |
-} CanonicalEncodingDisplayNamePair; |
- |
-const CanonicalEncodingDisplayNamePair kCanonicalDisplayNameOverrides[] = { |
- // Only lists the canonical names where we want a different form for display. |
- { "macintosh", "Macintosh" }, |
- { "windows-874", "Windows-874" }, |
- { "windows-1250", "Windows-1250" }, |
- { "windows-1251", "Windows-1251" }, |
- { "windows-1252", "Windows-1252" }, |
- { "windows-1253", "Windows-1253" }, |
- { "windows-1254", "Windows-1254" }, |
- { "windows-1255", "Windows-1255" }, |
- { "windows-1256", "Windows-1256" }, |
- { "windows-1257", "Windows-1257" }, |
- { "windows-1258", "Windows-1258" }, |
-}; |
- |
-const int kCanonicalDisplayNameOverridesLength = |
- arraysize(kCanonicalDisplayNameOverrides); |
- |
-typedef std::map<std::string, const char*> CanonicalNameDisplayNameMapType; |
- |
-class CanonicalEncodingMap { |
- public: |
- CanonicalEncodingMap() {} |
- const IdToCanonicalEncodingNameMapType* GetIdToCanonicalEncodingNameMapData(); |
- const CanonicalEncodingNameToIdMapType* GetCanonicalEncodingNameToIdMapData(); |
- const CanonicalNameDisplayNameMapType* GetCanonicalNameDisplayNameMapData(); |
- std::vector<int>* locale_dependent_encoding_ids() { |
- return &locale_dependent_encoding_ids_; |
- } |
- |
- std::vector<CharacterEncoding::EncodingInfo>* current_display_encodings() { |
- return ¤t_display_encodings_; |
- } |
- |
- private: |
- std::unique_ptr<IdToCanonicalEncodingNameMapType> id_to_encoding_name_map_; |
- std::unique_ptr<CanonicalEncodingNameToIdMapType> encoding_name_to_id_map_; |
- std::unique_ptr<CanonicalNameDisplayNameMapType> |
- encoding_name_to_display_name_map_; |
- std::vector<int> locale_dependent_encoding_ids_; |
- std::vector<CharacterEncoding::EncodingInfo> current_display_encodings_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CanonicalEncodingMap); |
-}; |
- |
-const IdToCanonicalEncodingNameMapType* |
- CanonicalEncodingMap::GetIdToCanonicalEncodingNameMapData() { |
- // Testing and building map is not thread safe, this function is supposed to |
- // only run in UI thread. Myabe I should add a lock in here for making it as |
- // thread safe. |
- if (!id_to_encoding_name_map_.get()) { |
- id_to_encoding_name_map_.reset(new IdToCanonicalEncodingNameMapType); |
- for (int i = 0; i < kCanonicalEncodingNamesLength; ++i) { |
- int resource_id = kCanonicalEncodingNames[i].resource_id; |
- (*id_to_encoding_name_map_)[resource_id] = |
- std::make_pair(kCanonicalEncodingNames[i].name, |
- kCanonicalEncodingNames[i].category_string_id); |
- } |
+std::string GetCanonicalEncodingNameByAliasName(const std::string& alias_name) { |
+ for (size_t i = 0; i < arraysize(kCanonicalEncodingNames); ++i) { |
+ if (alias_name == kCanonicalEncodingNames[i]) |
+ return alias_name; |
} |
- return id_to_encoding_name_map_.get(); |
-} |
- |
-const CanonicalEncodingNameToIdMapType* |
- CanonicalEncodingMap::GetCanonicalEncodingNameToIdMapData() { |
- if (!encoding_name_to_id_map_.get()) { |
- encoding_name_to_id_map_.reset(new CanonicalEncodingNameToIdMapType); |
- for (int i = 0; i < kCanonicalEncodingNamesLength; ++i) { |
- (*encoding_name_to_id_map_)[kCanonicalEncodingNames[i].name] = |
- kCanonicalEncodingNames[i].resource_id; |
- } |
- } |
- return encoding_name_to_id_map_.get(); |
-} |
- |
-const CanonicalNameDisplayNameMapType* |
- CanonicalEncodingMap::GetCanonicalNameDisplayNameMapData() { |
- if (!encoding_name_to_display_name_map_.get()) { |
- encoding_name_to_display_name_map_.reset( |
- new CanonicalNameDisplayNameMapType); |
- // First store the names in the kCanonicalEncodingNames list. |
- for (int i = 0; i < kCanonicalEncodingNamesLength; ++i) { |
- (*encoding_name_to_display_name_map_)[kCanonicalEncodingNames[i].name] = |
- kCanonicalEncodingNames[i].name; |
- } |
- // Then save in the overrides. |
- for (int i = 0; i < kCanonicalDisplayNameOverridesLength; ++i) { |
- (*encoding_name_to_display_name_map_) |
- [kCanonicalDisplayNameOverrides[i].canonical_form] = |
- kCanonicalDisplayNameOverrides[i].display_form; |
- } |
- DCHECK(static_cast<int>(encoding_name_to_display_name_map_->size()) == |
- kCanonicalEncodingNamesLength) |
- << "Got an override that wasn't in the encoding list"; |
- } |
- return encoding_name_to_display_name_map_.get(); |
-} |
- |
-// A static map object which contains all resourceid-nonsequenced canonical |
-// encoding names. |
-CanonicalEncodingMap* CanonicalEncodingMapSingleton() { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- static CanonicalEncodingMap* singleton = new CanonicalEncodingMap; |
- return singleton; |
-} |
- |
-const int kDefaultEncodingMenus[] = { |
- IDC_ENCODING_UTF16LE, |
- IDC_ENCODING_WINDOWS1252, |
- IDC_ENCODING_GBK, |
- IDC_ENCODING_GB18030, |
- IDC_ENCODING_BIG5, |
- IDC_ENCODING_KOREAN, |
- IDC_ENCODING_SHIFTJIS, |
- IDC_ENCODING_EUCJP, |
- IDC_ENCODING_ISO2022JP, |
- IDC_ENCODING_THAI, |
- IDC_ENCODING_ISO885915, |
- IDC_ENCODING_MACINTOSH, |
- IDC_ENCODING_ISO88592, |
- IDC_ENCODING_WINDOWS1250, |
- IDC_ENCODING_ISO88595, |
- IDC_ENCODING_WINDOWS1251, |
- IDC_ENCODING_KOI8R, |
- IDC_ENCODING_KOI8U, |
- IDC_ENCODING_IBM866, |
- IDC_ENCODING_ISO88597, |
- IDC_ENCODING_WINDOWS1253, |
- IDC_ENCODING_WINDOWS1254, |
- IDC_ENCODING_WINDOWS1256, |
- IDC_ENCODING_ISO88596, |
- IDC_ENCODING_WINDOWS1255, |
- IDC_ENCODING_ISO88598I, |
- IDC_ENCODING_ISO88598, |
- IDC_ENCODING_WINDOWS1258, |
- IDC_ENCODING_ISO88594, |
- IDC_ENCODING_ISO885913, |
- IDC_ENCODING_WINDOWS1257, |
- IDC_ENCODING_ISO88593, |
- IDC_ENCODING_ISO885910, |
- IDC_ENCODING_ISO885914, |
- IDC_ENCODING_ISO885916, |
-}; |
- |
-const int kDefaultEncodingMenusLength = arraysize(kDefaultEncodingMenus); |
- |
-// Parse the input |encoding_list| which is a encoding list separated with |
-// 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|. |
-void ParseEncodingListSeparatedWithComma( |
- const std::string& encoding_list, std::vector<int>* const available_list, |
- size_t maximum_size) { |
- base::StringTokenizer tokenizer(encoding_list, ","); |
- while (tokenizer.GetNext()) { |
- int id = CharacterEncoding::GetCommandIdByCanonicalEncodingName( |
- tokenizer.token()); |
- // Ignore invalid encoding. |
- if (!id) |
- continue; |
- available_list->push_back(id); |
- if (available_list->size() == maximum_size) |
- return; |
- } |
-} |
- |
-base::string16 GetEncodingDisplayName(const std::string& encoding_name, |
- int category_string_id) { |
- base::string16 category_name = l10n_util::GetStringUTF16(category_string_id); |
- if (category_string_id != IDS_ENCODING_KOREAN && |
- category_string_id != IDS_ENCODING_THAI && |
- category_string_id != IDS_ENCODING_TURKISH && |
- category_string_id != IDS_ENCODING_VIETNAMESE && |
- category_string_id != IDS_ENCODING_ROMANIAN) { |
- const CanonicalNameDisplayNameMapType* map = |
- CanonicalEncodingMapSingleton()->GetCanonicalNameDisplayNameMapData(); |
- DCHECK(map); |
- |
- CanonicalNameDisplayNameMapType::const_iterator found_name = |
- map->find(encoding_name); |
- DCHECK(found_name != map->end()); |
- return l10n_util::GetStringFUTF16(IDS_ENCODING_DISPLAY_TEMPLATE, |
- category_name, |
- base::ASCIIToUTF16(found_name->second)); |
- } |
- return category_name; |
-} |
- |
-int GetEncodingCategoryStringIdByCommandId(int id) { |
- const IdToCanonicalEncodingNameMapType* map = |
- CanonicalEncodingMapSingleton()->GetIdToCanonicalEncodingNameMapData(); |
- DCHECK(map); |
- |
- IdToCanonicalEncodingNameMapType::const_iterator found_name = map->find(id); |
- if (found_name != map->end()) |
- return found_name->second.second; |
- return 0; |
-} |
- |
-std::string GetEncodingCategoryStringByCommandId(int id) { |
- int category_id = GetEncodingCategoryStringIdByCommandId(id); |
- if (category_id) |
- return l10n_util::GetStringUTF8(category_id); |
- return std::string(); |
-} |
- |
-} // namespace |
- |
-CharacterEncoding::EncodingInfo::EncodingInfo(int id) |
- : encoding_id(id) { |
- encoding_category_name = |
- base::UTF8ToUTF16(GetEncodingCategoryStringByCommandId(id)); |
- encoding_display_name = GetCanonicalEncodingDisplayNameByCommandId(id); |
-} |
- |
-// Static. |
-int CharacterEncoding::GetCommandIdByCanonicalEncodingName( |
- const std::string& encoding_name) { |
- const CanonicalEncodingNameToIdMapType* map = |
- CanonicalEncodingMapSingleton()->GetCanonicalEncodingNameToIdMapData(); |
- DCHECK(map); |
- |
- CanonicalEncodingNameToIdMapType::const_iterator found_id = |
- map->find(encoding_name); |
- if (found_id != map->end()) |
- return found_id->second; |
- return 0; |
-} |
- |
-// Static. |
-std::string CharacterEncoding::GetCanonicalEncodingNameByCommandId(int id) { |
- const IdToCanonicalEncodingNameMapType* map = |
- CanonicalEncodingMapSingleton()->GetIdToCanonicalEncodingNameMapData(); |
- DCHECK(map); |
- |
- IdToCanonicalEncodingNameMapType::const_iterator found_name = map->find(id); |
- if (found_name != map->end()) |
- return found_name->second.first; |
- return std::string(); |
-} |
- |
-// Static. |
-base::string16 CharacterEncoding::GetCanonicalEncodingDisplayNameByCommandId( |
- int id) { |
- const IdToCanonicalEncodingNameMapType* map = |
- CanonicalEncodingMapSingleton()->GetIdToCanonicalEncodingNameMapData(); |
- DCHECK(map); |
- |
- IdToCanonicalEncodingNameMapType::const_iterator found_name = map->find(id); |
- if (found_name != map->end()) |
- return GetEncodingDisplayName(found_name->second.first, |
- found_name->second.second); |
- return base::string16(); |
-} |
- |
-// Static. |
-// Return count number of all supported canonical encoding. |
-int CharacterEncoding::GetSupportCanonicalEncodingCount() { |
- return kCanonicalEncodingNamesLength; |
-} |
- |
-// Static. |
-std::string CharacterEncoding::GetCanonicalEncodingNameByIndex(int index) { |
- if (index < kCanonicalEncodingNamesLength) |
- return kCanonicalEncodingNames[index].name; |
- return std::string(); |
-} |
- |
-// Static. |
-base::string16 CharacterEncoding::GetCanonicalEncodingDisplayNameByIndex( |
- int index) { |
- if (index < kCanonicalEncodingNamesLength) |
- return GetEncodingDisplayName(kCanonicalEncodingNames[index].name, |
- kCanonicalEncodingNames[index].category_string_id); |
- return base::string16(); |
-} |
- |
-// Static. |
-int CharacterEncoding::GetEncodingCommandIdByIndex(int index) { |
- if (index < kCanonicalEncodingNamesLength) |
- return kCanonicalEncodingNames[index].resource_id; |
- return 0; |
-} |
- |
-// Static. |
-std::string CharacterEncoding::GetCanonicalEncodingNameByAliasName( |
- const std::string& alias_name) { |
- // If the input alias_name is already canonical encoding name, just return it. |
- const CanonicalEncodingNameToIdMapType* map = |
- CanonicalEncodingMapSingleton()->GetCanonicalEncodingNameToIdMapData(); |
- DCHECK(map); |
- |
- CanonicalEncodingNameToIdMapType::const_iterator found_id = |
- map->find(alias_name); |
- if (found_id != map->end()) |
- return alias_name; |
- |
const char* standards[3] = { "HTML", "MIME", "IANA" }; |
for (size_t i = 0; i < arraysize(standards); ++i) { |
UErrorCode error_code = U_ZERO_ERROR; |
@@ -392,140 +65,3 @@ std::string CharacterEncoding::GetCanonicalEncodingNameByAliasName( |
} |
return std::string(); |
} |
- |
-// Static |
-// According to the behavior of user recently selected encoding short list in |
-// Firefox, we always put UTF-8 as top position, after then put user |
-// recent selected encodings, then put local dependent encoding items. |
-// At last, we put all remaining encoding items. |
-const std::vector<CharacterEncoding::EncodingInfo>* |
- CharacterEncoding::GetCurrentDisplayEncodings( |
- const std::string& locale, |
- const std::string& locale_encodings, |
- const std::string& recently_select_encodings) { |
- std::vector<int>* const locale_dependent_encoding_list = |
- CanonicalEncodingMapSingleton()->locale_dependent_encoding_ids(); |
- std::vector<CharacterEncoding::EncodingInfo>* const encoding_list = |
- CanonicalEncodingMapSingleton()->current_display_encodings(); |
- |
- // Initialize locale dependent static encoding list. |
- if (locale_dependent_encoding_list->empty() && !locale_encodings.empty()) |
- ParseEncodingListSeparatedWithComma(locale_encodings, |
- locale_dependent_encoding_list, |
- kUserSelectedEncodingsMaxLength); |
- |
- CR_DEFINE_STATIC_LOCAL(std::string, cached_user_selected_encodings, ()); |
- // Build current display encoding list. |
- if (encoding_list->empty() || |
- cached_user_selected_encodings != recently_select_encodings) { |
- // Update user recently selected encodings. |
- cached_user_selected_encodings = recently_select_encodings; |
- // 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(EncodingInfo(IDC_ENCODING_UTF8)); |
- std::set<int> inserted_encoding; |
- inserted_encoding.insert(IDC_ENCODING_UTF8); |
- |
- // Parse user recently selected encodings and get list |
- std::vector<int> recently_select_encoding_list; |
- ParseEncodingListSeparatedWithComma(recently_select_encodings, |
- &recently_select_encoding_list, |
- kUserSelectedEncodingsMaxLength); |
- |
- // Put 'cached encodings' (dynamic encoding list) after 'local dependent |
- // encoding list'. |
- recently_select_encoding_list.insert(recently_select_encoding_list.begin(), |
- locale_dependent_encoding_list->begin(), |
- locale_dependent_encoding_list->end()); |
- 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; |
- // Duplicated encoding, ignore it. Ideally, this situation should not |
- // happened, but just in case some one manually edit preference file. |
- if (!ok) |
- continue; |
- encoding_list->push_back(EncodingInfo(*it)); |
- } |
- // Append a separator; |
- encoding_list->push_back(EncodingInfo(0)); |
- |
- // 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 < kDefaultEncodingMenusLength; ++i) { |
- int id = kDefaultEncodingMenus[i]; |
- // 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; |
-} |
- |
-// Static |
-bool CharacterEncoding::UpdateRecentlySelectedEncoding( |
- const std::string& original_selected_encodings, |
- int new_selected_encoding_id, |
- std::string* selected_encodings) { |
- // Get encoding name. |
- std::string encoding_name = |
- GetCanonicalEncodingNameByCommandId(new_selected_encoding_id); |
- DCHECK(!encoding_name.empty()); |
- // Check whether the new encoding is in local dependent encodings or original |
- // recently selected encodings. If yes, do not add it. |
- std::vector<int>* locale_dependent_encoding_list = |
- CanonicalEncodingMapSingleton()->locale_dependent_encoding_ids(); |
- DCHECK(locale_dependent_encoding_list); |
- std::vector<int> selected_encoding_list; |
- ParseEncodingListSeparatedWithComma(original_selected_encodings, |
- &selected_encoding_list, |
- kUserSelectedEncodingsMaxLength); |
- // Put 'cached encodings' (dynamic encoding list) after 'local dependent |
- // encoding list' for check. |
- std::vector<int> top_encoding_list(*locale_dependent_encoding_list); |
- // UTF8 is always in our optimized encoding list. |
- top_encoding_list.insert(top_encoding_list.begin(), IDC_ENCODING_UTF8); |
- top_encoding_list.insert(top_encoding_list.end(), |
- selected_encoding_list.begin(), |
- selected_encoding_list.end()); |
- for (std::vector<int>::const_iterator it = top_encoding_list.begin(); |
- it != top_encoding_list.end(); ++it) |
- if (*it == new_selected_encoding_id) |
- return false; |
- // Need to add the encoding id to recently selected encoding list. |
- // Remove the last encoding in original list. |
- if (selected_encoding_list.size() == kUserSelectedEncodingsMaxLength) |
- selected_encoding_list.pop_back(); |
- // Insert new encoding to head of selected encoding list. |
- *selected_encodings = encoding_name; |
- // Generate the string for rest selected encoding list. |
- for (std::vector<int>::const_iterator it = selected_encoding_list.begin(); |
- it != selected_encoding_list.end(); ++it) { |
- selected_encodings->append(1, L','); |
- selected_encodings->append(GetCanonicalEncodingNameByCommandId(*it)); |
- } |
- return true; |
-} |