OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 // TODO(port): the ifdefs in here are a first step towards trying to determine | 5 // TODO(port): the ifdefs in here are a first step towards trying to determine |
6 // the correct abstraction for all the OS functionality required at this | 6 // the correct abstraction for all the OS functionality required at this |
7 // stage of process initialization. It should not be taken as a final | 7 // stage of process initialization. It should not be taken as a final |
8 // abstraction. | 8 // abstraction. |
9 | 9 |
10 #include "build/build_config.h" | 10 #include "build/build_config.h" |
11 | 11 |
12 #if defined(OS_WIN) | 12 #if defined(OS_WIN) |
| 13 #include <algorithm> |
13 #include <atlbase.h> | 14 #include <atlbase.h> |
14 #include <atlapp.h> | 15 #include <atlapp.h> |
15 #include <malloc.h> | 16 #include <malloc.h> |
16 #include <new.h> | 17 #include <new.h> |
17 #endif | 18 #endif |
18 | 19 |
19 #if defined(OS_LINUX) | 20 #if defined(OS_LINUX) |
20 #include <gtk/gtk.h> | 21 #include <gtk/gtk.h> |
21 #endif | 22 #endif |
22 | 23 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 // Get the breakpad pointer from chrome.exe | 110 // Get the breakpad pointer from chrome.exe |
110 typedef void (__stdcall *DumpProcessFunction)(); | 111 typedef void (__stdcall *DumpProcessFunction)(); |
111 DumpProcessFunction DumpProcess = reinterpret_cast<DumpProcessFunction>( | 112 DumpProcessFunction DumpProcess = reinterpret_cast<DumpProcessFunction>( |
112 ::GetProcAddress(::GetModuleHandle(L"chrome.exe"), "DumpProcess")); | 113 ::GetProcAddress(::GetModuleHandle(L"chrome.exe"), "DumpProcess")); |
113 if (DumpProcess) | 114 if (DumpProcess) |
114 DumpProcess(); | 115 DumpProcess(); |
115 } | 116 } |
116 | 117 |
117 #pragma optimize("", on) | 118 #pragma optimize("", on) |
118 | 119 |
| 120 // Early versions of Chrome incorrectly registered a chromehtml: URL handler. |
| 121 // Later versions fixed the registration but in some cases (e.g. Vista and non- |
| 122 // admin installs) the fix could not be applied. This prevents Chrome to be |
| 123 // launched with the incorrect format. |
| 124 // CORRECT: <broser.exe> -- "chromehtml:<url>" |
| 125 // INVALID: <broser.exe> "chromehtml:<url>" |
| 126 bool IncorrectChromeHtmlArguments(const std::wstring& command_line) { |
| 127 const wchar_t kChromeHtml[] = L"-- \"chromehtml:"; |
| 128 const wchar_t kOffset = 5; // Where chromehtml: starts in above |
| 129 std::wstring command_line_lower = command_line; |
| 130 |
| 131 // We are only searching for ASCII characters so this is OK. |
| 132 StringToLowerASCII(&command_line_lower); |
| 133 |
| 134 std::wstring::size_type pos = command_line_lower.find( |
| 135 kChromeHtml + kOffset); |
| 136 |
| 137 if (pos == std::wstring::npos) |
| 138 return false; |
| 139 |
| 140 // The browser is being launched with chromehtml: somewhere on the command |
| 141 // line. We will not launch unless it's preceded by the -- switch terminator. |
| 142 if (pos >= kOffset) { |
| 143 if (equal(kChromeHtml, kChromeHtml + arraysize(kChromeHtml) - 1, |
| 144 command_line_lower.begin() + pos - kOffset)) { |
| 145 return false; |
| 146 } |
| 147 } |
| 148 |
| 149 return true; |
| 150 } |
| 151 |
119 #endif // OS_WIN | 152 #endif // OS_WIN |
120 | 153 |
121 // Register the invalid param handler and pure call handler to be able to | 154 // Register the invalid param handler and pure call handler to be able to |
122 // notify breakpad when it happens. | 155 // notify breakpad when it happens. |
123 void RegisterInvalidParamHandler() { | 156 void RegisterInvalidParamHandler() { |
124 #if defined(OS_WIN) | 157 #if defined(OS_WIN) |
125 _set_invalid_parameter_handler(InvalidParameter); | 158 _set_invalid_parameter_handler(InvalidParameter); |
126 _set_purecall_handler(PureCall); | 159 _set_purecall_handler(PureCall); |
127 // Gather allocation failure. | 160 // Gather allocation failure. |
128 _set_new_handler(&OnNoMemory); | 161 _set_new_handler(&OnNoMemory); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 #endif | 253 #endif |
221 | 254 |
222 // Initialize the command line. | 255 // Initialize the command line. |
223 #if defined(OS_WIN) | 256 #if defined(OS_WIN) |
224 CommandLine::Init(0, NULL); | 257 CommandLine::Init(0, NULL); |
225 #else | 258 #else |
226 CommandLine::Init(argc, argv); | 259 CommandLine::Init(argc, argv); |
227 #endif | 260 #endif |
228 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); | 261 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); |
229 | 262 |
| 263 #if defined(OS_WIN) |
| 264 // Must do this before any other usage of command line! |
| 265 if (::IncorrectChromeHtmlArguments(parsed_command_line.command_line_string())) |
| 266 return 1; |
| 267 #endif |
| 268 |
230 SetupCRT(parsed_command_line); | 269 SetupCRT(parsed_command_line); |
231 | 270 |
232 // Initialize the Chrome path provider. | 271 // Initialize the Chrome path provider. |
233 chrome::RegisterPathProvider(); | 272 chrome::RegisterPathProvider(); |
234 | 273 |
235 // Initialize the Stats Counters table. With this initialized, | 274 // Initialize the Stats Counters table. With this initialized, |
236 // the StatsViewer can be utilized to read counters outside of | 275 // the StatsViewer can be utilized to read counters outside of |
237 // Chrome. These lines can be commented out to effectively turn | 276 // Chrome. These lines can be commented out to effectively turn |
238 // counters 'off'. The table is created and exists for the life | 277 // counters 'off'. The table is created and exists for the life |
239 // of the process. It is not cleaned up. | 278 // of the process. It is not cleaned up. |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 | 382 |
344 _Module.Term(); | 383 _Module.Term(); |
345 #endif | 384 #endif |
346 | 385 |
347 logging::CleanupChromeLogging(); | 386 logging::CleanupChromeLogging(); |
348 | 387 |
349 return rv; | 388 return rv; |
350 } | 389 } |
351 | 390 |
352 | 391 |
OLD | NEW |