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