diff options
author | tommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-04 23:07:40 +0000 |
---|---|---|
committer | tommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-04 23:07:40 +0000 |
commit | 5ac670a3a8c4e3e2f2b7ed3ad1190f9ed34dd512 (patch) | |
tree | cff9275bd93bc02c09e2d9836a82b086745a9852 | |
parent | 10da830b7fe028f85cf2167fadb64852cfe526ee (diff) | |
download | chromium_src-5ac670a3a8c4e3e2f2b7ed3ad1190f9ed34dd512.zip chromium_src-5ac670a3a8c4e3e2f2b7ed3ad1190f9ed34dd512.tar.gz chromium_src-5ac670a3a8c4e3e2f2b7ed3ad1190f9ed34dd512.tar.bz2 |
Policy support for being able to specify a list of content types that Chrome Frame should handle.
TEST=This adds a new policy list for Chrome Frame, "ChromeFrameContentTypes", which can be used to specify a list of content types that should always be rendered in Chrome Frame.
BUG=56543
Review URL: http://codereview.chromium.org/3611002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61432 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/app/policy/policy_templates.grd | 9 | ||||
-rw-r--r-- | chrome/app/policy/policy_templates.json | 14 | ||||
-rw-r--r-- | chrome/common/policy_constants.cc | 1 | ||||
-rw-r--r-- | chrome/common/policy_constants.h | 2 | ||||
-rw-r--r-- | chrome_frame/policy_settings.cc | 34 | ||||
-rw-r--r-- | chrome_frame/policy_settings.h | 3 | ||||
-rw-r--r-- | chrome_frame/protocol_sink_wrap.cc | 8 | ||||
-rw-r--r-- | chrome_frame/test/policy_settings_unittest.cc | 111 | ||||
-rw-r--r-- | chrome_frame/utils.cc | 10 | ||||
-rw-r--r-- | chrome_frame/utils.h | 5 |
10 files changed, 163 insertions, 34 deletions
diff --git a/chrome/app/policy/policy_templates.grd b/chrome/app/policy/policy_templates.grd index d7316c2..0b154e46 100644 --- a/chrome/app/policy/policy_templates.grd +++ b/chrome/app/policy/policy_templates.grd @@ -523,6 +523,15 @@ templates and will be translated for each locale. --> Customize the list of URL patterns that should always be rendered by the host browser. For example patterns see http://www.chromium.org/developers/how-tos/chrome-frame-getting-started. </message> + + <message name="IDS_POLICY_CHROMEFRAMECONTENTTYPES_CAPTION" + desc="Caption for list of Content-Type values that should additionally be supported by Chrome Frame"> + Allow <ph name="PRODUCT_FRAME_NAME">$3<ex>Google Chrome Frame</ex></ph> to handle the following content types. + </message> + <message name="IDS_POLICY_CHROMEFRAMECONTENTTYPES_DESC" + desc="Description for list of Content-Type values that should additionally be supported by Chrome Frame"> + Allow <ph name="PRODUCT_FRAME_NAME">$3<ex>Google Chrome Frame</ex></ph> to handle the following content types. + </message> <!-- End Chrome Frame messages --> <!-- Generated documentation messages --> diff --git a/chrome/app/policy/policy_templates.json b/chrome/app/policy/policy_templates.json index 127fbd8..7d95cf7 100644 --- a/chrome/app/policy/policy_templates.json +++ b/chrome/app/policy/policy_templates.json @@ -390,6 +390,20 @@ } }], }, + { + 'name': 'ChromeFrameContentTypes', + 'type': 'group', + 'policies': [{ + 'name': 'ChromeFrameContentTypes', + 'type': 'list', + 'annotations': { + 'platforms': ['win'], + 'products': ['chrome_frame'], + 'features': {'dynamic_refresh': 0}, + 'example_value': ['text/xml', 'application/xml'], + } + }], + }, ], 'placeholders': [ # Note: keys $1 and $3 are reserved for Chromium and Chromium Frame. diff --git a/chrome/common/policy_constants.cc b/chrome/common/policy_constants.cc index d34e0db..4ecf17e 100644 --- a/chrome/common/policy_constants.cc +++ b/chrome/common/policy_constants.cc @@ -57,6 +57,7 @@ const char kSavingBrowserHistoryDisabled[] = "SavingBrowserHistoryDisabled"; const char kChromeFrameRendererSettings[] = "ChromeFrameRendererSettings"; const char kRenderInChromeFrameList[] = "RenderInChromeFrameList"; const char kRenderInHostList[] = "RenderInHostList"; +const char kChromeFrameContentTypes[] = "ChromeFrameContentTypes"; } // namespace key diff --git a/chrome/common/policy_constants.h b/chrome/common/policy_constants.h index d07b799..1cb00a1 100644 --- a/chrome/common/policy_constants.h +++ b/chrome/common/policy_constants.h @@ -54,7 +54,7 @@ extern const char kSavingBrowserHistoryDisabled[]; extern const char kChromeFrameRendererSettings[]; extern const char kRenderInChromeFrameList[]; extern const char kRenderInHostList[]; - +extern const char kChromeFrameContentTypes[]; } // namespace key } // namespace policy diff --git a/chrome_frame/policy_settings.cc b/chrome_frame/policy_settings.cc index f1c9984..7e5be2c 100644 --- a/chrome_frame/policy_settings.cc +++ b/chrome_frame/policy_settings.cc @@ -9,6 +9,7 @@ #include "base/string_util.h" #include "base/utf_string_conversions.h" #include "chrome/common/policy_constants.h" +#include "chrome_frame/utils.h" PolicySettings::RendererForUrl PolicySettings::GetRendererForUrl( const wchar_t* url) { @@ -25,6 +26,21 @@ PolicySettings::RendererForUrl PolicySettings::GetRendererForUrl( return renderer; } +PolicySettings::RendererForUrl PolicySettings::GetRendererForContentType( + const wchar_t* content_type) { + DCHECK(content_type); + RendererForUrl renderer = RENDERER_NOT_SPECIFIED; + std::vector<std::wstring>::const_iterator it; + for (it = content_type_list_.begin(); + it != content_type_list_.end(); ++it) { + if (lstrcmpiW(content_type, (*it).c_str()) == 0) { + renderer = RENDER_IN_CHROME_FRAME; + break; + } + } + return renderer; +} + void PolicySettings::RefreshFromRegistry() { default_renderer_ = RENDERER_NOT_SPECIFIED; renderer_exclusion_list_.clear(); @@ -56,15 +72,21 @@ void PolicySettings::RefreshFromRegistry() { policy::key::kRenderInChromeFrameList : policy::key::kRenderInHostList; - RegistryValueIterator url_list(config_key.Handle(), - ASCIIToWide(exclusion_list_name).c_str()); - while (url_list.Valid()) { - renderer_exclusion_list_.push_back(url_list.Value()); - ++url_list; - } + EnumerateKeyValues(config_key.Handle(), + ASCIIToWide(exclusion_list_name).c_str(), &renderer_exclusion_list_); + DLOG(INFO) << "Default renderer as specified via policy: " << default_renderer_ << " exclusion list size: " << renderer_exclusion_list_.size(); } + + std::wstring sub_key(policy::kRegistrySubKey); + sub_key += L"\\"; + sub_key += ASCIIToWide(policy::key::kChromeFrameContentTypes); + + for (int i = 0; i < arraysize(root_key) && content_type_list_.size() == 0; + ++i) { + EnumerateKeyValues(root_key[i], sub_key.c_str(), &content_type_list_); + } } diff --git a/chrome_frame/policy_settings.h b/chrome_frame/policy_settings.h index a4c1267..f3eacac 100644 --- a/chrome_frame/policy_settings.h +++ b/chrome_frame/policy_settings.h @@ -32,6 +32,8 @@ class PolicySettings { RendererForUrl GetRendererForUrl(const wchar_t* url); + RendererForUrl GetRendererForContentType(const wchar_t* content_type); + protected: // Protected for now since the class is not thread safe. void RefreshFromRegistry(); @@ -39,6 +41,7 @@ class PolicySettings { protected: RendererForUrl default_renderer_; std::vector<std::wstring> renderer_exclusion_list_; + std::vector<std::wstring> content_type_list_; }; diff --git a/chrome_frame/protocol_sink_wrap.cc b/chrome_frame/protocol_sink_wrap.cc index ad46ca2..4b19bc0 100644 --- a/chrome_frame/protocol_sink_wrap.cc +++ b/chrome_frame/protocol_sink_wrap.cc @@ -17,6 +17,7 @@ #include "chrome_frame/bind_context_info.h" #include "chrome_frame/exception_barrier.h" #include "chrome_frame/function_stub.h" +#include "chrome_frame/policy_settings.h" #include "chrome_frame/utils.h" // BINDSTATUS_SERVER_MIMETYPEAVAILABLE == 54. Introduced in IE 8, so @@ -272,6 +273,12 @@ bool IsAdditionallySupportedContentType(const wchar_t* status_text) { return true; } + Singleton<PolicySettings> policy; + if (policy->GetRendererForContentType(status_text) == + PolicySettings::RENDER_IN_CHROME_FRAME) { + return true; + } + return false; } @@ -289,7 +296,6 @@ RendererType DetermineRendererTypeFromMetaData( const wchar_t* suggested_mime_type, const std::wstring& url, IWinInetHttpInfo* info) { - bool is_text_html = IsTextHtml(suggested_mime_type); bool is_supported_content_type = is_text_html || IsAdditionallySupportedContentType(suggested_mime_type); diff --git a/chrome_frame/test/policy_settings_unittest.cc b/chrome_frame/test/policy_settings_unittest.cc index 185ab23..a31e764 100644 --- a/chrome_frame/test/policy_settings_unittest.cc +++ b/chrome_frame/test/policy_settings_unittest.cc @@ -22,6 +22,7 @@ void DeleteChromeFramePolicyEntries(HKEY root) { ASCIIToWide(policy::key::kChromeFrameRendererSettings).c_str()); key.DeleteKey(ASCIIToWide(policy::key::kRenderInChromeFrameList).c_str()); key.DeleteKey(ASCIIToWide(policy::key::kRenderInHostList).c_str()); + key.DeleteKey(ASCIIToWide(policy::key::kChromeFrameContentTypes).c_str()); } } @@ -61,14 +62,32 @@ class TempRegKeyOverride { const wchar_t TempRegKeyOverride::kTempTestKeyPath[] = L"Software\\Chromium\\TempTestKeys"; +bool InitializePolicyKey(HKEY policy_root, RegKey* policy_key) { + EXPECT_TRUE(policy_key->Create(policy_root, policy::kRegistrySubKey, + KEY_ALL_ACCESS)); + return policy_key->Valid(); +} + +void WritePolicyList(RegKey* policy_key, const wchar_t* list_name, + const wchar_t* values[], int count) { + DCHECK(policy_key); + // Remove any previous settings + policy_key->DeleteKey(list_name); + + RegKey list_key; + EXPECT_TRUE(list_key.Create(policy_key->Handle(), list_name, KEY_ALL_ACCESS)); + for (int i = 0; i < count; ++i) { + EXPECT_TRUE(list_key.WriteValue(base::StringPrintf(L"%i", i).c_str(), + values[i])); + } +} + bool SetRendererSettings(HKEY policy_root, PolicySettings::RendererForUrl renderer, const wchar_t* exclusions[], int exclusion_count) { RegKey policy_key; - EXPECT_TRUE(policy_key.Create(policy_root, policy::kRegistrySubKey, - KEY_ALL_ACCESS)); - if (!policy_key.Valid()) + if (!InitializePolicyKey(policy_root, &policy_key)) return false; policy_key.WriteValue( @@ -77,19 +96,22 @@ bool SetRendererSettings(HKEY policy_root, std::wstring in_cf(ASCIIToWide(policy::key::kRenderInChromeFrameList)); std::wstring in_host(ASCIIToWide(policy::key::kRenderInHostList)); - // Remove any previous settings - policy_key.DeleteKey(in_cf.c_str()); - policy_key.DeleteKey(in_host.c_str()); - std::wstring exclusion_list( renderer == PolicySettings::RENDER_IN_CHROME_FRAME ? in_host : in_cf); - RegKey exclusion_key; - EXPECT_TRUE(exclusion_key.Create(policy_key.Handle(), exclusion_list.c_str(), - KEY_ALL_ACCESS)); - for (int i = 0; i < exclusion_count; ++i) { - EXPECT_TRUE(exclusion_key.WriteValue(base::StringPrintf(L"%i", i).c_str(), - exclusions[i])); - } + WritePolicyList(&policy_key, exclusion_list.c_str(), exclusions, + exclusion_count); + + return true; +} + +bool SetCFContentTypes(HKEY policy_root, const wchar_t* content_types[], + int count) { + RegKey policy_key; + if (!InitializePolicyKey(policy_root, &policy_key)) + return false; + + std::wstring type_list(ASCIIToWide(policy::key::kChromeFrameContentTypes)); + WritePolicyList(&policy_key, type_list.c_str(), content_types, count); return true; } @@ -117,10 +139,10 @@ TEST(PolicySettings, RendererForUrl) { const wchar_t kNoMatchUrl[] = L"http://www.chromium.org"; scoped_ptr<PolicySettings> settings(new PolicySettings()); - EXPECT_EQ(settings->default_renderer(), - PolicySettings::RENDERER_NOT_SPECIFIED); - EXPECT_EQ(settings->GetRendererForUrl(kNoMatchUrl), - PolicySettings::RENDERER_NOT_SPECIFIED); + EXPECT_EQ(PolicySettings::RENDERER_NOT_SPECIFIED, + settings->default_renderer()); + EXPECT_EQ(PolicySettings::RENDERER_NOT_SPECIFIED, + settings->GetRendererForUrl(kNoMatchUrl)); HKEY root[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER }; for (int i = 0; i < arraysize(root); ++i) { @@ -129,22 +151,22 @@ TEST(PolicySettings, RendererForUrl) { arraysize(kTestFilters))); settings.reset(new PolicySettings()); - EXPECT_EQ(settings->GetRendererForUrl(kNoMatchUrl), - PolicySettings::RENDER_IN_CHROME_FRAME); + EXPECT_EQ(PolicySettings::RENDER_IN_CHROME_FRAME, + settings->GetRendererForUrl(kNoMatchUrl)); for (int j = 0; j < arraysize(kTestUrls); ++j) { - EXPECT_EQ(settings->GetRendererForUrl(kTestUrls[j]), - PolicySettings::RENDER_IN_HOST); + EXPECT_EQ(PolicySettings::RENDER_IN_HOST, + settings->GetRendererForUrl(kTestUrls[j])); } EXPECT_TRUE(SetRendererSettings(root[i], PolicySettings::RENDER_IN_HOST, NULL, 0)); settings.reset(new PolicySettings()); - EXPECT_EQ(settings->GetRendererForUrl(kNoMatchUrl), - PolicySettings::RENDER_IN_HOST); + EXPECT_EQ(PolicySettings::RENDER_IN_HOST, + settings->GetRendererForUrl(kNoMatchUrl)); for (int j = 0; j < arraysize(kTestUrls); ++j) { - EXPECT_EQ(settings->GetRendererForUrl(kTestUrls[j]), - PolicySettings::RENDER_IN_HOST); + EXPECT_EQ(PolicySettings::RENDER_IN_HOST, + settings->GetRendererForUrl(kTestUrls[j])); } DeleteChromeFramePolicyEntries(root[i]); @@ -154,3 +176,40 @@ TEST(PolicySettings, RendererForUrl) { hklm_pol.reset(NULL); TempRegKeyOverride::DeleteAllTempKeys(); } + +TEST(PolicySettings, RendererForContentType) { + TempRegKeyOverride::DeleteAllTempKeys(); + + scoped_ptr<TempRegKeyOverride> hklm_pol( + new TempRegKeyOverride(HKEY_LOCAL_MACHINE, L"hklm_pol")); + scoped_ptr<TempRegKeyOverride> hkcu_pol( + new TempRegKeyOverride(HKEY_CURRENT_USER, L"hkcu_pol")); + + scoped_ptr<PolicySettings> settings(new PolicySettings()); + EXPECT_EQ(PolicySettings::RENDERER_NOT_SPECIFIED, + settings->GetRendererForContentType(L"text/xml")); + + const wchar_t* kTestPolicyContentTypes[] = { + L"application/xml", + L"text/xml", + L"application/pdf", + }; + + HKEY root[] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER }; + for (int i = 0; i < arraysize(root); ++i) { + SetCFContentTypes(root[i], kTestPolicyContentTypes, + arraysize(kTestPolicyContentTypes)); + settings.reset(new PolicySettings()); + for (int type = 0; type < arraysize(kTestPolicyContentTypes); ++type) { + EXPECT_EQ(PolicySettings::RENDER_IN_CHROME_FRAME, + settings->GetRendererForContentType( + kTestPolicyContentTypes[type])); + } + + EXPECT_EQ(PolicySettings::RENDERER_NOT_SPECIFIED, + settings->GetRendererForContentType(L"text/html")); + + DeleteChromeFramePolicyEntries(root[i]); + } +} + diff --git a/chrome_frame/utils.cc b/chrome_frame/utils.cc index ba621a2..ec631bd 100644 --- a/chrome_frame/utils.cc +++ b/chrome_frame/utils.cc @@ -1515,3 +1515,13 @@ void WaitWithMessageLoop(HANDLE* handles, int count, DWORD timeout) { } } +void EnumerateKeyValues(HKEY parent_key, const wchar_t* sub_key_name, + std::vector<std::wstring>* values) { + DCHECK(values); + RegistryValueIterator url_list(parent_key, sub_key_name); + while (url_list.Valid()) { + values->push_back(url_list.Value()); + ++url_list; + } +} + diff --git a/chrome_frame/utils.h b/chrome_frame/utils.h index 665ebca..8189faf 100644 --- a/chrome_frame/utils.h +++ b/chrome_frame/utils.h @@ -591,4 +591,9 @@ void PinModule(); // for a handle to be signaled. void WaitWithMessageLoop(HANDLE* handles, int count, DWORD timeout); +// Enumerates values in a key and adds them to an array. +// The names of the values are not returned. +void EnumerateKeyValues(HKEY parent_key, const wchar_t* sub_key_name, + std::vector<std::wstring>* values); + #endif // CHROME_FRAME_UTILS_H_ |