| Index: ui/base/resource/resource_bundle.cc | 
| diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc | 
| index 7e66615fa1b4f0490b78f17dfcd0c6c077f27776..372d3302e133c266429ea49ac449055a8ab4de87 100644 | 
| --- a/ui/base/resource/resource_bundle.cc | 
| +++ b/ui/base/resource/resource_bundle.cc | 
| @@ -211,9 +211,10 @@ void ResourceBundle::InitSharedInstanceWithPakFileRegion( | 
| base::File pak_file, | 
| const base::MemoryMappedFile::Region& region) { | 
| InitSharedInstance(NULL); | 
| -  std::unique_ptr<DataPack> data_pack(new DataPack(SCALE_FACTOR_100P)); | 
| +  auto data_pack = base::MakeUnique<DataPack>(SCALE_FACTOR_100P); | 
| if (!data_pack->LoadFromFileRegion(std::move(pak_file), region)) { | 
| -    NOTREACHED() << "failed to load pak file"; | 
| +    LOG(WARNING) << "failed to load pak file"; | 
| +    NOTREACHED(); | 
| return; | 
| } | 
| g_shared_instance_->locale_resources_data_ = std::move(data_pack); | 
| @@ -248,6 +249,18 @@ ResourceBundle& ResourceBundle::GetSharedInstance() { | 
| return *g_shared_instance_; | 
| } | 
|  | 
| +void ResourceBundle::LoadSecondaryLocaleDataWithPakFileRegion( | 
| +    base::File pak_file, | 
| +    const base::MemoryMappedFile::Region& region) { | 
| +  auto data_pack = base::MakeUnique<DataPack>(SCALE_FACTOR_100P); | 
| +  if (!data_pack->LoadFromFileRegion(std::move(pak_file), region)) { | 
| +    LOG(WARNING) << "failed to load secondary pak file"; | 
| +    NOTREACHED(); | 
| +    return; | 
| +  } | 
| +  secondary_locale_resources_data_ = std::move(data_pack); | 
| +} | 
| + | 
| #if !defined(OS_ANDROID) | 
| bool ResourceBundle::LocaleDataPakExists(const std::string& locale) { | 
| return !GetLocaleFilePath(locale, true).empty(); | 
| @@ -389,6 +402,7 @@ void ResourceBundle::LoadTestResources(const base::FilePath& path, | 
|  | 
| void ResourceBundle::UnloadLocaleResources() { | 
| locale_resources_data_.reset(); | 
| +  secondary_locale_resources_data_.reset(); | 
| } | 
|  | 
| void ResourceBundle::OverrideLocalePakForTest(const base::FilePath& pak_path) { | 
| @@ -551,20 +565,28 @@ base::string16 ResourceBundle::GetLocalizedString(int message_id) { | 
| } | 
|  | 
| base::StringPiece data; | 
| +  ResourceHandle::TextEncodingType encoding = | 
| +      locale_resources_data_->GetTextEncodingType(); | 
| if (!locale_resources_data_->GetStringPiece(static_cast<uint16_t>(message_id), | 
| &data)) { | 
| -    // Fall back on the main data pack (shouldn't be any strings here except in | 
| -    // unittests). | 
| -    data = GetRawDataResource(message_id); | 
| -    if (data.empty()) { | 
| -      NOTREACHED() << "unable to find resource: " << message_id; | 
| -      return base::string16(); | 
| +    if (secondary_locale_resources_data_.get() && | 
| +        secondary_locale_resources_data_->GetStringPiece( | 
| +            static_cast<uint16_t>(message_id), &data)) { | 
| +      // Fall back on the secondary locale pak if it exists. | 
| +      encoding = secondary_locale_resources_data_->GetTextEncodingType(); | 
| +    } else { | 
| +      // Fall back on the main data pack (shouldn't be any strings here except | 
| +      // in unittests). | 
| +      data = GetRawDataResource(message_id); | 
| +      if (data.empty()) { | 
| +        LOG(WARNING) << "unable to find resource: " << message_id; | 
| +        NOTREACHED(); | 
| +        return base::string16(); | 
| +      } | 
| } | 
| } | 
|  | 
| // Strings should not be loaded from a data pack that contains binary data. | 
| -  ResourceHandle::TextEncodingType encoding = | 
| -      locale_resources_data_->GetTextEncodingType(); | 
| DCHECK(encoding == ResourceHandle::UTF16 || encoding == ResourceHandle::UTF8) | 
| << "requested localized string from binary pack file"; | 
|  | 
| @@ -584,12 +606,20 @@ base::RefCountedMemory* ResourceBundle::LoadLocalizedResourceBytes( | 
| { | 
| base::AutoLock lock_scope(*locale_resources_data_lock_); | 
| base::StringPiece data; | 
| + | 
| if (locale_resources_data_.get() && | 
| locale_resources_data_->GetStringPiece( | 
| static_cast<uint16_t>(resource_id), &data) && | 
| !data.empty()) { | 
| return new base::RefCountedStaticMemory(data.data(), data.length()); | 
| } | 
| + | 
| +    if (secondary_locale_resources_data_.get() && | 
| +        secondary_locale_resources_data_->GetStringPiece( | 
| +            static_cast<uint16_t>(resource_id), &data) && | 
| +        !data.empty()) { | 
| +      return new base::RefCountedStaticMemory(data.data(), data.length()); | 
| +    } | 
| } | 
| // Release lock_scope and fall back to main data pack. | 
| return LoadDataResourceBytes(resource_id); | 
|  |