Index: chrome/app/chrome_dll_main.cc |
=================================================================== |
--- chrome/app/chrome_dll_main.cc (revision 9872) |
+++ chrome/app/chrome_dll_main.cc (working copy) |
@@ -10,6 +10,7 @@ |
#include "build/build_config.h" |
#if defined(OS_WIN) |
+#include <algorithm> |
#include <atlbase.h> |
#include <atlapp.h> |
#include <malloc.h> |
@@ -116,6 +117,38 @@ |
#pragma optimize("", on) |
+// Early versions of Chrome incorrectly registered a chromehtml: URL handler. |
+// Later versions fixed the registration but in some cases (e.g. Vista and non- |
+// admin installs) the fix could not be applied. This prevents Chrome to be |
+// launched with the incorrect format. |
+// CORRECT: <broser.exe> -- "chromehtml:<url>" |
+// INVALID: <broser.exe> "chromehtml:<url>" |
+bool IncorrectChromeHtmlArguments(const std::wstring& command_line) { |
+ const wchar_t kChromeHtml[] = L"-- \"chromehtml:"; |
+ const wchar_t kOffset = 5; // Where chromehtml: starts in above |
+ std::wstring command_line_lower = command_line; |
+ |
+ // We are only searching for ASCII characters so this is OK. |
+ StringToLowerASCII(&command_line_lower); |
+ |
+ std::wstring::size_type pos = command_line_lower.find( |
+ kChromeHtml + kOffset); |
+ |
+ if (pos == std::wstring::npos) |
+ return false; |
+ |
+ // The browser is being launched with chromehtml: somewhere on the command |
+ // line. We will not launch unless it's preceded by the -- switch terminator. |
+ if (pos >= kOffset) { |
+ if (equal(kChromeHtml, kChromeHtml + arraysize(kChromeHtml) - 1, |
+ command_line_lower.begin() + pos - kOffset)) { |
+ return false; |
+ } |
+ } |
+ |
+ return true; |
+} |
+ |
#endif // OS_WIN |
// Register the invalid param handler and pure call handler to be able to |
@@ -227,6 +260,12 @@ |
#endif |
const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); |
+#if defined(OS_WIN) |
+ // Must do this before any other usage of command line! |
+ if (::IncorrectChromeHtmlArguments(parsed_command_line.command_line_string())) |
+ return 1; |
+#endif |
+ |
SetupCRT(parsed_command_line); |
// Initialize the Chrome path provider. |