Home | History | Annotate | Download | only in chrome_frame
      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.
      4 
      5 #ifndef CHROME_FRAME_UTILS_H_
      6 #define CHROME_FRAME_UTILS_H_
      7 
      8 #include <OAidl.h>
      9 #include <objidl.h>
     10 #include <windows.h>
     11 #include <wininet.h>
     12 #include <string>
     13 #include <vector>
     14 
     15 #include "base/basictypes.h"
     16 #include "base/logging.h"
     17 #include "base/metrics/histogram.h"
     18 #include "base/strings/string16.h"
     19 #include "base/win/scoped_comptr.h"
     20 #include "ui/gfx/rect.h"
     21 #include "url/gurl.h"
     22 
     23 class RegistryListPreferencesHolder;
     24 interface IBrowserService;
     25 interface IWebBrowser2;
     26 struct ContextMenuModel;
     27 
     28 namespace base {
     29 class FilePath;
     30 }
     31 
     32 // utils.h : Various utility functions and classes
     33 extern const char kGCFProtocol[];
     34 
     35 extern const wchar_t kAllowUnsafeURLs[];
     36 extern const wchar_t kChromeContentPrefix[];
     37 extern const wchar_t kChromeFrameAccessibleMode[];
     38 extern const wchar_t kChromeFrameAttachTabPattern[];
     39 extern const wchar_t kChromeFrameConfigKey[];
     40 extern const wchar_t kChromeFrameHeadlessMode[];
     41 extern const wchar_t kChromeFrameUnpinnedMode[];
     42 extern const wchar_t kChromeMimeType[];
     43 extern const wchar_t kChromeProtocolPrefix[];
     44 extern const wchar_t kEnableBuggyBhoIntercept[];
     45 extern const wchar_t kEnableGCFRendererByDefault[];
     46 extern const wchar_t kExcludeUAFromDomainList[];
     47 extern const wchar_t kIexploreProfileName[];
     48 extern const wchar_t kRenderInGCFUrlList[];
     49 extern const wchar_t kRenderInHostUrlList[];
     50 extern const wchar_t kRundllProfileName[];
     51 extern const wchar_t kUseBackgroundThreadForSubResources[];
     52 
     53 // This function is very similar to the AtlRegisterTypeLib function except
     54 // that it takes a parameter that specifies whether to register the typelib
     55 // for the current user only or on a machine-wide basis
     56 // Refer to the MSDN documentation for AtlRegisterTypeLib for a description of
     57 // the arguments
     58 HRESULT UtilRegisterTypeLib(HINSTANCE tlb_instance,
     59                             LPCOLESTR index,
     60                             bool for_current_user_only);
     61 
     62 // This function is very similar to the AtlUnRegisterTypeLib function except
     63 // that it takes a parameter that specifies whether to unregister the typelib
     64 // for the current user only or on a machine-wide basis
     65 // Refer to the MSDN documentation for AtlUnRegisterTypeLib for a description
     66 // of the arguments
     67 HRESULT UtilUnRegisterTypeLib(HINSTANCE tlb_instance,
     68                               LPCOLESTR index,
     69                               bool for_current_user_only);
     70 
     71 HRESULT UtilRegisterTypeLib(LPCWSTR typelib_path, bool for_current_user_only);
     72 
     73 HRESULT UtilUnRegisterTypeLib(LPCWSTR typelib_path, bool for_current_user_only);
     74 
     75 HRESULT UtilRegisterTypeLib(ITypeLib* typelib,
     76                             LPCWSTR typelib_path,
     77                             LPCWSTR help_dir,
     78                             bool for_current_user_only);
     79 
     80 HRESULT UtilUnRegisterTypeLib(ITypeLib* typelib,
     81                               bool for_current_user_only);
     82 
     83 // Clears a marker that causes legacy NPAPI registration to persist across
     84 // updates. Returns false if the marker could not be removed.
     85 bool UtilRemovePersistentNPAPIMarker();
     86 
     87 // Given an HTML fragment, this function looks for the
     88 // <meta http-equiv="X-UA-Compatible"> tag and extracts the value of the
     89 // "content" attribute
     90 // This method will currently return a false positive if the tag appears
     91 // inside a string in a <SCRIPT> block.
     92 HRESULT UtilGetXUACompatContentValue(const std::wstring& html_string,
     93                                      std::wstring* content_value);
     94 
     95 // Returns a string from ChromeFrame's string table by resource. Must be
     96 // provided with a valid resource id.
     97 std::wstring GetResourceString(int resource_id);
     98 
     99 // Displays a message box indicating that there was a version mismatch between
    100 // ChromeFrame and the running instance of Chrome.
    101 // server_version is the version of the running instance of Chrome.
    102 void DisplayVersionMismatchWarning(HWND parent,
    103                                    const std::string& server_version);
    104 
    105 // This class provides a base implementation for ATL modules which want to
    106 // perform all their registration under HKCU. This class overrides the
    107 // RegisterServer and UnregisterServer methods and registers the type libraries
    108 // under HKCU (the rest of the registration is made under HKCU by changing the
    109 // appropriate .RGS files)
    110 template < class BaseAtlModule >
    111 class AtlPerUserModule : public BaseAtlModule {
    112  public:
    113   HRESULT RegisterServer(BOOL reg_typelib = FALSE,
    114                          const CLSID* clsid = NULL) throw() {
    115     HRESULT hr = BaseAtlModule::RegisterServer(FALSE, clsid);
    116     if (FAILED(hr)) {
    117       return hr;
    118     }
    119     if (reg_typelib)  {
    120       hr = UtilRegisterTypeLib(_AtlComModule.m_hInstTypeLib, NULL, false);
    121     }
    122     return hr;
    123   }
    124 
    125   HRESULT UnregisterServer(BOOL unreg_typelib,
    126                            const CLSID* clsid = NULL) throw() {
    127     HRESULT hr = BaseAtlModule::UnregisterServer(FALSE, clsid);
    128     if (FAILED(hr)) {
    129       return hr;
    130     }
    131     if (unreg_typelib)  {
    132       hr = UtilUnRegisterTypeLib(_AtlComModule.m_hInstTypeLib, NULL, false);
    133     }
    134     return hr;
    135   }
    136 };
    137 
    138 // Creates a javascript statement for execution from the function name and
    139 // arguments passed in.
    140 std::string CreateJavascript(const std::string& function_name,
    141                              const std::string args);
    142 
    143 // Use to prevent the DLL from being unloaded while there are still living
    144 // objects with outstanding references.
    145 class AddRefModule {
    146  public:
    147   AddRefModule();
    148   ~AddRefModule();
    149 };
    150 
    151 // Retrieves the executable name of the process hosting us. If
    152 // |include_extension| is false, then we strip the extension from the name.
    153 std::wstring GetHostProcessName(bool include_extension);
    154 
    155 typedef enum BrowserType {
    156   BROWSER_INVALID = -1,
    157   BROWSER_UNKNOWN,
    158   BROWSER_IE,
    159 };
    160 
    161 BrowserType GetBrowserType();
    162 
    163 typedef enum IEVersion {
    164   IE_INVALID,
    165   NON_IE,
    166   IE_UNSUPPORTED,
    167   IE_6,
    168   IE_7,
    169   IE_8,
    170   IE_9,
    171   IE_10,
    172 };
    173 
    174 // The renderer to be used for a page.  Values for Chrome also convey the
    175 // reason why Chrome is used.
    176 enum RendererType {
    177   RENDERER_TYPE_UNDETERMINED = 0,
    178   RENDERER_TYPE_CHROME_MIN,
    179   // NOTE: group all _CHROME_ values together below here, as they are used for
    180   // generating metrics reported via UMA (adjust MIN/MAX as needed).
    181   RENDERER_TYPE_CHROME_GCF_PROTOCOL = RENDERER_TYPE_CHROME_MIN,
    182   RENDERER_TYPE_CHROME_HTTP_EQUIV,
    183   RENDERER_TYPE_CHROME_RESPONSE_HEADER,
    184   RENDERER_TYPE_CHROME_DEFAULT_RENDERER,
    185   RENDERER_TYPE_CHROME_OPT_IN_URL,
    186   RENDERER_TYPE_CHROME_WIDGET,
    187   // NOTE: all _CHOME_ values must go above here (adjust MIN/MAX as needed).
    188   RENDERER_TYPE_CHROME_MAX = RENDERER_TYPE_CHROME_WIDGET,
    189   RENDERER_TYPE_OTHER,
    190 };
    191 
    192 // Returns true if the given RendererType represents Chrome.
    193 bool IsChrome(RendererType renderer_type);
    194 
    195 // Convenience macro for logging a sample for the launch type metric.
    196 #define UMA_LAUNCH_TYPE_COUNT(sample) \
    197   UMA_HISTOGRAM_CUSTOM_COUNTS("ChromeFrame.LaunchType", sample, \
    198   RENDERER_TYPE_CHROME_MIN, RENDERER_TYPE_CHROME_MAX, \
    199   RENDERER_TYPE_CHROME_MAX + 1 - RENDERER_TYPE_CHROME_MIN)
    200 
    201 // To get the IE version when Chrome Frame is hosted in IE.  Make sure that
    202 // the hosting browser is IE before calling this function, otherwise NON_IE
    203 // will be returned.
    204 //
    205 // Versions newer than the newest supported version are reported as the newest
    206 // supported version.
    207 IEVersion GetIEVersion();
    208 
    209 // Returns the actual major version of the IE in which the current process is
    210 // hosted. Returns 0 if the current process is not IE or any other error occurs.
    211 uint32 GetIEMajorVersion();
    212 
    213 base::FilePath GetIETemporaryFilesFolder();
    214 
    215 // Retrieves the file version from a module handle without extra round trips
    216 // to the disk (as happens with the regular GetFileVersionInfo API).
    217 //
    218 // @param module A handle to the module for which to retrieve the version info.
    219 // @param high On successful return holds the most significant part of the file
    220 // version.  Must be non-null.
    221 // @param low On successful return holds the least significant part of the file
    222 // version.  May be NULL.
    223 // @returns true if the version info was successfully retrieved.
    224 bool GetModuleVersion(HMODULE module, uint32* high, uint32* low);
    225 
    226 // Return if the IEXPLORE is in private mode. The IEIsInPrivateBrowsing() checks
    227 // whether current process is IEXPLORE.
    228 bool IsIEInPrivate();
    229 
    230 // Calls [ieframe|shdocvw]!DoFileDownload to initiate a download.
    231 HRESULT DoFileDownloadInIE(const wchar_t* url);
    232 
    233 // Construct a menu from the model sent from Chrome.
    234 HMENU BuildContextMenu(const ContextMenuModel& menu_model);
    235 
    236 // Uses GURL internally to append 'relative' to 'document'
    237 std::string ResolveURL(const std::string& document,
    238                        const std::string& relative);
    239 
    240 // Returns true iff the two urls have the same scheme, same host and same port.
    241 bool HaveSameOrigin(const std::string& url1, const std::string& url2);
    242 
    243 // Get a boolean configuration value from registry.
    244 bool GetConfigBool(bool default_value, const wchar_t* value_name);
    245 
    246 // Gets an integer configuration value from the registry.
    247 int GetConfigInt(int default_value, const wchar_t* value_name);
    248 
    249 // Gets a 64-bit integer configuration value from the registry.
    250 int64 GetConfigInt64(int64 default_value, const wchar_t* value_name);
    251 
    252 // Sets an integer configuration value in the registry.
    253 bool SetConfigInt(const wchar_t* value_name, int value);
    254 
    255 // Sets a boolean integer configuration value in the registry.
    256 bool SetConfigBool(const wchar_t* value_name, bool value);
    257 
    258 // Sets a 64-bit integer configuration value in the registry.
    259 bool SetConfigInt64(const wchar_t* value_name, int64 value);
    260 
    261 // Deletes the configuration value passed in.
    262 bool DeleteConfigValue(const wchar_t* value_name);
    263 
    264 // Returns true if we are running in headless mode in which case we need to
    265 // gather crash dumps, etc to send them to the crash server.
    266 bool IsHeadlessMode();
    267 
    268 // Returns true if we are running in accessible mode in which we need to enable
    269 // renderer accessibility for use in automation.
    270 bool IsAccessibleMode();
    271 
    272 // Returns true if we are running in unpinned mode in which case DLL
    273 // eviction should be possible.
    274 bool IsUnpinnedMode();
    275 
    276 // Returns true if all HTML pages should be rendered in GCF by default.
    277 bool IsGcfDefaultRenderer();
    278 
    279 // Check if this url is opting into Chrome Frame based on static settings.
    280 // Returns one of:
    281 // - RENDERER_TYPE_UNDETERMINED if not opt-in or if explicit opt-out
    282 // - RENDERER_TYPE_CHROME_DEFAULT_RENDERER
    283 // - RENDERER_TYPE_CHROME_OPT_IN_URL
    284 RendererType RendererTypeForUrl(const std::wstring& url);
    285 
    286 // Check if we should try to remove the CF user agent based on registry
    287 // settings.
    288 bool ShouldRemoveUAForUrl(const string16& url);
    289 
    290 // Testing methods that return the backing stores behind RendererTypeForUrl and
    291 // ShouldRemoveUAForUrl. Intended to allow unit testing code that calls the
    292 // above methods.
    293 // TODO(robertshield): All of the FooForUrl code should be removed from here
    294 // and further refactored.
    295 RegistryListPreferencesHolder& GetRendererTypePreferencesHolderForTesting();
    296 RegistryListPreferencesHolder& GetUserAgentPreferencesHolderForTesting();
    297 
    298 // A shortcut for QueryService
    299 template <typename T>
    300 HRESULT DoQueryService(const IID& service_id, IUnknown* unk, T** service) {
    301   DCHECK(service);
    302   if (!unk)
    303     return E_INVALIDARG;
    304 
    305   base::win::ScopedComPtr<IServiceProvider> service_provider;
    306   HRESULT hr = service_provider.QueryFrom(unk);
    307   if (service_provider)
    308     hr = service_provider->QueryService(service_id, service);
    309 
    310   DCHECK(FAILED(hr) || *service);
    311   return hr;
    312 }
    313 
    314 // Navigates an IWebBrowser2 object to a moniker.
    315 // |headers| can be NULL.
    316 HRESULT NavigateBrowserToMoniker(IUnknown* browser, IMoniker* moniker,
    317                                  const wchar_t* headers, IBindCtx* bind_ctx,
    318                                  const wchar_t* fragment, IStream* post_data,
    319                                  VARIANT* flags);
    320 
    321 // Raises a flag on the current thread (using TLS) to indicate that an
    322 // in-progress navigation should be rendered in chrome frame.
    323 void MarkBrowserOnThreadForCFNavigation(IBrowserService* browser);
    324 
    325 // Checks if this browser instance has been marked as currently navigating
    326 // to a CF document.  If clear_flag is set to true, the tls flag is cleared but
    327 // only if the browser has been marked.
    328 bool CheckForCFNavigation(IBrowserService* browser, bool clear_flag);
    329 
    330 // Returns true if the URL passed in is something which can be handled by
    331 // Chrome. If this function returns false then we should fail the navigation.
    332 // When is_privileged is true, chrome extension URLs will be considered valid.
    333 bool IsValidUrlScheme(const GURL& url, bool is_privileged);
    334 
    335 // Returns the raw http headers for the current request given an
    336 // IWinInetHttpInfo pointer.
    337 std::string GetRawHttpHeaders(IWinInetHttpInfo* info);
    338 
    339 // Can be used to determine whether a given request is being performed for
    340 // a sub-frame or iframe in Internet Explorer. This can be called
    341 // from various places, notably in request callbacks and the like.
    342 //
    343 // |service_provider| must not be NULL and should be a pointer to something
    344 // that implements IServiceProvider (if it isn't this method returns false).
    345 //
    346 // Returns true if this method can determine with some certainty that the
    347 // request did NOT originate from a top level frame, returns false otherwise.
    348 bool IsSubFrameRequest(IUnknown* service_provider);
    349 
    350 // See COM_INTERFACE_BLIND_DELEGATE below for details.
    351 template <class T>
    352 STDMETHODIMP CheckOutgoingInterface(void* obj, REFIID iid, void** ret,
    353                                     DWORD cookie) {
    354   T* instance = reinterpret_cast<T*>(obj);
    355   HRESULT hr = E_NOINTERFACE;
    356   IUnknown* delegate = instance ? instance->delegate() : NULL;
    357   if (delegate) {
    358     hr = delegate->QueryInterface(iid, ret);
    359 #if !defined(NDEBUG)
    360     if (SUCCEEDED(hr)) {
    361       wchar_t iid_string[64] = {0};
    362       StringFromGUID2(iid, iid_string, arraysize(iid_string));
    363       DVLOG(1) << __FUNCTION__ << " Giving out wrapped interface: "
    364                << iid_string;
    365     }
    366 #endif
    367   }
    368 
    369   return hr;
    370 }
    371 
    372 // See COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS below for details.
    373 template <class T>
    374 STDMETHODIMP QueryInterfaceIfDelegateSupports(void* obj, REFIID iid,
    375                                               void** ret, DWORD cookie) {
    376   HRESULT hr = E_NOINTERFACE;
    377   T* instance = reinterpret_cast<T*>(obj);
    378   IUnknown* delegate = instance ? instance->delegate() : NULL;
    379   if (delegate) {
    380     base::win::ScopedComPtr<IUnknown> original;
    381     hr = delegate->QueryInterface(iid,
    382                                   reinterpret_cast<void**>(original.Receive()));
    383     if (original) {
    384       IUnknown* supported_interface = reinterpret_cast<IUnknown*>(
    385           reinterpret_cast<DWORD_PTR>(obj) + cookie);
    386       supported_interface->AddRef();
    387       *ret = supported_interface;
    388       hr = S_OK;
    389     }
    390   }
    391 
    392   return hr;
    393 }
    394 
    395 // Same as COM_INTERFACE_ENTRY but relies on the class to implement a
    396 // delegate() method that returns a pointer to the delegated COM object.
    397 #define COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS(x) \
    398     COM_INTERFACE_ENTRY_FUNC(_ATL_IIDOF(x), \
    399         offsetofclass(x, _ComMapClass), \
    400         QueryInterfaceIfDelegateSupports<_ComMapClass>)
    401 
    402 // Queries the delegated COM object for an interface, bypassing the wrapper.
    403 #define COM_INTERFACE_BLIND_DELEGATE() \
    404     COM_INTERFACE_ENTRY_FUNC_BLIND(0, CheckOutgoingInterface<_ComMapClass>)
    405 
    406 std::wstring GuidToString(const GUID& guid);
    407 
    408 // The urls retrieved from the IMoniker interface don't contain the anchor
    409 // portion of the actual url navigated to. This function checks whether the
    410 // url passed in the bho_url parameter contains an anchor and if yes checks
    411 // whether it matches the url retrieved from the moniker. If yes it returns
    412 // the bho url, if not the moniker url.
    413 std::wstring GetActualUrlFromMoniker(IMoniker* moniker,
    414                                      IBindCtx* bind_context,
    415                                      const std::wstring& bho_url);
    416 
    417 // Checks if a window is a top level window
    418 bool IsTopLevelWindow(HWND window);
    419 
    420 // Seeks a stream back to position 0.
    421 HRESULT RewindStream(IStream* stream);
    422 
    423 // Fired when we want to notify IE about privacy changes.
    424 #define WM_FIRE_PRIVACY_CHANGE_NOTIFICATION (WM_APP + 1)
    425 
    426 // Sent (not posted) when a request needs to be downloaded in the host browser
    427 // instead of Chrome.  WPARAM is 0 and LPARAM is a pointer to an IMoniker
    428 // object.
    429 // NOTE: Since the message is sent synchronously, the handler should only
    430 // start asynchronous operations in order to not block the sender unnecessarily.
    431 #define WM_DOWNLOAD_IN_HOST (WM_APP + 2)
    432 
    433 // This structure contains the parameters sent over to initiate a download
    434 // request in the host browser.
    435 struct DownloadInHostParams {
    436   base::win::ScopedComPtr<IBindCtx> bind_ctx;
    437   base::win::ScopedComPtr<IMoniker> moniker;
    438   base::win::ScopedComPtr<IStream> post_data;
    439   std::string request_headers;
    440 };
    441 
    442 // Maps the InternetCookieState enum to the corresponding CookieAction values
    443 // used for IE privacy stuff.
    444 int32 MapCookieStateToCookieAction(InternetCookieState cookie_state);
    445 
    446 // Parses the url passed in and returns a GURL instance without the fragment.
    447 GURL GetUrlWithoutFragment(const wchar_t* url);
    448 
    449 // Compares the URLs passed in after removing the fragments from them.
    450 bool CompareUrlsWithoutFragment(const wchar_t* url1, const wchar_t* url2);
    451 
    452 // Returns the Referrer from the HTTP headers and additional headers.
    453 std::string FindReferrerFromHeaders(const wchar_t* headers,
    454                                      const wchar_t* additional_headers);
    455 
    456 // Returns the HTTP headers from the binding passed in.
    457 std::string GetHttpHeadersFromBinding(IBinding* binding);
    458 
    459 // Returns the HTTP response code from the binding passed in.
    460 int GetHttpResponseStatusFromBinding(IBinding* binding);
    461 
    462 // Returns the clipboard format for text/html.
    463 CLIPFORMAT GetTextHtmlClipboardFormat();
    464 
    465 // Returns true iff the mime type is text/html.
    466 bool IsTextHtmlMimeType(const wchar_t* mime_type);
    467 
    468 // Returns true iff the clipboard format is text/html.
    469 bool IsTextHtmlClipFormat(CLIPFORMAT cf);
    470 
    471 // Returns true if we can detect that we are running as SYSTEM, false otherwise.
    472 bool IsSystemProcess();
    473 
    474 // STL helper class that implements a functor to delete objects.
    475 // E.g: std::for_each(v.begin(), v.end(), utils::DeleteObject());
    476 namespace utils {
    477 class DeleteObject {
    478  public:
    479   template <typename T>
    480   void operator()(T* obj) {
    481     delete obj;
    482   }
    483 };
    484 }
    485 
    486 // Convert various protocol flags to text representation. Used for logging.
    487 std::string BindStatus2Str(ULONG bind_status);
    488 std::string PiFlags2Str(DWORD flags);
    489 std::string Bscf2Str(DWORD flags);
    490 
    491 // Reads data from a stream into a string.
    492 HRESULT ReadStream(IStream* stream, size_t size, std::string* data);
    493 
    494 // Parses urls targeted at ChromeFrame. This class maintains state like
    495 // whether a url is prefixed with the gcf: prefix, whether it is being
    496 // attached to an existing external tab, etc.
    497 class ChromeFrameUrl {
    498  public:
    499   ChromeFrameUrl();
    500 
    501   // Parses the url passed in. Returns true on success.
    502   bool Parse(const std::wstring& url);
    503 
    504   bool is_chrome_protocol() const {
    505     return is_chrome_protocol_;
    506   }
    507 
    508   bool attach_to_external_tab() const {
    509     return attach_to_external_tab_;
    510   }
    511 
    512   uint64 cookie() const {
    513     return cookie_;
    514   }
    515 
    516   int disposition() const {
    517     return disposition_;
    518   }
    519 
    520   const gfx::Rect& dimensions() const {
    521     return dimensions_;
    522   }
    523 
    524   const GURL& gurl() const {
    525     return parsed_url_;
    526   }
    527 
    528   const std::string& profile_name() const {
    529     return profile_name_;
    530   }
    531 
    532  private:
    533   // If we are attaching to an existing external tab, this function parses the
    534   // suffix portion of the URL which contains the attach_external_tab prefix.
    535   bool ParseAttachExternalTabUrl();
    536 
    537   // Clear state.
    538   void Reset();
    539 
    540   bool attach_to_external_tab_;
    541   bool is_chrome_protocol_;
    542   uint64 cookie_;
    543   gfx::Rect dimensions_;
    544   int disposition_;
    545 
    546   GURL parsed_url_;
    547   std::string profile_name_;
    548 };
    549 
    550 class NavigationConstraints;
    551 // Returns true if we can navigate to this URL.
    552 // These decisions are controlled by the NavigationConstraints object passed
    553 // in.
    554 bool CanNavigate(const GURL& url,
    555                  NavigationConstraints* navigation_constraints);
    556 
    557 // Helper function to spin a message loop and dispatch messages while waiting
    558 // for a handle to be signaled.
    559 void WaitWithMessageLoop(HANDLE* handles, int count, DWORD timeout);
    560 
    561 // Enumerates values in a key and adds them to an array.
    562 // The names of the values are not returned.
    563 void EnumerateKeyValues(HKEY parent_key, const wchar_t* sub_key_name,
    564                         std::vector<std::wstring>* values);
    565 
    566 // Interprets the value of an X-UA-Compatible header (or <meta> tag equivalent)
    567 // and indicates whether the header value contains a Chrome Frame directive
    568 // matching a given host browser version.
    569 //
    570 // The header is a series of name-value pairs, with the names being HTTP tokens
    571 // and the values being either tokens or quoted-strings. Names and values are
    572 // joined by '=' and pairs are delimited by either ';' or ','. LWS may be used
    573 // liberally before and between names, values, '=', and ';' or ','. See RFC 2616
    574 // for definitions of token, quoted-string, and LWS. See Microsoft's
    575 // documentation of the X-UA-COMPATIBLE header here:
    576 // http://msdn.microsoft.com/en-us/library/cc288325(VS.85).aspx
    577 //
    578 // At most one 'Chrome=<FILTER>' entry is expected in the header value. The
    579 // first valid instance is used. The value of "<FILTER>" (possibly after
    580 // unquoting) is interpreted as follows:
    581 //
    582 // "1"   - Always active
    583 // "IE7" - Active for IE major version 7 or lower
    584 //
    585 // For example:
    586 // X-UA-Compatible: IE=8; Chrome=IE6
    587 //
    588 // The string is first interpreted using ';' as a delimiter. It is reevaluated
    589 // using ',' iff no valid 'chrome=' value is found.
    590 bool CheckXUaCompatibleDirective(const std::string& directive,
    591                                  int ie_major_version);
    592 
    593 // Returns the version of the current module as a string.
    594 std::wstring GetCurrentModuleVersion();
    595 
    596 // Returns true if ChromeFrame is the currently loaded document.
    597 bool IsChromeFrameDocument(IWebBrowser2* web_browser);
    598 
    599 // Increases the wininet connection limit for HTTP 1.0/1.1 connections to the
    600 // value passed in. This is only done if the existing connection limit is
    601 // lesser than the connection limit passed in. This function attempts to
    602 // increase the connection count once per process.
    603 // Returns true on success.
    604 bool IncreaseWinInetConnections(DWORD connections);
    605 
    606 // Sets |profile_path| to the path for the Chrome Frame |profile_name|
    607 // profile.
    608 void GetChromeFrameProfilePath(const string16& profile_name,
    609                                base::FilePath* profile_path);
    610 
    611 #endif  // CHROME_FRAME_UTILS_H_
    612