Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: chrome_frame/utils.cc

Issue 9720001: Add a setting to CF to remove 'chromeframe' from the UserAgent on a per-pattern basis. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Minor tweak to UA building. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« chrome_frame/utils.h ('K') | « chrome_frame/utils.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome_frame/utils.h" 5 #include "chrome_frame/utils.h"
6 6
7 #include <atlsafe.h> 7 #include <atlsafe.h>
8 #include <atlsecurity.h> 8 #include <atlsecurity.h>
9 #include <htiframe.h> 9 #include <htiframe.h>
10 #include <mshtml.h> 10 #include <mshtml.h>
(...skipping 17 matching lines...) Expand all
28 #include "base/win/scoped_variant.h" 28 #include "base/win/scoped_variant.h"
29 #include "chrome/common/automation_messages.h" 29 #include "chrome/common/automation_messages.h"
30 #include "chrome/common/chrome_paths_internal.h" 30 #include "chrome/common/chrome_paths_internal.h"
31 #include "chrome/common/url_constants.h" 31 #include "chrome/common/url_constants.h"
32 #include "chrome/installer/util/chrome_frame_distribution.h" 32 #include "chrome/installer/util/chrome_frame_distribution.h"
33 #include "chrome_frame/chrome_tab.h" 33 #include "chrome_frame/chrome_tab.h"
34 #include "chrome_frame/extra_system_apis.h" 34 #include "chrome_frame/extra_system_apis.h"
35 #include "chrome_frame/html_utils.h" 35 #include "chrome_frame/html_utils.h"
36 #include "chrome_frame/navigation_constraints.h" 36 #include "chrome_frame/navigation_constraints.h"
37 #include "chrome_frame/policy_settings.h" 37 #include "chrome_frame/policy_settings.h"
38 #include "chrome_frame/registry_list_preferences_holder.h"
38 #include "chrome_frame/simple_resource_loader.h" 39 #include "chrome_frame/simple_resource_loader.h"
39 #include "googleurl/src/gurl.h" 40 #include "googleurl/src/gurl.h"
40 #include "googleurl/src/url_canon.h" 41 #include "googleurl/src/url_canon.h"
41 #include "grit/chromium_strings.h" 42 #include "grit/chromium_strings.h"
42 #include "net/base/escape.h" 43 #include "net/base/escape.h"
43 #include "net/http/http_util.h" 44 #include "net/http/http_util.h"
44 #include "ui/base/models/menu_model.h" 45 #include "ui/base/models/menu_model.h"
45 46
46 using base::win::RegKey; 47 using base::win::RegKey;
47 48
48 // Note that these values are all lower case and are compared to 49 // Note that these values are all lower case and are compared to
grt (UTC plus 2) 2012/03/20 17:27:45 from the "no good deed goes unpunished" department
robertshield 2012/03/26 02:43:33 Reordered and updated the comment.
49 // lower-case-transformed values. 50 // lower-case-transformed values.
51 const char kGCFProtocol[] = "gcf";
52
53 const wchar_t kAllowUnsafeURLs[] = L"AllowUnsafeURLs";
54 const wchar_t kBodyTag[] = L"body";
55 const wchar_t kChromeFrameConfigKey[] = L"Software\\Google\\ChromeFrame";
56 const wchar_t kContentAttribName[] = L"content";
57 const wchar_t kChromeContentPrefix[] = L"chrome=";
58 const wchar_t kChromeMimeType[] = L"application/chromepage";
59 const wchar_t kChromeProtocolPrefix[] = L"gcf:";
60 const wchar_t kEnableBuggyBhoIntercept[] = L"EnableBuggyBhoIntercept";
61 const wchar_t kEnableGCFRendererByDefault[] = L"IsDefaultRenderer";
62 const wchar_t kExcludeUAFromDomainList[] = L"ExcludeUAFromDomain";
63 const wchar_t kHttpEquivAttribName[] = L"http-equiv";
64 const wchar_t kIexploreProfileName[] = L"iexplore";
50 const wchar_t kMetaTag[] = L"meta"; 65 const wchar_t kMetaTag[] = L"meta";
51 const wchar_t kHttpEquivAttribName[] = L"http-equiv";
52 const wchar_t kContentAttribName[] = L"content";
53 const wchar_t kXUACompatValue[] = L"x-ua-compatible";
54 const wchar_t kBodyTag[] = L"body";
55 const wchar_t kChromeContentPrefix[] = L"chrome=";
56 const char kGCFProtocol[] = "gcf";
57 const wchar_t kChromeProtocolPrefix[] = L"gcf:";
58 const wchar_t kChromeMimeType[] = L"application/chromepage";
59 const wchar_t kPatchProtocols[] = L"PatchProtocols"; 66 const wchar_t kPatchProtocols[] = L"PatchProtocols";
60 const wchar_t kChromeFrameConfigKey[] = L"Software\\Google\\ChromeFrame";
61 const wchar_t kRenderInGCFUrlList[] = L"RenderInGcfUrls"; 67 const wchar_t kRenderInGCFUrlList[] = L"RenderInGcfUrls";
62 const wchar_t kRenderInHostUrlList[] = L"RenderInHostUrls"; 68 const wchar_t kRenderInHostUrlList[] = L"RenderInHostUrls";
63 const wchar_t kEnableGCFRendererByDefault[] = L"IsDefaultRenderer";
64 const wchar_t kIexploreProfileName[] = L"iexplore";
65 const wchar_t kRundllProfileName[] = L"rundll32"; 69 const wchar_t kRundllProfileName[] = L"rundll32";
66 70 const wchar_t kXUACompatValue[] = L"x-ua-compatible";
67 const wchar_t kAllowUnsafeURLs[] = L"AllowUnsafeURLs";
68 const wchar_t kEnableBuggyBhoIntercept[] = L"EnableBuggyBhoIntercept";
69 71
70 static const wchar_t kChromeFramePersistNPAPIReg[] = L"PersistNPAPIReg"; 72 static const wchar_t kChromeFramePersistNPAPIReg[] = L"PersistNPAPIReg";
71 73
72 const char kAttachExternalTabPrefix[] = "attach_external_tab"; 74 const char kAttachExternalTabPrefix[] = "attach_external_tab";
73 75
74 // Indicates that we are running in a test environment, where execptions, etc 76 // Indicates that we are running in a test environment, where execptions, etc
75 // are handled by the chrome test crash server. 77 // are handled by the chrome test crash server.
76 const wchar_t kChromeFrameHeadlessMode[] = L"ChromeFrameHeadlessMode"; 78 const wchar_t kChromeFrameHeadlessMode[] = L"ChromeFrameHeadlessMode";
77 79
78 // Indicates that we are running in an environment that expects chrome renderer 80 // Indicates that we are running in an environment that expects chrome renderer
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 } 169 }
168 170
169 HRESULT UtilRegisterTypeLib(ITypeLib* typelib, 171 HRESULT UtilRegisterTypeLib(ITypeLib* typelib,
170 LPCWSTR typelib_path, 172 LPCWSTR typelib_path,
171 LPCWSTR help_dir, 173 LPCWSTR help_dir,
172 bool for_current_user_only) { 174 bool for_current_user_only) {
173 typedef HRESULT(WINAPI *RegisterTypeLibPrototype)(ITypeLib FAR* type_lib, 175 typedef HRESULT(WINAPI *RegisterTypeLibPrototype)(ITypeLib FAR* type_lib,
174 OLECHAR FAR* full_path, 176 OLECHAR FAR* full_path,
175 OLECHAR FAR* help_dir); 177 OLECHAR FAR* help_dir);
176 LPCSTR function_name = 178 LPCSTR function_name =
177 for_current_user_only ? "RegisterTypeLibForUser" : "RegisterTypeLib"; 179 for_current_user_only ? "RegisterTypeLibForUser" : "RegisterTypeLib";
178 RegisterTypeLibPrototype reg_tlb = 180 RegisterTypeLibPrototype reg_tlb =
179 reinterpret_cast<RegisterTypeLibPrototype>( 181 reinterpret_cast<RegisterTypeLibPrototype>(
180 GetProcAddress(GetModuleHandle(_T("oleaut32.dll")), 182 GetProcAddress(GetModuleHandle(_T("oleaut32.dll")),
181 function_name)); 183 function_name));
182 if (NULL == reg_tlb) { 184 if (NULL == reg_tlb) {
183 return E_FAIL; 185 return E_FAIL;
184 } 186 }
185 return reg_tlb(typelib, 187 return reg_tlb(typelib,
186 const_cast<OLECHAR*>(typelib_path), 188 const_cast<OLECHAR*>(typelib_path),
187 const_cast<OLECHAR*>(help_dir)); 189 const_cast<OLECHAR*>(help_dir));
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 PolicySettings::GetInstance()->GetRendererForUrl(url.c_str()); 711 PolicySettings::GetInstance()->GetRendererForUrl(url.c_str());
710 if (renderer != PolicySettings::RENDERER_NOT_SPECIFIED) { 712 if (renderer != PolicySettings::RENDERER_NOT_SPECIFIED) {
711 // We may know at this point that policy says do NOT render in Chrome Frame. 713 // We may know at this point that policy says do NOT render in Chrome Frame.
712 // To maintain consistency, we return RENDERER_TYPE_UNDETERMINED so that 714 // To maintain consistency, we return RENDERER_TYPE_UNDETERMINED so that
713 // content sniffing, etc. still take place. 715 // content sniffing, etc. still take place.
714 // TODO(tommi): Clarify the intent here. 716 // TODO(tommi): Clarify the intent here.
715 return (renderer == PolicySettings::RENDER_IN_CHROME_FRAME) ? 717 return (renderer == PolicySettings::RENDER_IN_CHROME_FRAME) ?
716 RENDERER_TYPE_CHROME_OPT_IN_URL : RENDERER_TYPE_UNDETERMINED; 718 RENDERER_TYPE_CHROME_OPT_IN_URL : RENDERER_TYPE_UNDETERMINED;
717 } 719 }
718 720
719 RegKey config_key; 721 static int render_in_cf_by_default = FALSE;
720 if (config_key.Open(HKEY_CURRENT_USER, kChromeFrameConfigKey, 722 static RegistryListPreferencesHolder render_type_for_url_holder;
grt (UTC plus 2) 2012/03/20 17:27:45 this introduces an exit-time call to a dtor. if l
robertshield 2012/03/26 02:43:33 Done.
721 KEY_READ) != ERROR_SUCCESS) {
722 return RENDERER_TYPE_UNDETERMINED;
723 }
724 723
725 RendererType renderer_type = RENDERER_TYPE_UNDETERMINED; 724 RendererType renderer_type = RENDERER_TYPE_UNDETERMINED;
725 if (!render_type_for_url_holder.Valid()) {
grt (UTC plus 2) 2012/03/20 17:27:45 i think this is equivalent, but smaller: if (!re
robertshield 2012/03/26 02:43:33 Done.
726 RegKey config_key;
727 if (config_key.Open(HKEY_CURRENT_USER, kChromeFrameConfigKey,
728 KEY_READ) == ERROR_SUCCESS) {
729 config_key.ReadValueDW(
730 kEnableGCFRendererByDefault,
731 reinterpret_cast<DWORD*>(&render_in_cf_by_default));
726 732
727 const wchar_t* url_list_name = NULL; 733 const wchar_t* url_list_name = NULL;
728 int render_in_cf_by_default = FALSE; 734 if (render_in_cf_by_default) {
729 config_key.ReadValueDW(kEnableGCFRendererByDefault, 735 url_list_name = kRenderInHostUrlList;
730 reinterpret_cast<DWORD*>(&render_in_cf_by_default)); 736 renderer_type = RENDERER_TYPE_CHROME_DEFAULT_RENDERER;
731 if (render_in_cf_by_default) { 737 } else {
732 url_list_name = kRenderInHostUrlList; 738 url_list_name = kRenderInGCFUrlList;
733 renderer_type = RENDERER_TYPE_CHROME_DEFAULT_RENDERER; 739 }
734 } else {
735 url_list_name = kRenderInGCFUrlList;
736 }
737 740
738 bool match_found = false; 741 render_type_for_url_holder.Init(HKEY_CURRENT_USER,
739 base::win::RegistryValueIterator url_list(config_key.Handle(), url_list_name); 742 kChromeFrameConfigKey,
740 while (!match_found && url_list.Valid()) { 743 url_list_name);
741 if (MatchPattern(url, url_list.Name())) {
742 match_found = true;
743 } else {
744 ++url_list;
745 } 744 }
746 } 745 }
747 746
748 if (match_found) { 747 if (render_type_for_url_holder.ListMatches(url)) {
749 renderer_type = render_in_cf_by_default ? 748 renderer_type = render_in_cf_by_default ?
750 RENDERER_TYPE_UNDETERMINED : 749 RENDERER_TYPE_UNDETERMINED :
751 RENDERER_TYPE_CHROME_OPT_IN_URL; 750 RENDERER_TYPE_CHROME_OPT_IN_URL;
752 } 751 }
753 752
754 return renderer_type; 753 return renderer_type;
755 } 754 }
756 755
756 UserAgentAction ShouldRemoveUAForUrl(const string16& url) {
757 // TODO(robertshield): Wire up the stuff in PolicySettings here so the value
758 // can be specified via group policy.
759 static RegistryListPreferencesHolder user_agent_filter_holder;
grt (UTC plus 2) 2012/03/20 17:27:45 see note above about static dtors and threadsafety
robertshield 2012/03/26 02:43:33 Done.
760 if (!user_agent_filter_holder.Valid()) {
761 user_agent_filter_holder.Init(HKEY_CURRENT_USER,
762 kChromeFrameConfigKey,
763 kExcludeUAFromDomainList);
slightlyoff1 2012/03/20 15:31:56 My biggest concern here is that we'll provide some
robertshield 2012/03/26 02:43:33 That sounds reasonable, but I'd like to tackle tha
764 }
765
766 if (user_agent_filter_holder.ListMatches(url)) {
grt (UTC plus 2) 2012/03/20 17:27:45 nit: remove braces
robertshield 2012/03/26 02:43:33 Done.
767 return USER_AGENT_REMOVE;
768 }
769 return USER_AGENT_DEFAULT;
770 }
771
757 HRESULT NavigateBrowserToMoniker(IUnknown* browser, IMoniker* moniker, 772 HRESULT NavigateBrowserToMoniker(IUnknown* browser, IMoniker* moniker,
758 const wchar_t* headers, IBindCtx* bind_ctx, 773 const wchar_t* headers, IBindCtx* bind_ctx,
759 const wchar_t* fragment, IStream* post_data, 774 const wchar_t* fragment, IStream* post_data,
760 VARIANT* flags) { 775 VARIANT* flags) {
761 DCHECK(browser); 776 DCHECK(browser);
762 DCHECK(moniker); 777 DCHECK(moniker);
763 DCHECK(bind_ctx); 778 DCHECK(bind_ctx);
764 779
765 base::win::ScopedComPtr<IWebBrowser2> web_browser2; 780 base::win::ScopedComPtr<IWebBrowser2> web_browser2;
766 HRESULT hr = DoQueryService(SID_SWebBrowserApp, browser, 781 HRESULT hr = DoQueryService(SID_SWebBrowserApp, browser,
(...skipping 865 matching lines...) Expand 10 before | Expand all | Expand 10 after
1632 1647
1633 ret = InternetSetOption(NULL, connection_options[option_index], 1648 ret = InternetSetOption(NULL, connection_options[option_index],
1634 &connections, connection_value_size); 1649 &connections, connection_value_size);
1635 if (!ret) { 1650 if (!ret) {
1636 return false; 1651 return false;
1637 } 1652 }
1638 } 1653 }
1639 wininet_connection_count_updated = true; 1654 wininet_connection_count_updated = true;
1640 return true; 1655 return true;
1641 } 1656 }
OLDNEW
« chrome_frame/utils.h ('K') | « chrome_frame/utils.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698