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" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.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