15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/font_family_cache.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/test/base/testing_profile.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace { 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestingFontFamilyCache : public FontFamilyCache { 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) explicit TestingFontFamilyCache(Profile* profile) 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : FontFamilyCache(profile), fetch_font_count_(0) {} 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~TestingFontFamilyCache() {} 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual base::string16 FetchFont(const char* script, 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const char* map_name) OVERRIDE { 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ++fetch_font_count_; 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return FontFamilyCache::FetchFont(script, map_name); 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int fetch_font_count_; 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestingFontFamilyCache); 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Tests that the cache is correctly set and cleared. 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(FontFamilyCacheTest, Caching) { 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestingProfile profile; 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestingFontFamilyCache cache(&profile); 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string font1("font 1"); 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string font2("font 2"); 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string map_name("webkit.webprefs.fonts.pictograph"); 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string script("Zzyxca"); 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string pref_name(map_name + '.' + script); 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string pref_name2(map_name + '.' + "adsf"); 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Registers 2 preferences, and sets the first one. 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) prefs->registry()->RegisterStringPref( 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pref_name.c_str(), 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string(), 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) prefs->registry()->RegisterStringPref( 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pref_name2.c_str(), 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string(), 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) prefs->SetString(pref_name.c_str(), font1.c_str()); 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Check that the right preference is returned. 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string result = base::UTF16ToUTF8( 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cache.FetchAndCacheFont(script.c_str(), map_name.c_str())); 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(font1, result); 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, cache.fetch_font_count_); 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Check that the second access uses the cache. 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result = base::UTF16ToUTF8( 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cache.FetchAndCacheFont(script.c_str(), map_name.c_str())); 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(font1, result); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, cache.fetch_font_count_); 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Changing another preference should have no effect. 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) prefs->SetString(pref_name2.c_str(), "katy perry"); 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result = base::UTF16ToUTF8( 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cache.FetchAndCacheFont(script.c_str(), map_name.c_str())); 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(font1, result); 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, cache.fetch_font_count_); 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Changing the preferences invalidates the cache. 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) prefs->SetString(pref_name.c_str(), font2.c_str()); 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result = base::UTF16ToUTF8( 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cache.FetchAndCacheFont(script.c_str(), map_name.c_str())); 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(font2, result); 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(2, cache.fetch_font_count_); 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 83