• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #include "chrome/common/child_process_logging.h"
6 
7 #include <windows.h>
8 
9 #include "base/string_util.h"
10 #include "base/string_number_conversions.h"
11 #include "base/stringprintf.h"
12 #include "base/utf_string_conversions.h"
13 #include "chrome/common/chrome_constants.h"
14 #include "chrome/installer/util/google_update_settings.h"
15 #include "content/common/gpu/gpu_info.h"
16 #include "googleurl/src/gurl.h"
17 
18 namespace child_process_logging {
19 // exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetActiveURL.
20 typedef void (__cdecl *MainSetActiveURL)(const wchar_t*);
21 
22 // exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetClientId.
23 typedef void (__cdecl *MainSetClientId)(const wchar_t*);
24 
25 // exported in breakpad_win.cc:
26 //   void __declspec(dllexport) __cdecl SetNumberOfExtensions.
27 typedef void (__cdecl *MainSetNumberOfExtensions)(int);
28 
29 // exported in breakpad_win.cc:
30 // void __declspec(dllexport) __cdecl SetExtensionID.
31 typedef void (__cdecl *MainSetExtensionID)(size_t, const wchar_t*);
32 
33 // exported in breakpad_win.cc: void __declspec(dllexport) __cdecl SetGpuInfo.
34 typedef void (__cdecl *MainSetGpuInfo)(const wchar_t*, const wchar_t*,
35                                        const wchar_t*, const wchar_t*,
36                                        const wchar_t*);
37 
38 // exported in breakpad_win.cc:
39 //   void __declspec(dllexport) __cdecl SetNumberOfViews.
40 typedef void (__cdecl *MainSetNumberOfViews)(int);
41 
SetActiveURL(const GURL & url)42 void SetActiveURL(const GURL& url) {
43   static MainSetActiveURL set_active_url = NULL;
44   // note: benign race condition on set_active_url.
45   if (!set_active_url) {
46     HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
47     if (!exe_module)
48       return;
49     set_active_url = reinterpret_cast<MainSetActiveURL>(
50         GetProcAddress(exe_module, "SetActiveURL"));
51     if (!set_active_url)
52       return;
53   }
54 
55   (set_active_url)(UTF8ToWide(url.possibly_invalid_spec()).c_str());
56 }
57 
SetClientId(const std::string & client_id)58 void SetClientId(const std::string& client_id) {
59   std::string str(client_id);
60   // Remove all instance of '-' char from the GUID. So BCD-WXY becomes BCDWXY.
61   ReplaceSubstringsAfterOffset(&str, 0, "-", "");
62 
63   if (str.empty())
64     return;
65 
66   std::wstring wstr = ASCIIToWide(str);
67   std::wstring old_wstr;
68   if (!GoogleUpdateSettings::GetMetricsId(&old_wstr) ||
69       wstr != old_wstr)
70     GoogleUpdateSettings::SetMetricsId(wstr);
71 
72   static MainSetClientId set_client_id = NULL;
73   if (!set_client_id) {
74     HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
75     if (!exe_module)
76       return;
77     set_client_id = reinterpret_cast<MainSetClientId>(
78         GetProcAddress(exe_module, "SetClientId"));
79     if (!set_client_id)
80       return;
81   }
82   (set_client_id)(wstr.c_str());
83 }
84 
GetClientId()85 std::string GetClientId() {
86   std::wstring wstr_client_id;
87   if (GoogleUpdateSettings::GetMetricsId(&wstr_client_id))
88     return WideToASCII(wstr_client_id);
89   else
90     return std::string();
91 }
92 
SetActiveExtensions(const std::set<std::string> & extension_ids)93 void SetActiveExtensions(const std::set<std::string>& extension_ids) {
94   static MainSetNumberOfExtensions set_number_of_extensions = NULL;
95   if (!set_number_of_extensions) {
96     HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
97     if (!exe_module)
98       return;
99     set_number_of_extensions = reinterpret_cast<MainSetNumberOfExtensions>(
100         GetProcAddress(exe_module, "SetNumberOfExtensions"));
101     if (!set_number_of_extensions)
102       return;
103   }
104 
105   static MainSetExtensionID set_extension_id = NULL;
106   if (!set_extension_id) {
107     HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
108     if (!exe_module)
109       return;
110     set_extension_id = reinterpret_cast<MainSetExtensionID>(
111         GetProcAddress(exe_module, "SetExtensionID"));
112     if (!set_extension_id)
113       return;
114   }
115 
116   (set_number_of_extensions)(static_cast<int>(extension_ids.size()));
117 
118   std::set<std::string>::const_iterator iter = extension_ids.begin();
119   for (size_t i = 0; i < kMaxReportedActiveExtensions; ++i) {
120     if (iter != extension_ids.end()) {
121       (set_extension_id)(i, ASCIIToWide(iter->c_str()).c_str());
122       ++iter;
123     } else {
124       (set_extension_id)(i, L"");
125     }
126   }
127 }
128 
SetGpuInfo(const GPUInfo & gpu_info)129 void SetGpuInfo(const GPUInfo& gpu_info) {
130   static MainSetGpuInfo set_gpu_info = NULL;
131   if (!set_gpu_info) {
132     HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
133     if (!exe_module)
134       return;
135     set_gpu_info = reinterpret_cast<MainSetGpuInfo>(
136         GetProcAddress(exe_module, "SetGpuInfo"));
137     if (!set_gpu_info)
138       return;
139   }
140   (set_gpu_info)(
141       base::StringPrintf(L"0x%04x", gpu_info.vendor_id).c_str(),
142       base::StringPrintf(L"0x%04x", gpu_info.device_id).c_str(),
143       UTF8ToUTF16(gpu_info.driver_version).c_str(),
144       UTF8ToUTF16(gpu_info.pixel_shader_version).c_str(),
145       UTF8ToUTF16(gpu_info.vertex_shader_version).c_str());
146 }
147 
SetNumberOfViews(int number_of_views)148 void SetNumberOfViews(int number_of_views) {
149   static MainSetNumberOfViews set_number_of_views = NULL;
150   if (!set_number_of_views) {
151     HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
152     if (!exe_module)
153       return;
154     set_number_of_views = reinterpret_cast<MainSetNumberOfViews>(
155         GetProcAddress(exe_module, "SetNumberOfViews"));
156     if (!set_number_of_views)
157       return;
158   }
159   (set_number_of_views)(number_of_views);
160 }
161 
162 }  // namespace child_process_logging
163