1 // Copyright (c) 2012 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.
5 #include "base/at_exit.h"
6 #include "base/basictypes.h"
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/stringprintf.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "base/win/registry.h"
12 #include "chrome_frame/policy_settings.h"
13 #include "chrome_frame/test/chrome_frame_test_utils.h"
14 #include "content/public/common/content_switches.h"
15 #include "policy/policy_constants.h"
16 #include "testing/gtest/include/gtest/gtest.h"
18 using base::win::RegKey;
19 using chrome_frame_test::ScopedVirtualizeHklmAndHkcu;
23 // A best effort way to zap CF policy entries that may be in the registry.
24 void DeleteChromeFramePolicyEntries(HKEY root) {
26 if (key.Open(root, policy::kRegistryChromePolicyKey,
27 KEY_ALL_ACCESS) == ERROR_SUCCESS) {
29 ASCIIToWide(policy::key::kChromeFrameRendererSettings).c_str());
30 key.DeleteKey(ASCIIToWide(policy::key::kRenderInChromeFrameList).c_str());
31 key.DeleteKey(ASCIIToWide(policy::key::kRenderInHostList).c_str());
32 key.DeleteKey(ASCIIToWide(policy::key::kChromeFrameContentTypes).c_str());
33 key.DeleteValue(ASCIIToWide(policy::key::kApplicationLocaleValue).c_str());
35 ASCIIToWide(policy::key::kSuppressChromeFrameTurndownPrompt).c_str());
39 bool InitializePolicyKey(HKEY policy_root, RegKey* policy_key) {
40 EXPECT_EQ(ERROR_SUCCESS, policy_key->Create(policy_root,
41 policy::kRegistryChromePolicyKey, KEY_ALL_ACCESS));
42 return policy_key->Valid();
45 void WritePolicyList(RegKey* policy_key,
46 const wchar_t* list_name,
47 const wchar_t* values[], int count) {
49 // Remove any previous settings
50 policy_key->DeleteKey(list_name);
53 EXPECT_EQ(ERROR_SUCCESS, list_key.Create(policy_key->Handle(), list_name,
55 for (int i = 0; i < count; ++i) {
56 EXPECT_EQ(ERROR_SUCCESS,
57 list_key.WriteValue(base::StringPrintf(L"%i", i).c_str(), values[i]));
61 bool SetRendererSettings(HKEY policy_root,
62 PolicySettings::RendererForUrl renderer,
63 const wchar_t* exclusions[],
64 int exclusion_count) {
66 if (!InitializePolicyKey(policy_root, &policy_key))
69 policy_key.WriteValue(
70 ASCIIToWide(policy::key::kChromeFrameRendererSettings).c_str(),
71 static_cast<DWORD>(renderer));
73 std::wstring in_cf(ASCIIToWide(policy::key::kRenderInChromeFrameList));
74 std::wstring in_host(ASCIIToWide(policy::key::kRenderInHostList));
75 std::wstring exclusion_list(
76 renderer == PolicySettings::RENDER_IN_CHROME_FRAME ? in_host : in_cf);
77 WritePolicyList(&policy_key, exclusion_list.c_str(), exclusions,
83 bool SetCFContentTypes(HKEY policy_root,
84 const wchar_t* content_types[],
87 if (!InitializePolicyKey(policy_root, &policy_key))
90 std::wstring type_list(ASCIIToWide(policy::key::kChromeFrameContentTypes));
91 WritePolicyList(&policy_key, type_list.c_str(), content_types, count);
96 bool SetCFPolicyString(HKEY policy_root,
97 const char* policy_name,
98 const wchar_t* value) {
100 if (!InitializePolicyKey(policy_root, &policy_key))
103 std::wstring policy_name_str(ASCIIToWide(policy_name));
104 EXPECT_EQ(ERROR_SUCCESS,
105 policy_key.WriteValue(policy_name_str.c_str(), value));
109 void SetCFPolicyBool(HKEY policy_root,
110 const char* policy_name,
113 if (InitializePolicyKey(policy_root, &policy_key)) {
114 std::wstring policy_name_str(ASCIIToWide(policy_name));
115 EXPECT_EQ(ERROR_SUCCESS,
116 policy_key.WriteValue(policy_name_str.c_str(), value ? 1U : 0U));
122 class PolicySettingsTest : public testing::Test {
125 ResetPolicySettings();
131 void ResetPolicySettings() {
132 //at_exit_manager_.ProcessCallbacksNow();
133 DeleteAllSingletons();
136 // This is used to manage life cycle of PolicySettings singleton.
137 // base::ShadowingAtExitManager at_exit_manager_;
139 ScopedVirtualizeHklmAndHkcu registry_virtualization_;
142 TEST_F(PolicySettingsTest, RendererForUrl) {
143 const wchar_t* kTestUrls[] = {
144 L"http://www.example.com",
145 L"http://www.pattern.com",
146 L"http://www.test.com"
148 const wchar_t* kTestFilters[] = {
153 const wchar_t kNoMatchUrl[] = L"http://www.chromium.org";
155 EXPECT_EQ(PolicySettings::RENDERER_NOT_SPECIFIED,
156 PolicySettings::GetInstance()->default_renderer());
157 EXPECT_EQ(PolicySettings::RENDERER_NOT_SPECIFIED,
158 PolicySettings::GetInstance()->GetRendererForUrl(kNoMatchUrl));
160 HKEY root[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER };
161 for (int i = 0; i < arraysize(root); ++i) {
162 EXPECT_TRUE(SetRendererSettings(root[i],
163 PolicySettings::RENDER_IN_CHROME_FRAME, kTestFilters,
164 arraysize(kTestFilters)));
166 ResetPolicySettings();
167 EXPECT_EQ(PolicySettings::RENDER_IN_CHROME_FRAME,
168 PolicySettings::GetInstance()->GetRendererForUrl(kNoMatchUrl));
169 for (int j = 0; j < arraysize(kTestUrls); ++j) {
170 EXPECT_EQ(PolicySettings::RENDER_IN_HOST,
171 PolicySettings::GetInstance()->GetRendererForUrl(kTestUrls[j]));
174 EXPECT_TRUE(SetRendererSettings(root[i],
175 PolicySettings::RENDER_IN_HOST, NULL, 0));
177 ResetPolicySettings();
178 EXPECT_EQ(PolicySettings::RENDER_IN_HOST,
179 PolicySettings::GetInstance()->GetRendererForUrl(kNoMatchUrl));
180 for (int j = 0; j < arraysize(kTestUrls); ++j) {
181 EXPECT_EQ(PolicySettings::RENDER_IN_HOST,
182 PolicySettings::GetInstance()->GetRendererForUrl(kTestUrls[j]));
185 DeleteChromeFramePolicyEntries(root[i]);
189 TEST_F(PolicySettingsTest, RendererForContentType) {
190 EXPECT_EQ(PolicySettings::RENDERER_NOT_SPECIFIED,
191 PolicySettings::GetInstance()->GetRendererForContentType(
194 const wchar_t* kTestPolicyContentTypes[] = {
200 HKEY root[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER };
201 for (int i = 0; i < arraysize(root); ++i) {
202 SetCFContentTypes(root[i], kTestPolicyContentTypes,
203 arraysize(kTestPolicyContentTypes));
204 ResetPolicySettings();
205 for (int type = 0; type < arraysize(kTestPolicyContentTypes); ++type) {
206 EXPECT_EQ(PolicySettings::RENDER_IN_CHROME_FRAME,
207 PolicySettings::GetInstance()->GetRendererForContentType(
208 kTestPolicyContentTypes[type]));
211 EXPECT_EQ(PolicySettings::RENDERER_NOT_SPECIFIED,
212 PolicySettings::GetInstance()->GetRendererForContentType(
215 DeleteChromeFramePolicyEntries(root[i]);
219 TEST_F(PolicySettingsTest, ApplicationLocale) {
220 EXPECT_TRUE(PolicySettings::GetInstance()->ApplicationLocale().empty());
222 static const wchar_t kTestApplicationLocale[] = L"fr-CA";
224 HKEY root[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER };
225 for (int i = 0; i < arraysize(root); ++i) {
226 SetCFPolicyString(root[i], policy::key::kApplicationLocaleValue,
227 kTestApplicationLocale);
228 ResetPolicySettings();
229 EXPECT_EQ(std::wstring(kTestApplicationLocale),
230 PolicySettings::GetInstance()->ApplicationLocale());
232 DeleteChromeFramePolicyEntries(root[i]);
236 TEST_F(PolicySettingsTest, AdditionalLaunchParameters) {
237 EXPECT_TRUE(PolicySettings::GetInstance()->
238 AdditionalLaunchParameters().GetProgram().empty());
240 std::string test_switches("--");
241 test_switches += switches::kDisableWebKitMediaSource;
243 HKEY root[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER };
244 for (int i = 0; i < arraysize(root); ++i) {
245 SetCFPolicyString(root[i], policy::key::kAdditionalLaunchParameters,
246 ASCIIToWide(test_switches).c_str());
247 ResetPolicySettings();
248 const CommandLine& additional_params =
249 PolicySettings::GetInstance()->AdditionalLaunchParameters();
250 EXPECT_TRUE(additional_params.HasSwitch(
251 switches::kDisableWebKitMediaSource));
253 base::FilePath program_path(FILE_PATH_LITERAL("my_chrome.exe"));
254 CommandLine new_cmd_line(program_path);
255 new_cmd_line.AppendArguments(additional_params, false);
256 EXPECT_NE(new_cmd_line.GetProgram(), additional_params.GetProgram());
257 EXPECT_TRUE(new_cmd_line.HasSwitch(switches::kDisableWebKitMediaSource));
259 DeleteChromeFramePolicyEntries(root[i]);
263 TEST_F(PolicySettingsTest, SuppressTurndownPrompt) {
264 EXPECT_FALSE(PolicySettings::GetInstance()->suppress_turndown_prompt());
266 HKEY root[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER };
267 for (int i = 0; i < arraysize(root); ++i) {
268 SetCFPolicyBool(root[i], policy::key::kSuppressChromeFrameTurndownPrompt,
270 ResetPolicySettings();
271 EXPECT_TRUE(PolicySettings::GetInstance()->suppress_turndown_prompt());
273 DeleteChromeFramePolicyEntries(root[i]);