blob: a1664e8ab330b618b85a1b81b916d902ecb202ec [file] [log] [blame]
Brett Wilson21cf626a2017-09-07 00:30:201// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/font_pref_change_notifier.h"
6#include "base/bind.h"
7#include "base/memory/ptr_util.h"
8#include "chrome/common/pref_names_util.h"
9#include "components/prefs/pref_registry_simple.h"
10#include "components/prefs/testing_pref_service.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13namespace {
14
15void AppendString(std::vector<std::string>* vect, const std::string& str) {
16 vect->push_back(str);
17}
18
19} // namespace
20
21TEST(FontPrefChangeNotifier, Registrars) {
22 std::string prefix((pref_names_util::kWebKitFontPrefPrefix));
23
24 // Registrar 0 will outlive the notifier.
25 std::vector<std::string> fonts0;
26 FontPrefChangeNotifier::Registrar reg0;
27
28 std::unique_ptr<TestingPrefServiceSimple> service =
29 base::MakeUnique<TestingPrefServiceSimple>();
30 PrefRegistrySimple* pref_registry = service->registry();
31
32 std::string font1 = prefix + "font1";
33 pref_registry->RegisterStringPref(font1, std::string());
34 std::string font2 = prefix + "font2";
35 pref_registry->RegisterStringPref(font2, std::string());
36 std::string font3 = prefix + "font3";
37 pref_registry->RegisterStringPref(font3, std::string());
38
39 std::unique_ptr<FontPrefChangeNotifier> notifier =
40 base::MakeUnique<FontPrefChangeNotifier>(service.get());
41 reg0.Register(notifier.get(),
42 base::BindRepeating(&AppendString, base::Unretained(&fonts0)));
43
44 // Registrar 1 will be manually unregistered.
45 std::vector<std::string> fonts1;
46 FontPrefChangeNotifier::Registrar reg1;
47 reg1.Register(notifier.get(),
48 base::BindRepeating(&AppendString, base::Unretained(&fonts1)));
49
50 // Registrar 2 will automatically unregister itself when it goes out of scope.
51 std::vector<std::string> fonts2;
52 {
53 FontPrefChangeNotifier::Registrar reg2;
54 reg2.Register(
55 notifier.get(),
56 base::BindRepeating(&AppendString, base::Unretained(&fonts2)));
57
58 // All lists should get the font.
59 service->SetString(font1, "1");
60 EXPECT_EQ(1u, fonts0.size());
61 EXPECT_EQ(font1, fonts0.back());
62 EXPECT_EQ(1u, fonts1.size());
63 EXPECT_EQ(font1, fonts1.back());
64 EXPECT_EQ(1u, fonts2.size());
65 EXPECT_EQ(font1, fonts2.back());
66 }
67
68 // Now that Regsitrar 2 is gone, only 0 and 1 should get changes.
69 service->SetString(font2, "2");
70 EXPECT_EQ(2u, fonts0.size());
71 EXPECT_EQ(font2, fonts0.back());
72 EXPECT_EQ(2u, fonts1.size());
73 EXPECT_EQ(font2, fonts1.back());
74 EXPECT_EQ(1u, fonts2.size());
75
76 // Manually unregister Registrar 1.
77 reg1.Unregister();
78 EXPECT_FALSE(reg1.is_registered());
79
80 // Only Registrar 0 should see changes now.
81 service->SetString(font3, "3");
82 EXPECT_EQ(3u, fonts0.size());
83 EXPECT_EQ(font3, fonts0.back());
84 EXPECT_EQ(2u, fonts1.size());
85 EXPECT_EQ(1u, fonts2.size());
86 EXPECT_EQ(font3, fonts0.back());
87
88 notifier.reset();
89
90 // Registrar 0 should have been automatically unregistered.
91 EXPECT_FALSE(reg0.is_registered());
92}