diff options
author | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-30 22:52:34 +0000 |
---|---|---|
committer | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-30 22:52:34 +0000 |
commit | 57319e14f7429ef47086acfa1acf1e7f75c956a7 (patch) | |
tree | 7c20eef391e725a52d47a17fb7446a2163afe330 /chrome_frame/utils.cc | |
parent | c1a9b640c320f20f6b797e103416195a14b2401d (diff) | |
download | chromium_src-57319e14f7429ef47086acfa1acf1e7f75c956a7.zip chromium_src-57319e14f7429ef47086acfa1acf1e7f75c956a7.tar.gz chromium_src-57319e14f7429ef47086acfa1acf1e7f75c956a7.tar.bz2 |
Add a setting to CF to remove 'chromeframe' from the UserAgent on a per-pattern basis.
Useful for testing and dealing with sites with broken UA parsing.
BUG=117157
TEST=chrome_frame_tests,chrome_frame_unittests,add a ExcludeUAFromDomain key to the CF settings, add some pattern values, observe that the UA string does not contain CF.
Review URL: http://codereview.chromium.org/9720001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129985 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/utils.cc')
-rw-r--r-- | chrome_frame/utils.cc | 106 |
1 files changed, 69 insertions, 37 deletions
diff --git a/chrome_frame/utils.cc b/chrome_frame/utils.cc index ba41167..8f98b31 100644 --- a/chrome_frame/utils.cc +++ b/chrome_frame/utils.cc @@ -35,6 +35,7 @@ #include "chrome_frame/html_utils.h" #include "chrome_frame/navigation_constraints.h" #include "chrome_frame/policy_settings.h" +#include "chrome_frame/registry_list_preferences_holder.h" #include "chrome_frame/simple_resource_loader.h" #include "googleurl/src/gurl.h" #include "googleurl/src/url_canon.h" @@ -47,25 +48,27 @@ using base::win::RegKey; // Note that these values are all lower case and are compared to // lower-case-transformed values. -const wchar_t kMetaTag[] = L"meta"; -const wchar_t kHttpEquivAttribName[] = L"http-equiv"; -const wchar_t kContentAttribName[] = L"content"; -const wchar_t kXUACompatValue[] = L"x-ua-compatible"; +const char kGCFProtocol[] = "gcf"; const wchar_t kBodyTag[] = L"body"; +const wchar_t kContentAttribName[] = L"content"; const wchar_t kChromeContentPrefix[] = L"chrome="; -const char kGCFProtocol[] = "gcf"; -const wchar_t kChromeProtocolPrefix[] = L"gcf:"; const wchar_t kChromeMimeType[] = L"application/chromepage"; -const wchar_t kPatchProtocols[] = L"PatchProtocols"; -const wchar_t kChromeFrameConfigKey[] = L"Software\\Google\\ChromeFrame"; -const wchar_t kRenderInGCFUrlList[] = L"RenderInGcfUrls"; -const wchar_t kRenderInHostUrlList[] = L"RenderInHostUrls"; -const wchar_t kEnableGCFRendererByDefault[] = L"IsDefaultRenderer"; +const wchar_t kChromeProtocolPrefix[] = L"gcf:"; +const wchar_t kHttpEquivAttribName[] = L"http-equiv"; const wchar_t kIexploreProfileName[] = L"iexplore"; +const wchar_t kMetaTag[] = L"meta"; const wchar_t kRundllProfileName[] = L"rundll32"; +const wchar_t kXUACompatValue[] = L"x-ua-compatible"; +// Registry key and value names related to Chrome Frame configuration options. const wchar_t kAllowUnsafeURLs[] = L"AllowUnsafeURLs"; +const wchar_t kChromeFrameConfigKey[] = L"Software\\Google\\ChromeFrame"; const wchar_t kEnableBuggyBhoIntercept[] = L"EnableBuggyBhoIntercept"; +const wchar_t kEnableGCFRendererByDefault[] = L"IsDefaultRenderer"; +const wchar_t kExcludeUAFromDomainList[] = L"ExcludeUAFromDomain"; +const wchar_t kPatchProtocols[] = L"PatchProtocols"; +const wchar_t kRenderInGCFUrlList[] = L"RenderInGcfUrls"; +const wchar_t kRenderInHostUrlList[] = L"RenderInHostUrls"; static const wchar_t kChromeFramePersistNPAPIReg[] = L"PersistNPAPIReg"; @@ -113,6 +116,14 @@ namespace { base::LazyInstance<base::ThreadLocalPointer<IBrowserService> > g_tls_browser_for_cf_navigation = LAZY_INSTANCE_INITIALIZER; +// Holds the cached preferences for the per-url render type settings. +base::LazyInstance<RegistryListPreferencesHolder>::Leaky + g_render_type_for_url_holder; + +// Holds the cached preferences for the per-url user agent filter. +base::LazyInstance<RegistryListPreferencesHolder>::Leaky + g_user_agent_filter_holder; + } // end anonymous namespace HRESULT UtilRegisterTypeLib(HINSTANCE tlb_instance, @@ -174,7 +185,7 @@ HRESULT UtilRegisterTypeLib(ITypeLib* typelib, OLECHAR FAR* full_path, OLECHAR FAR* help_dir); LPCSTR function_name = - for_current_user_only ? "RegisterTypeLibForUser" : "RegisterTypeLib"; + for_current_user_only ? "RegisterTypeLibForUser" : "RegisterTypeLib"; RegisterTypeLibPrototype reg_tlb = reinterpret_cast<RegisterTypeLibPrototype>( GetProcAddress(GetModuleHandle(_T("oleaut32.dll")), @@ -716,36 +727,32 @@ RendererType RendererTypeForUrl(const std::wstring& url) { RENDERER_TYPE_CHROME_OPT_IN_URL : RENDERER_TYPE_UNDETERMINED; } - RegKey config_key; - if (config_key.Open(HKEY_CURRENT_USER, kChromeFrameConfigKey, - KEY_READ) != ERROR_SUCCESS) { - return RENDERER_TYPE_UNDETERMINED; - } - - RendererType renderer_type = RENDERER_TYPE_UNDETERMINED; - - const wchar_t* url_list_name = NULL; - int render_in_cf_by_default = FALSE; - config_key.ReadValueDW(kEnableGCFRendererByDefault, - reinterpret_cast<DWORD*>(&render_in_cf_by_default)); - if (render_in_cf_by_default) { - url_list_name = kRenderInHostUrlList; - renderer_type = RENDERER_TYPE_CHROME_DEFAULT_RENDERER; - } else { - url_list_name = kRenderInGCFUrlList; - } + // TODO(robertshield): Move this into a holder-type class that listens + // for reg change events as well. + static int render_in_cf_by_default = FALSE; - bool match_found = false; - base::win::RegistryValueIterator url_list(config_key.Handle(), url_list_name); - while (!match_found && url_list.Valid()) { - if (MatchPattern(url, url_list.Name())) { - match_found = true; + RegistryListPreferencesHolder& render_type_for_url_holder = + g_render_type_for_url_holder.Get(); + if (!render_type_for_url_holder.Valid()) { + const wchar_t* url_list_name = kRenderInGCFUrlList; + if (IsGcfDefaultRenderer()) { + url_list_name = kRenderInHostUrlList; + render_in_cf_by_default = TRUE; } else { - ++url_list; + render_in_cf_by_default = FALSE; } + + render_type_for_url_holder.Init(HKEY_CURRENT_USER, + kChromeFrameConfigKey, + url_list_name); } + DCHECK(render_type_for_url_holder.Valid()); + + RendererType renderer_type = + render_in_cf_by_default ? RENDERER_TYPE_CHROME_DEFAULT_RENDERER : + RENDERER_TYPE_UNDETERMINED; - if (match_found) { + if (render_type_for_url_holder.ListMatches(url)) { renderer_type = render_in_cf_by_default ? RENDERER_TYPE_UNDETERMINED : RENDERER_TYPE_CHROME_OPT_IN_URL; @@ -754,6 +761,31 @@ RendererType RendererTypeForUrl(const std::wstring& url) { return renderer_type; } +bool ShouldRemoveUAForUrl(const string16& url) { + // TODO(robertshield): Wire up the stuff in PolicySettings here so the value + // can be specified via group policy. + // TODO(robertshield): Add a default list of exclusions here for site with + // known bad UA parsing. + RegistryListPreferencesHolder& user_agent_filter_holder = + g_user_agent_filter_holder.Get(); + if (!user_agent_filter_holder.Valid()) { + user_agent_filter_holder.Init(HKEY_CURRENT_USER, + kChromeFrameConfigKey, + kExcludeUAFromDomainList); + } + DCHECK(user_agent_filter_holder.Valid()); + + return user_agent_filter_holder.ListMatches(url); +} + +RegistryListPreferencesHolder& GetRendererTypePreferencesHolderForTesting() { + return g_render_type_for_url_holder.Get(); +} + +RegistryListPreferencesHolder& GetUserAgentPreferencesHolderForTesting() { + return g_user_agent_filter_holder.Get(); +} + HRESULT NavigateBrowserToMoniker(IUnknown* browser, IMoniker* moniker, const wchar_t* headers, IBindCtx* bind_ctx, const wchar_t* fragment, IStream* post_data, |