1 // Copyright 2017 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/font_pref_change_notifier.h"
6 #include "base/functional/bind.h"
7 #include "chrome/common/pref_names_util.h"
8 #include "components/prefs/pref_registry_simple.h"
9 #include "components/prefs/testing_pref_service.h"
10 #include "testing/gtest/include/gtest/gtest.h"
14 void AppendString(std::vector<std::string>* vect, const std::string& str) {
20 TEST(FontPrefChangeNotifier, Registrars) {
21 std::string prefix((pref_names_util::kWebKitFontPrefPrefix));
23 // Registrar 0 will outlive the notifier.
24 std::vector<std::string> fonts0;
25 FontPrefChangeNotifier::Registrar reg0;
27 std::unique_ptr<TestingPrefServiceSimple> service =
28 std::make_unique<TestingPrefServiceSimple>();
29 PrefRegistrySimple* pref_registry = service->registry();
31 std::string font1 = prefix + "font1";
32 pref_registry->RegisterStringPref(font1, std::string());
33 std::string font2 = prefix + "font2";
34 pref_registry->RegisterStringPref(font2, std::string());
35 std::string font3 = prefix + "font3";
36 pref_registry->RegisterStringPref(font3, std::string());
38 std::unique_ptr<FontPrefChangeNotifier> notifier =
39 std::make_unique<FontPrefChangeNotifier>(service.get());
40 reg0.Register(notifier.get(),
41 base::BindRepeating(&AppendString, base::Unretained(&fonts0)));
43 // Registrar 1 will be manually unregistered.
44 std::vector<std::string> fonts1;
45 FontPrefChangeNotifier::Registrar reg1;
46 reg1.Register(notifier.get(),
47 base::BindRepeating(&AppendString, base::Unretained(&fonts1)));
49 // Registrar 2 will automatically unregister itself when it goes out of scope.
50 std::vector<std::string> fonts2;
52 FontPrefChangeNotifier::Registrar reg2;
55 base::BindRepeating(&AppendString, base::Unretained(&fonts2)));
57 // All lists should get the font.
58 service->SetString(font1, "1");
59 EXPECT_EQ(1u, fonts0.size());
60 EXPECT_EQ(font1, fonts0.back());
61 EXPECT_EQ(1u, fonts1.size());
62 EXPECT_EQ(font1, fonts1.back());
63 EXPECT_EQ(1u, fonts2.size());
64 EXPECT_EQ(font1, fonts2.back());
67 // Now that Regsitrar 2 is gone, only 0 and 1 should get changes.
68 service->SetString(font2, "2");
69 EXPECT_EQ(2u, fonts0.size());
70 EXPECT_EQ(font2, fonts0.back());
71 EXPECT_EQ(2u, fonts1.size());
72 EXPECT_EQ(font2, fonts1.back());
73 EXPECT_EQ(1u, fonts2.size());
75 // Manually unregister Registrar 1.
77 EXPECT_FALSE(reg1.is_registered());
79 // Only Registrar 0 should see changes now.
80 service->SetString(font3, "3");
81 EXPECT_EQ(3u, fonts0.size());
82 EXPECT_EQ(font3, fonts0.back());
83 EXPECT_EQ(2u, fonts1.size());
84 EXPECT_EQ(1u, fonts2.size());
85 EXPECT_EQ(font3, fonts0.back());
89 // Registrar 0 should have been automatically unregistered.
90 EXPECT_FALSE(reg0.is_registered());