15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_BASE_RESOURCE_RESOURCE_BUNDLE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_BASE_RESOURCE_RESOURCE_BUNDLE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/containers/hash_tables.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/memory_mapped_file.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "build/build_config.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/gfx/font_list.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class File;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Lock;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RefCountedStaticMemory;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DataPack;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceHandle;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ResourceBundle is a central facility to load images and other resources,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// such as theme graphics. Every resource is loaded only once.
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT ResourceBundle {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An enumeration of the various font styles used throughout Chrome.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following holds true for the font sizes:
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Small <= SmallBold <= Base <= Bold <= Medium <= MediumBold <= Large.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum FontStyle {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // NOTE: depending upon the locale, using one of the *BoldFont below
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // may *not* actually result in a bold font.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SmallFont,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SmallBoldFont,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BaseFont,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BoldFont,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MediumFont,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MediumBoldFont,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LargeFont,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LargeBoldFont,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ImageRTL {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Images are flipped in RTL locales.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RTL_ENABLED,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Images are never flipped.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RTL_DISABLED,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  enum LoadResources {
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    LOAD_COMMON_RESOURCES,
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DO_NOT_LOAD_COMMON_RESOURCES
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  };
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delegate class that allows interception of pack file loading and resource
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requests. The methods of this class may be called on multiple threads.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Delegate {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called before a resource pack file is loaded. Return the full path for
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the pack file to continue loading or an empty value to cancel loading.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |pack_path| will contain the complete default path for the pack file if
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // known or just the pack file name otherwise.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual base::FilePath GetPathForResourcePack(
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const base::FilePath& pack_path,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScaleFactor scale_factor) = 0;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called before a locale pack file is loaded. Return the full path for
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the pack file to continue loading or an empty value to cancel loading.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |pack_path| will contain the complete default path for the pack file if
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // known or just the pack file name otherwise.
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual base::FilePath GetPathForLocalePack(
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const base::FilePath& pack_path,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::string& locale) = 0;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Return an image resource or an empty value to attempt retrieval of the
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // default resource.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual gfx::Image GetImageNamed(int resource_id) = 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Return an image resource or an empty value to attempt retrieval of the
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // default resource.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual gfx::Image GetNativeImageNamed(int resource_id, ImageRTL rtl) = 0;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Return a static memory resource or NULL to attempt retrieval of the
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // default resource.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual base::RefCountedStaticMemory* LoadDataResourceBytes(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int resource_id,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ScaleFactor scale_factor) = 0;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Retrieve a raw data resource. Return true if a resource was provided or
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // false to attempt retrieval of the default resource.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool GetRawDataResource(int resource_id,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ScaleFactor scale_factor,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    base::StringPiece* value) = 0;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Retrieve a localized string. Return true if a string was provided or
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // false to attempt retrieval of the default string.
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    virtual bool GetLocalizedString(int message_id, base::string16* value) = 0;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Returns a font or NULL to attempt retrieval of the default resource.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual scoped_ptr<gfx::Font> GetFont(FontStyle style) = 0;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Delegate() {}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the ResourceBundle for this process. Does not take ownership of
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the |delegate| value. Returns the language selected.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: Mac ignores this and always loads up resources for the language
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // defined by the Cocoa UI (i.e., NSBundle does the language work).
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sergeyu): This method also loads common resources (i.e. chrome.pak).
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is no way to specify which resource files are loaded, i.e. names of
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the files are hardcoded in ResourceBundle. Fix it to allow to specify which
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // files are loaded (e.g. add a new method in Delegate).
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // |load_resources| controls whether or not LoadCommonResources is called.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string InitSharedInstanceWithLocale(
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const std::string& pref_locale,
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      Delegate* delegate,
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      LoadResources load_resources);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Initialize the ResourceBundle using the given file region. If |region| is
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // MemoryMappedFile::Region::kWholeFile, the entire |pak_file| is used.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This allows the use of this function in a sandbox without local file
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // access (as on Android).
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void InitSharedInstanceWithPakFileRegion(
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::File pak_file,
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const base::MemoryMappedFile::Region& region);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the ResourceBundle using given data pack path for testing.
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void InitSharedInstanceWithPakPath(const base::FilePath& path);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete the ResourceBundle for this process if it exists.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CleanupSharedInstance();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true after the global resource loader instance has been created.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool HasSharedInstance();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the global resource loader instance.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ResourceBundle& GetSharedInstance();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the .pak for the given locale exists.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LocaleDataPakExists(const std::string& locale);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers additional data pack files with this ResourceBundle.  When
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // looking for a DataResource, we will search these files after searching the
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // main module. |path| should be the complete path to the pack file if known
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or just the pack file name otherwise (the delegate may optionally override
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this value). |scale_factor| is the scale of images in this resource pak
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // relative to the images in the 1x resource pak. This method is not thread
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // safe! You should call it immediately after calling InitSharedInstance.
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddDataPackFromPath(const base::FilePath& path,
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ScaleFactor scale_factor);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as above but using an already open file.
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void AddDataPackFromFile(base::File file, ScaleFactor scale_factor);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Same as above but using only a region (offset + size) of the file.
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void AddDataPackFromFileRegion(base::File file,
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 const base::MemoryMappedFile::Region& region,
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 ScaleFactor scale_factor);
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as AddDataPackFromPath but does not log an error if the pack fails to
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // load.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddOptionalDataPackFromPath(const base::FilePath& path,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   ScaleFactor scale_factor);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changes the locale for an already-initialized ResourceBundle, returning the
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // name of the newly-loaded locale.  Future calls to get strings will return
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the strings for this new locale.  This has no effect on existing or future
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // image resources.  |locale_resources_data_| is protected by a lock for the
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // duration of the swap, as GetLocalizedString() may be concurrently invoked
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on another thread.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string ReloadLocaleResources(const std::string& pref_locale);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets image with the specified resource_id from the current module data.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a pointer to a shared instance of gfx::ImageSkia. This shared
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instance is owned by the resource bundle and should not be freed.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pkotwicz): Make method return const gfx::ImageSkia*
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: GetNativeImageNamed is preferred for cross-platform gfx::Image use.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia* GetImageSkiaNamed(int resource_id);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets an image resource from the current module data. This will load the
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // image in Skia format by default. The ResourceBundle owns this.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image& GetImageNamed(int resource_id);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Similar to GetImageNamed, but rather than loading the image in Skia format,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it will load in the native platform type. This can avoid conversion from
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one image type to another. ResourceBundle owns the result.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that if the same resource has already been loaded in GetImageNamed(),
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gfx::Image will perform a conversion, rather than using the native image
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loading code of ResourceBundle.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |rtl| is RTL_ENABLED then the image is flipped in RTL locales.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image& GetNativeImageNamed(int resource_id, ImageRTL rtl);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as GetNativeImageNamed() except that RTL is not enabled.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image& GetNativeImageNamed(int resource_id);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads the raw bytes of a scale independent data resource.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RefCountedStaticMemory* LoadDataResourceBytes(int resource_id) const;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads the raw bytes of a data resource nearest the scale factor
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |scale_factor| into |bytes|, without doing any processing or
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interpretation of the resource. Use ResourceHandle::SCALE_FACTOR_NONE
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for scale independent image resources (such as wallpaper).
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns NULL if we fail to read the resource.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RefCountedStaticMemory* LoadDataResourceBytesForScale(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int resource_id,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ScaleFactor scale_factor) const;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the contents of a scale independent resource in a
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // StringPiece given the resource id
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece GetRawDataResource(int resource_id) const;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the contents of a resource in a StringPiece given the resource id
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // nearest the scale factor |scale_factor|.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use ResourceHandle::SCALE_FACTOR_NONE for scale independent image resources
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (such as wallpaper).
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece GetRawDataResourceForScale(int resource_id,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               ScaleFactor scale_factor) const;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get a localized string given a message id.  Returns an empty
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // string if the message_id is not found.
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 GetLocalizedString(int message_id);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Returns the font list for the specified style.
246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const gfx::FontList& GetFontList(FontStyle style);
247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the font for the specified style.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Font& GetFont(FontStyle style);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets and reloads the cached fonts.  This is useful when the fonts of the
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // system have changed, for example, when the locale has changed.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReloadFonts();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overrides the path to the pak file from which the locale resources will be
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded. Pass an empty path to undo.
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OverrideLocalePakForTest(const base::FilePath& pak_path);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Overrides a localized string resource with the given string. If no delegate
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // is present, the |string| will be returned when getting the localized string
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |message_id|. If |ReloadLocaleResources| is called, all overrides are
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // cleared. This is intended to be used in conjunction with field trials and
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // the variations service to experiment with different UI strings. This method
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // is not thread safe!
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OverrideLocaleStringResource(int message_id,
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    const base::string16& string);
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the full pathname of the locale file to load.  May return an empty
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // string if no locale data files are found and |test_file_exists| is true.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used on Android to load the local file in the browser process and pass it
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the sandboxed renderer process.
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath GetLocaleFilePath(const std::string& app_locale,
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool test_file_exists);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maximum scale factor currently loaded.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns SCALE_FACTOR_100P if no resource is loaded.
27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ScaleFactor GetMaxScaleFactor() const;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Returns true if |scale_factor| is supported by this platform.
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static bool IsScaleFactorSupported(ScaleFactor scale_factor);
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ResourceBundleTest, DelegateGetPathForLocalePack);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ResourceBundleTest, DelegateGetImageNamed);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ResourceBundleTest, DelegateGetNativeImageNamed);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ResourceBundleImageTest;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ResourceBundleTest;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class ResourceBundleImageSource;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ResourceBundleImageSource;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  typedef base::hash_map<int, base::string16> IdToStringMap;
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ctor/dtor are private, since we're a singleton.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ResourceBundle(Delegate* delegate);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ResourceBundle();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Shared initialization.
30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  static void InitSharedInstance(Delegate* delegate);
30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Free skia_images_.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FreeImages();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the main resources.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadCommonResources();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementation for AddDataPackFromPath and AddOptionalDataPackFromPath, if
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the pack is not |optional| logs an error on failure to load.
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddDataPackFromPathInternal(const base::FilePath& path,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   ScaleFactor scale_factor,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool optional);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inserts |data_pack| to |data_pack_| and updates |max_scale_factor_|
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // accordingly.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddDataPack(DataPack* data_pack);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to load the locale specific strings from an external data module.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the locale that is loaded.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string LoadLocaleResources(const std::string& pref_locale);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load test resources in given paths. If either path is empty an empty
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resource pack is loaded.
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoadTestResources(const base::FilePath& path,
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const base::FilePath& locale_path);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unload the locale specific strings and prepares to load new ones. See
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // comments for ReloadLocaleResources().
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnloadLocaleResources();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Initializes all the gfx::FontList members if they haven't yet been
333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // initialized.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadFontsIfNecessary();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Returns a FontList or NULL by calling Delegate::GetFont and converting
337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // scoped_ptr<gfx::Font> to scoped_ptr<gfx::FontList>.
338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<gfx::FontList> GetFontListFromDelegate(FontStyle style);
339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills the |bitmap| given the data file to look in and the |resource_id|.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if the resource does not exist.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the call succeeds, |fell_back_to_1x| indicates whether Chrome's custom
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // csCl PNG chunk is present (added by GRIT if it falls back to a 100% image).
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LoadBitmap(const ResourceHandle& data_handle,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int resource_id,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  SkBitmap* bitmap,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool* fell_back_to_1x) const;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills the |bitmap| given the |resource_id| and |scale_factor|.
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if the resource does not exist. This may fall back to
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the data pack with SCALE_FACTOR_NONE, and when this happens,
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |scale_factor| will be set to SCALE_FACTOR_100P.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LoadBitmap(int resource_id,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  ScaleFactor* scale_factor,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  SkBitmap* bitmap,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool* fell_back_to_1x) const;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if missing scaled resources should be visually indicated when
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // drawing the fallback (e.g., by tinting the image).
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool ShouldHighlightMissingScaledResources();
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if the data in |buf| is a PNG that has the special marker
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // added by GRIT that indicates that the image is actually 1x data.
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool PNGContainsFallbackMarker(const unsigned char* buf, size_t size);
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A wrapper for PNGCodec::Decode that returns information about custom
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // chunks. For security reasons we can't alter PNGCodec to return this
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // information. Our PNG files are preprocessed by GRIT, and any special chunks
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should occur immediately after the IHDR chunk.
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool DecodePNG(const unsigned char* buf,
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        size_t size,
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        SkBitmap* bitmap,
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        bool* fell_back_to_1x);
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns an empty image for when a resource cannot be loaded. This is a
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bright red bitmap.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image& GetEmptyImage();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& GetOverriddenPakPath();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This pointer is guaranteed to outlive the ResourceBundle instance and may
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be NULL.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Delegate* delegate_;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Protects |images_| and font-related members.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Lock> images_and_fonts_lock_;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Protects |locale_resources_data_|.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Lock> locale_resources_data_lock_;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles for data sources.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ResourceHandle> locale_resources_data_;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<ResourceHandle> data_packs_;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The maximum scale factor currently loaded.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScaleFactor max_scale_factor_;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cached images. The ResourceBundle caches all retrieved images and keeps
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ownership of the pointers.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<int, gfx::Image> ImageMap;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImageMap images_;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image empty_image_;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
406a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // The various font lists used. Cached to avoid repeated GDI
407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // creation/destruction.
408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<gfx::FontList> base_font_list_;
409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<gfx::FontList> bold_font_list_;
410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<gfx::FontList> small_font_list_;
411a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<gfx::FontList> small_bold_font_list_;
412a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<gfx::FontList> medium_font_list_;
413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<gfx::FontList> medium_bold_font_list_;
414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<gfx::FontList> large_font_list_;
415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<gfx::FontList> large_bold_font_list_;
416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<gfx::FontList> web_font_list_;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath overridden_pak_path_;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  IdToStringMap overridden_locale_strings_;
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourceBundle);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(beng): Someday, maybe, get rid of this.
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::ResourceBundle;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_BASE_RESOURCE_RESOURCE_BUNDLE_H_
431