summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-04 23:07:40 +0000
committertommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-04 23:07:40 +0000
commit5ac670a3a8c4e3e2f2b7ed3ad1190f9ed34dd512 (patch)
treecff9275bd93bc02c09e2d9836a82b086745a9852
parent10da830b7fe028f85cf2167fadb64852cfe526ee (diff)
downloadchromium_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.grd9
-rw-r--r--chrome/app/policy/policy_templates.json14
-rw-r--r--chrome/common/policy_constants.cc1
-rw-r--r--chrome/common/policy_constants.h2
-rw-r--r--chrome_frame/policy_settings.cc34
-rw-r--r--chrome_frame/policy_settings.h3
-rw-r--r--chrome_frame/protocol_sink_wrap.cc8
-rw-r--r--chrome_frame/test/policy_settings_unittest.cc111
-rw-r--r--chrome_frame/utils.cc10
-rw-r--r--chrome_frame/utils.h5
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_