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.
5 #include "chrome/common/child_process_logging.h"
9 #include "base/command_line.h"
10 #include "base/string_util.h"
11 #include "base/string_number_conversions.h"
12 #include "base/stringprintf.h"
13 #include "base/utf_string_conversions.h"
14 #include "chrome/common/chrome_constants.h"
15 #include "chrome/common/metrics/variations/variations_util.h"
16 #include "chrome/installer/util/google_update_settings.h"
17 #include "content/public/common/gpu_info.h"
18 #include "googleurl/src/gurl.h"
20 namespace child_process_logging
{
24 // exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetActiveURL.
25 typedef void (__cdecl
*MainSetActiveURL
)(const wchar_t*);
27 // exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetClientId.
28 typedef void (__cdecl
*MainSetClientId
)(const wchar_t*);
30 // exported in breakpad_win.cc:
31 // void __declspec(dllexport) __cdecl SetNumberOfExtensions.
32 typedef void (__cdecl
*MainSetNumberOfExtensions
)(int);
34 // exported in breakpad_win.cc:
35 // void __declspec(dllexport) __cdecl SetExtensionID.
36 typedef void (__cdecl
*MainSetExtensionID
)(size_t, const wchar_t*);
38 // exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetGpuInfo.
39 typedef void (__cdecl
*MainSetGpuInfo
)(const wchar_t*, const wchar_t*,
40 const wchar_t*, const wchar_t*,
43 // exported in breakpad_win.cc:
44 // void __declspec(dllexport) __cdecl SetPrinterInfo.
45 typedef void (__cdecl
*MainSetPrinterInfo
)(const wchar_t*);
47 // exported in breakpad_win.cc:
48 // void __declspec(dllexport) __cdecl SetNumberOfViews.
49 typedef void (__cdecl
*MainSetNumberOfViews
)(int);
51 // exported in breakpad_win.cc:
52 // void __declspec(dllexport) __cdecl SetCommandLine2
53 typedef void (__cdecl
*MainSetCommandLine
)(const wchar_t**, size_t);
55 // exported in breakpad_field_trial_win.cc:
56 // void __declspec(dllexport) __cdecl SetExperimentList3
57 typedef void (__cdecl
*MainSetExperimentList
)(const wchar_t**, size_t, size_t);
59 // Copied from breakpad_win.cc.
60 void StringVectorToCStringVector(const std::vector
<std::wstring
>& wstrings
,
61 std::vector
<const wchar_t*>* cstrings
) {
63 cstrings
->reserve(wstrings
.size());
64 for (size_t i
= 0; i
< wstrings
.size(); ++i
)
65 cstrings
->push_back(wstrings
[i
].c_str());
70 void SetActiveURL(const GURL
& url
) {
71 static MainSetActiveURL set_active_url
= NULL
;
72 // note: benign race condition on set_active_url.
73 if (!set_active_url
) {
74 HMODULE exe_module
= GetModuleHandle(chrome::kBrowserProcessExecutableName
);
77 set_active_url
= reinterpret_cast<MainSetActiveURL
>(
78 GetProcAddress(exe_module
, "SetActiveURL"));
83 (set_active_url
)(UTF8ToWide(url
.possibly_invalid_spec()).c_str());
86 void SetClientId(const std::string
& client_id
) {
87 std::string
str(client_id
);
88 // Remove all instance of '-' char from the GUID. So BCD-WXY becomes BCDWXY.
89 ReplaceSubstringsAfterOffset(&str
, 0, "-", "");
94 std::wstring wstr
= ASCIIToWide(str
);
95 std::wstring old_wstr
;
96 if (!GoogleUpdateSettings::GetMetricsId(&old_wstr
) ||
98 GoogleUpdateSettings::SetMetricsId(wstr
);
100 static MainSetClientId set_client_id
= NULL
;
101 // note: benign race condition on set_client_id.
102 if (!set_client_id
) {
103 HMODULE exe_module
= GetModuleHandle(chrome::kBrowserProcessExecutableName
);
106 set_client_id
= reinterpret_cast<MainSetClientId
>(
107 GetProcAddress(exe_module
, "SetClientId"));
111 (set_client_id
)(wstr
.c_str());
114 std::string
GetClientId() {
115 std::wstring wstr_client_id
;
116 if (GoogleUpdateSettings::GetMetricsId(&wstr_client_id
))
117 return WideToASCII(wstr_client_id
);
119 return std::string();
122 void SetActiveExtensions(const std::set
<std::string
>& extension_ids
) {
123 static MainSetNumberOfExtensions set_number_of_extensions
= NULL
;
124 // note: benign race condition on set_number_of_extensions.
125 if (!set_number_of_extensions
) {
126 HMODULE exe_module
= GetModuleHandle(chrome::kBrowserProcessExecutableName
);
129 set_number_of_extensions
= reinterpret_cast<MainSetNumberOfExtensions
>(
130 GetProcAddress(exe_module
, "SetNumberOfExtensions"));
131 if (!set_number_of_extensions
)
135 static MainSetExtensionID set_extension_id
= NULL
;
136 // note: benign race condition on set_extension_id.
137 if (!set_extension_id
) {
138 HMODULE exe_module
= GetModuleHandle(chrome::kBrowserProcessExecutableName
);
141 set_extension_id
= reinterpret_cast<MainSetExtensionID
>(
142 GetProcAddress(exe_module
, "SetExtensionID"));
143 if (!set_extension_id
)
147 (set_number_of_extensions
)(static_cast<int>(extension_ids
.size()));
149 std::set
<std::string
>::const_iterator iter
= extension_ids
.begin();
150 for (size_t i
= 0; i
< kMaxReportedActiveExtensions
; ++i
) {
151 if (iter
!= extension_ids
.end()) {
152 (set_extension_id
)(i
, ASCIIToWide(iter
->c_str()).c_str());
155 (set_extension_id
)(i
, L
"");
160 void SetGpuInfo(const content::GPUInfo
& gpu_info
) {
161 static MainSetGpuInfo set_gpu_info
= NULL
;
162 // note: benign race condition on set_gpu_info.
164 HMODULE exe_module
= GetModuleHandle(chrome::kBrowserProcessExecutableName
);
167 set_gpu_info
= reinterpret_cast<MainSetGpuInfo
>(
168 GetProcAddress(exe_module
, "SetGpuInfo"));
173 base::StringPrintf(L
"0x%04x", gpu_info
.gpu
.vendor_id
).c_str(),
174 base::StringPrintf(L
"0x%04x", gpu_info
.gpu
.device_id
).c_str(),
175 UTF8ToUTF16(gpu_info
.driver_version
).c_str(),
176 UTF8ToUTF16(gpu_info
.pixel_shader_version
).c_str(),
177 UTF8ToUTF16(gpu_info
.vertex_shader_version
).c_str());
180 void SetPrinterInfo(const char* printer_info
) {
181 static MainSetPrinterInfo set_printer_info
= NULL
;
182 // note: benign race condition on set_printer_info.
183 if (!set_printer_info
) {
184 HMODULE exe_module
= GetModuleHandle(chrome::kBrowserProcessExecutableName
);
187 set_printer_info
= reinterpret_cast<MainSetPrinterInfo
>(
188 GetProcAddress(exe_module
, "SetPrinterInfo"));
189 if (!set_printer_info
)
192 (set_printer_info
)(UTF8ToWide(printer_info
).c_str());
195 void SetCommandLine(const CommandLine
* command_line
) {
196 static MainSetCommandLine set_command_line
= NULL
;
197 // note: benign race condition on set_command_line.
198 if (!set_command_line
) {
199 HMODULE exe_module
= GetModuleHandle(chrome::kBrowserProcessExecutableName
);
202 set_command_line
= reinterpret_cast<MainSetCommandLine
>(
203 GetProcAddress(exe_module
, "SetCommandLine2"));
204 if (!set_command_line
)
208 if (command_line
->argv().empty())
211 std::vector
<const wchar_t*> cstrings
;
212 StringVectorToCStringVector(command_line
->argv(), &cstrings
);
213 (set_command_line
)(&cstrings
[0], cstrings
.size());
216 void SetExperimentList(const std::vector
<string16
>& experiments
) {
217 static MainSetExperimentList set_experiment_list
= NULL
;
218 // note: benign race condition on set_experiment_list.
219 if (!set_experiment_list
) {
220 HMODULE exe_module
= GetModuleHandle(chrome::kBrowserProcessExecutableName
);
223 set_experiment_list
= reinterpret_cast<MainSetExperimentList
>(
224 GetProcAddress(exe_module
, "SetExperimentList3"));
225 if (!set_experiment_list
)
229 std::vector
<string16
> chunks
;
230 chrome_variations::GenerateVariationChunks(experiments
, &chunks
);
232 // If the list is empty, notify the child process of the number of experiments
234 if (chunks
.empty()) {
235 (set_experiment_list
)(NULL
, 0, 0);
239 std::vector
<const wchar_t*> cstrings
;
240 StringVectorToCStringVector(chunks
, &cstrings
);
241 (set_experiment_list
)(&cstrings
[0], cstrings
.size(), experiments
.size());
244 void SetNumberOfViews(int number_of_views
) {
245 static MainSetNumberOfViews set_number_of_views
= NULL
;
246 // note: benign race condition on set_number_of_views.
247 if (!set_number_of_views
) {
248 HMODULE exe_module
= GetModuleHandle(chrome::kBrowserProcessExecutableName
);
251 set_number_of_views
= reinterpret_cast<MainSetNumberOfViews
>(
252 GetProcAddress(exe_module
, "SetNumberOfViews"));
253 if (!set_number_of_views
)
256 (set_number_of_views
)(number_of_views
);
259 } // namespace child_process_logging