resource_bundle_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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)#include "ui/base/resource/resource_bundle.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/big_endian.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/data_pack.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/png_codec.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/resources/grit/ui_resources.h"
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN)
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/win/dpi.h"
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Between;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Property;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ReturnArg;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kSamplePakContents[];
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const size_t kSamplePakSize;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kSamplePakContents2x[];
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const size_t kSamplePakSize2x;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kEmptyPakContents[];
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const size_t kEmptyPakSize;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned char kPngMagic[8] = { 0x89, 'P', 'N', 'G', 13, 10, 26, 10 };
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kPngChunkMetadataSize = 12;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned char kPngIHDRChunkType[4] = { 'I', 'H', 'D', 'R' };
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Custom chunk that GRIT adds to PNG to indicate that it could not find a
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bitmap at the requested scale factor and fell back to 1x.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned char kPngScaleChunk[12] = { 0x00, 0x00, 0x00, 0x00,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           'c', 's', 'C', 'l',
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           0xc1, 0x30, 0x60, 0x4d };
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mock for the ResourceBundle::Delegate class.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockResourceBundleDelegate : public ui::ResourceBundle::Delegate {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockResourceBundleDelegate() {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockResourceBundleDelegate() {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(GetPathForResourcePack, base::FilePath(
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& pack_path, ui::ScaleFactor scale_factor));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(GetPathForLocalePack, base::FilePath(
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& pack_path, const std::string& locale));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetImageNamed, gfx::Image(int resource_id));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(GetNativeImageNamed,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Image(int resource_id,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 ui::ResourceBundle::ImageRTL rtl));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(LoadDataResourceBytes,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::RefCountedStaticMemory*(int resource_id,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ui::ScaleFactor scale_factor));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(GetRawDataResourceMock, base::StringPiece(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int resource_id,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::ScaleFactor scale_factor));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetRawDataResource(int resource_id,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ui::ScaleFactor scale_factor,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  base::StringPiece* value) OVERRIDE {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *value = GetRawDataResourceMock(resource_id, scale_factor);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD1(GetLocalizedStringMock, base::string16(int message_id));
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool GetLocalizedString(int message_id,
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  base::string16* value) OVERRIDE {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *value = GetLocalizedStringMock(message_id);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MOCK_METHOD1(GetFontMock,
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)               gfx::Font*(ui::ResourceBundle::FontStyle style));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_ptr<gfx::Font> GetFont(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::ResourceBundle::FontStyle style) OVERRIDE {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return scoped_ptr<gfx::Font>(GetFontMock(style));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns |bitmap_data| with |custom_chunk| inserted after the IHDR chunk.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddCustomChunk(const base::StringPiece& custom_chunk,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    std::vector<unsigned char>* bitmap_data) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(arraysize(kPngMagic) + kPngChunkMetadataSize, bitmap_data->size());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(std::equal(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bitmap_data->begin(),
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bitmap_data->begin() + arraysize(kPngMagic),
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kPngMagic));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<unsigned char>::iterator ihdr_start =
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bitmap_data->begin() + arraysize(kPngMagic);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char ihdr_length_data[sizeof(uint32)];
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < sizeof(uint32); ++i)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ihdr_length_data[i] = *(ihdr_start + i);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 ihdr_chunk_length = 0;
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::ReadBigEndian(reinterpret_cast<char*>(ihdr_length_data),
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      &ihdr_chunk_length);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(std::equal(
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ihdr_start + sizeof(uint32),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ihdr_start + sizeof(uint32) + sizeof(kPngIHDRChunkType),
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kPngIHDRChunkType));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bitmap_data->insert(ihdr_start + kPngChunkMetadataSize + ihdr_chunk_length,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      custom_chunk.begin(), custom_chunk.end());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates datapack at |path| with a single bitmap at resource ID 3
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which is |edge_size|x|edge_size| pixels.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If |custom_chunk| is non empty, adds it after the IHDR chunk
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the encoded bitmap data.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CreateDataPackWithSingleBitmap(const base::FilePath& path,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int edge_size,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const base::StringPiece& custom_chunk) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap bitmap;
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bitmap.allocN32Pixels(edge_size, edge_size);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bitmap.eraseColor(SK_ColorWHITE);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<unsigned char> bitmap_data;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &bitmap_data));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (custom_chunk.size() > 0)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddCustomChunk(custom_chunk, &bitmap_data);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<uint16, base::StringPiece> resources;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resources[3u] = base::StringPiece(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const char*>(&bitmap_data[0]), bitmap_data.size());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataPack::WritePack(path, resources, ui::DataPack::BINARY);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceBundleTest : public testing::Test {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundleTest() : resource_bundle_(NULL) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ResourceBundleTest() {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from testing::Test:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete resource_bundle_;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns new ResoureBundle with the specified |delegate|. The
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResourceBundleTest class manages the lifetime of the returned
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResourceBundle.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* CreateResourceBundle(ResourceBundle::Delegate* delegate) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!resource_bundle_);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource_bundle_ = new ResourceBundle(delegate);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return resource_bundle_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourceBundleTest);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleTest, DelegateGetPathForResourcePack) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockResourceBundleDelegate delegate;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundle(&delegate);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath pack_path(FILE_PATH_LITERAL("/path/to/test_path.pak"));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ScaleFactor pack_scale_factor = ui::SCALE_FACTOR_200P;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delegate,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetPathForResourcePack(
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          Property(&base::FilePath::value, pack_path.value()),
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pack_scale_factor))
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(pack_path));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_bundle->AddDataPackFromPath(pack_path, pack_scale_factor);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fails consistently on Linux: crbug.com/161902
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DelegateGetPathForLocalePack DISABLED_DelegateGetPathForLocalePack
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DelegateGetPathForLocalePack DelegateGetPathForLocalePack
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ResourceBundleTest, MAYBE_DelegateGetPathForLocalePack) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockResourceBundleDelegate delegate;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundle(&delegate);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string locale = "en-US";
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the load.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delegate, GetPathForLocalePack(_, locale))
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(2)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(base::FilePath()))
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(resource_bundle->LocaleDataPakExists(locale));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", resource_bundle->LoadLocaleResources(locale));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow the load to proceed.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delegate, GetPathForLocalePack(_, locale))
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(2)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(ReturnArg<0>());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(resource_bundle->LocaleDataPakExists(locale));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(locale, resource_bundle->LoadLocaleResources(locale));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleTest, DelegateGetImageNamed) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockResourceBundleDelegate delegate;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundle(&delegate);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image empty_image = resource_bundle->GetEmptyImage();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = 5;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delegate, GetImageNamed(resource_id))
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(empty_image));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image result = resource_bundle->GetImageNamed(resource_id);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(empty_image.ToSkBitmap(), result.ToSkBitmap());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleTest, DelegateGetNativeImageNamed) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockResourceBundleDelegate delegate;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundle(&delegate);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image empty_image = resource_bundle->GetEmptyImage();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = 5;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some platforms delegate GetNativeImageNamed calls to GetImageNamed.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delegate, GetImageNamed(resource_id))
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(Between(0, 1))
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(empty_image));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delegate,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetNativeImageNamed(resource_id, ui::ResourceBundle::RTL_DISABLED))
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(Between(0, 1))
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(empty_image));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image result = resource_bundle->GetNativeImageNamed(resource_id);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(empty_image.ToSkBitmap(), result.ToSkBitmap());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleTest, DelegateLoadDataResourceBytes) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockResourceBundleDelegate delegate;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundle(&delegate);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the data resource for testing purposes.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char data[] = "My test data";
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::RefCountedStaticMemory> static_memory(
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new base::RefCountedStaticMemory(data, sizeof(data)));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = 5;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ScaleFactor scale_factor = ui::SCALE_FACTOR_NONE;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delegate, LoadDataResourceBytes(resource_id, scale_factor))
272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      .Times(1).WillOnce(Return(static_memory.get()));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::RefCountedStaticMemory> result =
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_bundle->LoadDataResourceBytesForScale(resource_id, scale_factor);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_memory, result);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleTest, DelegateGetRawDataResource) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockResourceBundleDelegate delegate;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundle(&delegate);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the string piece for testing purposes.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char data[] = "My test data";
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece string_piece(data);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = 5;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delegate, GetRawDataResourceMock(
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          resource_id, ui::SCALE_FACTOR_NONE))
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(string_piece));
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece result = resource_bundle->GetRawDataResource(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(string_piece.data(), result.data());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleTest, DelegateGetLocalizedString) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockResourceBundleDelegate delegate;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundle(&delegate);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 data = base::ASCIIToUTF16("My test data");
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id = 5;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delegate, GetLocalizedStringMock(resource_id))
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(data));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 result = resource_bundle->GetLocalizedString(resource_id);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(data, result);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
314116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceBundleTest, OverrideStringResource) {
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ResourceBundle* resource_bundle = CreateResourceBundle(NULL);
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::string16 data = base::ASCIIToUTF16("My test data");
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int resource_id = 5;
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::string16 result = resource_bundle->GetLocalizedString(resource_id);
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(base::string16(), result);
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  resource_bundle->OverrideLocaleStringResource(resource_id, data);
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  result = resource_bundle->GetLocalizedString(resource_id);
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(data, result);
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
329116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ResourceBundleTest, DelegateGetLocalizedStringWithOverride) {
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockResourceBundleDelegate delegate;
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ResourceBundle* resource_bundle = CreateResourceBundle(&delegate);
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::string16 delegate_data = base::ASCIIToUTF16("My delegate data");
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int resource_id = 5;
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(delegate, GetLocalizedStringMock(resource_id)).Times(1).WillOnce(
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      Return(delegate_data));
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::string16 override_data = base::ASCIIToUTF16("My override data");
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::string16 result = resource_bundle->GetLocalizedString(resource_id);
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(delegate_data, result);
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(USE_OZONE) && !defined(USE_PANGO)
346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_DelegateGetFontList DISABLED_DelegateGetFontList
347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_DelegateGetFontList DelegateGetFontList
349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ResourceBundleTest, MAYBE_DelegateGetFontList) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockResourceBundleDelegate delegate;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundle(&delegate);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be called once for each font type. When we return NULL the default
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // font will be created.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Font* test_font = NULL;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(delegate, GetFontMock(_))
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(8)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(test_font));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const gfx::FontList* font_list =
363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      &resource_bundle->GetFontList(ui::ResourceBundle::BaseFont);
364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(font_list);
365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Font* font =
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &resource_bundle->GetFont(ui::ResourceBundle::BaseFont);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(font);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleTest, LocaleDataPakExists) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundle(NULL);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that ResourceBundle::LocaleDataPakExists returns the correct results.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(resource_bundle->LocaleDataPakExists("en-US"));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(resource_bundle->LocaleDataPakExists("not_a_real_locale"));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceBundleImageTest : public ResourceBundleTest {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ResourceBundleImageTest() {}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ResourceBundleImageTest() {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a temporary directory to write test resource bundles to.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dir_.CreateUniqueTempDir());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns resource bundle which uses an empty data pak for locale data.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ResourceBundle* CreateResourceBundleWithEmptyLocalePak() {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Write an empty data pak for locale data.
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& locale_path = dir_path().Append(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FILE_PATH_LITERAL("locale.pak"));
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(base::WriteFile(locale_path, kEmptyPakContents, kEmptyPakSize),
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              static_cast<int>(kEmptyPakSize));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle* resource_bundle = CreateResourceBundle(NULL);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Load the empty locale data pak.
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource_bundle->LoadTestResources(base::FilePath(), locale_path);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return resource_bundle;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the path of temporary directory to write test data packs into.
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& dir_path() { return dir_.path(); }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DataPack> locale_pack_;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir dir_;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourceBundleImageTest);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we don't crash when trying to load a resource that is not found.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In some cases, we fail to mmap resources.pak, but try to keep going anyway.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleImageTest, LoadDataResourceBytes) {
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_path = dir_path().Append(FILE_PATH_LITERAL("sample.pak"));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dump contents into the pak files.
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(base::WriteFile(data_path, kEmptyPakContents,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kEmptyPakSize), static_cast<int>(kEmptyPakSize));
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a resource bundle from the file.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundleWithEmptyLocalePak();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_path, SCALE_FACTOR_100P);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kUnfoundResourceId = 10000;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NULL, resource_bundle->LoadDataResourceBytes(
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kUnfoundResourceId));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Give a .pak file that doesn't exist so we will fail to load it.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_bundle->AddDataPackFromPath(
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("non-existant-file.pak")),
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SCALE_FACTOR_NONE);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NULL, resource_bundle->LoadDataResourceBytes(
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kUnfoundResourceId));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleImageTest, GetRawDataResource) {
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_path = dir_path().Append(FILE_PATH_LITERAL("sample.pak"));
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_2x_path =
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dir_path().Append(FILE_PATH_LITERAL("sample_2x.pak"));
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dump contents into the pak files.
447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(base::WriteFile(data_path, kSamplePakContents,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSamplePakSize), static_cast<int>(kSamplePakSize));
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(base::WriteFile(data_2x_path, kSamplePakContents2x,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSamplePakSize2x), static_cast<int>(kSamplePakSize2x));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the regular and 2x pak files.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundleWithEmptyLocalePak();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_path, SCALE_FACTOR_100P);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_2x_path, SCALE_FACTOR_200P);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resource ID 4 exists in both 1x and 2x paks, so we expect a different
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // result when requesting the 2x scale.
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("this is id 4", resource_bundle->GetRawDataResourceForScale(4,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SCALE_FACTOR_100P));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("this is id 4 2x", resource_bundle->GetRawDataResourceForScale(4,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SCALE_FACTOR_200P));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resource ID 6 only exists in the 1x pak so we expect the same resource
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for both scale factor requests.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("this is id 6", resource_bundle->GetRawDataResourceForScale(6,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SCALE_FACTOR_100P));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("this is id 6", resource_bundle->GetRawDataResourceForScale(6,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SCALE_FACTOR_200P));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test requesting image reps at various scale factors from the image returned
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// via ResourceBundle::GetImageNamed().
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleImageTest, GetImageNamed) {
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN)
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::ForceHighDPISupportForTesting(2.0);
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
47868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<ScaleFactor> supported_factors;
47968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  supported_factors.push_back(SCALE_FACTOR_100P);
48068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  supported_factors.push_back(SCALE_FACTOR_200P);
48168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  test::ScopedSetSupportedScaleFactors scoped_supported(supported_factors);
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_1x_path = dir_path().AppendASCII("sample_1x.pak");
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_2x_path = dir_path().AppendASCII("sample_2x.pak");
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the pak files.
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateDataPackWithSingleBitmap(data_1x_path, 10, base::StringPiece());
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateDataPackWithSingleBitmap(data_2x_path, 20, base::StringPiece());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the regular and 2x pak files.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundleWithEmptyLocalePak();
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_1x_path, SCALE_FACTOR_100P);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_2x_path, SCALE_FACTOR_200P);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(SCALE_FACTOR_200P, resource_bundle->GetMaxScaleFactor());
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia* image_skia = resource_bundle->GetImageSkiaNamed(3);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_CHROMEOS) || defined(OS_WIN)
499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // ChromeOS/Windows load highest scale factor first.
50068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(ui::SCALE_FACTOR_200P,
50168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetSupportedScaleFactor(image_skia->image_reps()[0].scale()));
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
50368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(ui::SCALE_FACTOR_100P,
50468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetSupportedScaleFactor(image_skia->image_reps()[0].scale()));
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resource ID 3 exists in both 1x and 2x paks. Image reps should be
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // available for both scale factors in |image_skia|.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkiaRep image_rep =
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      image_skia->GetRepresentation(
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GetScaleForScaleFactor(ui::SCALE_FACTOR_100P));
51268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(ui::SCALE_FACTOR_100P, GetSupportedScaleFactor(image_rep.scale()));
51368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  image_rep =
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      image_skia->GetRepresentation(
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GetScaleForScaleFactor(ui::SCALE_FACTOR_200P));
51668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(ui::SCALE_FACTOR_200P, GetSupportedScaleFactor(image_rep.scale()));
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The 1.4x pack was not loaded. Requesting the 1.4x resource should return
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // either the 1x or the 2x resource.
52068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  image_rep = image_skia->GetRepresentation(
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ui::GetScaleForScaleFactor(ui::SCALE_FACTOR_140P));
52268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ui::ScaleFactor scale_factor = GetSupportedScaleFactor(image_rep.scale());
52368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(scale_factor == ui::SCALE_FACTOR_100P ||
52468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              scale_factor == ui::SCALE_FACTOR_200P);
525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // ImageSkia scales image if the one for the requested scale factor is not
527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // available.
528f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1.4f, image_skia->GetRepresentation(1.4f).scale());
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that GetImageNamed() behaves properly for images which GRIT has
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// annotated as having fallen back to 1x.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ResourceBundleImageTest, GetImageNamedFallback1x) {
53468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<ScaleFactor> supported_factors;
53568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  supported_factors.push_back(SCALE_FACTOR_100P);
53668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  supported_factors.push_back(SCALE_FACTOR_200P);
53768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  test::ScopedSetSupportedScaleFactors scoped_supported(supported_factors);
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_path = dir_path().AppendASCII("sample.pak");
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_2x_path = dir_path().AppendASCII("sample_2x.pak");
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the pak files.
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateDataPackWithSingleBitmap(data_path, 10, base::StringPiece());
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2x data pack bitmap has custom chunk to indicate that the 2x bitmap is not
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // available and that GRIT fell back to 1x.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateDataPackWithSingleBitmap(data_2x_path, 10, base::StringPiece(
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const char*>(kPngScaleChunk),
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(kPngScaleChunk)));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the regular and 2x pak files.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundleWithEmptyLocalePak();
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_path, SCALE_FACTOR_100P);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_2x_path, SCALE_FACTOR_200P);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia* image_skia = resource_bundle->GetImageSkiaNamed(3);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The image rep for 2x should be available. It should be resized to the
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // proper 2x size.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkiaRep image_rep =
559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      image_skia->GetRepresentation(GetScaleForScaleFactor(
560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ui::SCALE_FACTOR_200P));
56168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(ui::SCALE_FACTOR_200P, GetSupportedScaleFactor(image_rep.scale()));
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(20, image_rep.pixel_width());
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(20, image_rep.pixel_height());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN)
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests GetImageNamed() behaves properly when the size of a scaled image
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// requires rounding as a result of using a non-integer scale factor.
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Scale factors of 140 and 1805 are Windows specific.
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ResourceBundleImageTest, GetImageNamedFallback1xRounding) {
57168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<ScaleFactor> supported_factors;
57268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  supported_factors.push_back(SCALE_FACTOR_100P);
57368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  supported_factors.push_back(SCALE_FACTOR_140P);
57468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  supported_factors.push_back(SCALE_FACTOR_180P);
57568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  test::ScopedSetSupportedScaleFactors scoped_supported(supported_factors);
57668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath data_path = dir_path().AppendASCII("sample.pak");
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath data_140P_path = dir_path().AppendASCII("sample_140P.pak");
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath data_180P_path = dir_path().AppendASCII("sample_180P.pak");
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateDataPackWithSingleBitmap(data_path, 8, base::StringPiece());
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Mark 140% and 180% images as requiring 1x fallback.
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateDataPackWithSingleBitmap(data_140P_path, 8, base::StringPiece(
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    reinterpret_cast<const char*>(kPngScaleChunk),
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    arraysize(kPngScaleChunk)));
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateDataPackWithSingleBitmap(data_180P_path, 8, base::StringPiece(
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    reinterpret_cast<const char*>(kPngScaleChunk),
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    arraysize(kPngScaleChunk)));
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundleWithEmptyLocalePak();
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_path, SCALE_FACTOR_100P);
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_140P_path, SCALE_FACTOR_140P);
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_180P_path, SCALE_FACTOR_180P);
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Non-integer dimensions should be rounded up.
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::ImageSkia* image_skia = resource_bundle->GetImageSkiaNamed(3);
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::ImageSkiaRep image_rep =
59868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    image_skia->GetRepresentation(
599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GetScaleForScaleFactor(ui::SCALE_FACTOR_140P));
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(12, image_rep.pixel_width());
60168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  image_rep = image_skia->GetRepresentation(
602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GetScaleForScaleFactor(ui::SCALE_FACTOR_180P));
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(15, image_rep.pixel_width());
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_IOS)
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Fails on devices that have non-100P scaling. See crbug.com/298406
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_FallbackToNone DISABLED_FallbackToNone
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAYBE_FallbackToNone FallbackToNone
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ResourceBundleImageTest, MAYBE_FallbackToNone) {
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_default_path = dir_path().AppendASCII("sample.pak");
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create the pak files.
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateDataPackWithSingleBitmap(data_default_path, 10, base::StringPiece());
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Load the regular pak files only.
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceBundle* resource_bundle = CreateResourceBundleWithEmptyLocalePak();
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource_bundle->AddDataPackFromPath(data_default_path, SCALE_FACTOR_NONE);
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::ImageSkia* image_skia = resource_bundle->GetImageSkiaNamed(3);
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, image_skia->image_reps().size());
625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(image_skia->image_reps()[0].unscaled());
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::SCALE_FACTOR_100P,
62768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetSupportedScaleFactor(image_skia->image_reps()[0].scale()));
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
631