OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 // Web request notifier implementation. | 5 // Web request notifier implementation. |
6 #include "ceee/ie/plugin/bho/webrequest_notifier.h" | 6 #include "ceee/ie/plugin/bho/webrequest_notifier.h" |
7 | 7 |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/scoped_ptr.h" | 9 #include "base/scoped_ptr.h" |
10 #include "chrome_frame/function_stub.h" | 10 #include "chrome_frame/function_stub.h" |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 DWORD error = patch_function->Patch(kUrlMonModuleName, kWinINetModuleName, | 155 DWORD error = patch_function->Patch(kUrlMonModuleName, kWinINetModuleName, |
156 name, handler); | 156 name, handler); |
157 // The patching operation is either successful, or failed cleanly. | 157 // The patching operation is either successful, or failed cleanly. |
158 DCHECK(error == NO_ERROR || !patch_function->is_patched()); | 158 DCHECK(error == NO_ERROR || !patch_function->is_patched()); |
159 } | 159 } |
160 | 160 |
161 INTERNET_STATUS_CALLBACK STDAPICALLTYPE | 161 INTERNET_STATUS_CALLBACK STDAPICALLTYPE |
162 WebRequestNotifier::InternetSetStatusCallbackAPatch( | 162 WebRequestNotifier::InternetSetStatusCallbackAPatch( |
163 HINTERNET internet, | 163 HINTERNET internet, |
164 INTERNET_STATUS_CALLBACK callback) { | 164 INTERNET_STATUS_CALLBACK callback) { |
165 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 165 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
166 INTERNET_STATUS_CALLBACK new_callback = | 166 INTERNET_STATUS_CALLBACK new_callback = |
167 instance->HandleBeforeInternetSetStatusCallback(internet, callback); | 167 instance->HandleBeforeInternetSetStatusCallback(internet, callback); |
168 return ::InternetSetStatusCallbackA(internet, new_callback); | 168 return ::InternetSetStatusCallbackA(internet, new_callback); |
169 } | 169 } |
170 | 170 |
171 INTERNET_STATUS_CALLBACK STDAPICALLTYPE | 171 INTERNET_STATUS_CALLBACK STDAPICALLTYPE |
172 WebRequestNotifier::InternetSetStatusCallbackWPatch( | 172 WebRequestNotifier::InternetSetStatusCallbackWPatch( |
173 HINTERNET internet, | 173 HINTERNET internet, |
174 INTERNET_STATUS_CALLBACK callback) { | 174 INTERNET_STATUS_CALLBACK callback) { |
175 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 175 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
176 INTERNET_STATUS_CALLBACK new_callback = | 176 INTERNET_STATUS_CALLBACK new_callback = |
177 instance->HandleBeforeInternetSetStatusCallback(internet, callback); | 177 instance->HandleBeforeInternetSetStatusCallback(internet, callback); |
178 return ::InternetSetStatusCallbackW(internet, new_callback); | 178 return ::InternetSetStatusCallbackW(internet, new_callback); |
179 } | 179 } |
180 | 180 |
181 HINTERNET STDAPICALLTYPE WebRequestNotifier::InternetConnectAPatch( | 181 HINTERNET STDAPICALLTYPE WebRequestNotifier::InternetConnectAPatch( |
182 HINTERNET internet, | 182 HINTERNET internet, |
183 LPCSTR server_name, | 183 LPCSTR server_name, |
184 INTERNET_PORT server_port, | 184 INTERNET_PORT server_port, |
185 LPCSTR user_name, | 185 LPCSTR user_name, |
186 LPCSTR password, | 186 LPCSTR password, |
187 DWORD service, | 187 DWORD service, |
188 DWORD flags, | 188 DWORD flags, |
189 DWORD_PTR context) { | 189 DWORD_PTR context) { |
190 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 190 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
191 instance->HandleBeforeInternetConnect(internet); | 191 instance->HandleBeforeInternetConnect(internet); |
192 | 192 |
193 HINTERNET server = ::InternetConnectA(internet, server_name, server_port, | 193 HINTERNET server = ::InternetConnectA(internet, server_name, server_port, |
194 user_name, password, service, flags, | 194 user_name, password, service, flags, |
195 context); | 195 context); |
196 | 196 |
197 instance->HandleAfterInternetConnect(server, CA2W(server_name), server_port, | 197 instance->HandleAfterInternetConnect(server, CA2W(server_name), server_port, |
198 service); | 198 service); |
199 return server; | 199 return server; |
200 } | 200 } |
201 | 201 |
202 HINTERNET STDAPICALLTYPE WebRequestNotifier::InternetConnectWPatch( | 202 HINTERNET STDAPICALLTYPE WebRequestNotifier::InternetConnectWPatch( |
203 HINTERNET internet, | 203 HINTERNET internet, |
204 LPCWSTR server_name, | 204 LPCWSTR server_name, |
205 INTERNET_PORT server_port, | 205 INTERNET_PORT server_port, |
206 LPCWSTR user_name, | 206 LPCWSTR user_name, |
207 LPCWSTR password, | 207 LPCWSTR password, |
208 DWORD service, | 208 DWORD service, |
209 DWORD flags, | 209 DWORD flags, |
210 DWORD_PTR context) { | 210 DWORD_PTR context) { |
211 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 211 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
212 instance->HandleBeforeInternetConnect(internet); | 212 instance->HandleBeforeInternetConnect(internet); |
213 | 213 |
214 HINTERNET server = ::InternetConnectW(internet, server_name, server_port, | 214 HINTERNET server = ::InternetConnectW(internet, server_name, server_port, |
215 user_name, password, service, flags, | 215 user_name, password, service, flags, |
216 context); | 216 context); |
217 | 217 |
218 instance->HandleAfterInternetConnect(server, server_name, server_port, | 218 instance->HandleAfterInternetConnect(server, server_name, server_port, |
219 service); | 219 service); |
220 return server; | 220 return server; |
221 } | 221 } |
222 | 222 |
223 HINTERNET STDAPICALLTYPE WebRequestNotifier::HttpOpenRequestAPatch( | 223 HINTERNET STDAPICALLTYPE WebRequestNotifier::HttpOpenRequestAPatch( |
224 HINTERNET connect, | 224 HINTERNET connect, |
225 LPCSTR verb, | 225 LPCSTR verb, |
226 LPCSTR object_name, | 226 LPCSTR object_name, |
227 LPCSTR version, | 227 LPCSTR version, |
228 LPCSTR referrer, | 228 LPCSTR referrer, |
229 LPCSTR* accept_types, | 229 LPCSTR* accept_types, |
230 DWORD flags, | 230 DWORD flags, |
231 DWORD_PTR context) { | 231 DWORD_PTR context) { |
232 HINTERNET request = ::HttpOpenRequestA(connect, verb, object_name, version, | 232 HINTERNET request = ::HttpOpenRequestA(connect, verb, object_name, version, |
233 referrer, accept_types, flags, | 233 referrer, accept_types, flags, |
234 context); | 234 context); |
235 | 235 |
236 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 236 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
237 instance->HandleAfterHttpOpenRequest(connect, request, verb, | 237 instance->HandleAfterHttpOpenRequest(connect, request, verb, |
238 CA2W(object_name), flags); | 238 CA2W(object_name), flags); |
239 return request; | 239 return request; |
240 } | 240 } |
241 | 241 |
242 HINTERNET STDAPICALLTYPE WebRequestNotifier::HttpOpenRequestWPatch( | 242 HINTERNET STDAPICALLTYPE WebRequestNotifier::HttpOpenRequestWPatch( |
243 HINTERNET connect, | 243 HINTERNET connect, |
244 LPCWSTR verb, | 244 LPCWSTR verb, |
245 LPCWSTR object_name, | 245 LPCWSTR object_name, |
246 LPCWSTR version, | 246 LPCWSTR version, |
247 LPCWSTR referrer, | 247 LPCWSTR referrer, |
248 LPCWSTR* accept_types, | 248 LPCWSTR* accept_types, |
249 DWORD flags, | 249 DWORD flags, |
250 DWORD_PTR context) { | 250 DWORD_PTR context) { |
251 HINTERNET request = ::HttpOpenRequestW(connect, verb, object_name, version, | 251 HINTERNET request = ::HttpOpenRequestW(connect, verb, object_name, version, |
252 referrer, accept_types, flags, | 252 referrer, accept_types, flags, |
253 context); | 253 context); |
254 | 254 |
255 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 255 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
256 instance->HandleAfterHttpOpenRequest(connect, request, CW2A(verb), | 256 instance->HandleAfterHttpOpenRequest(connect, request, CW2A(verb), |
257 object_name, flags); | 257 object_name, flags); |
258 return request; | 258 return request; |
259 } | 259 } |
260 | 260 |
261 BOOL STDAPICALLTYPE WebRequestNotifier::HttpSendRequestAPatch( | 261 BOOL STDAPICALLTYPE WebRequestNotifier::HttpSendRequestAPatch( |
262 HINTERNET request, | 262 HINTERNET request, |
263 LPCSTR headers, | 263 LPCSTR headers, |
264 DWORD headers_length, | 264 DWORD headers_length, |
265 LPVOID optional, | 265 LPVOID optional, |
266 DWORD optional_length) { | 266 DWORD optional_length) { |
267 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 267 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
268 instance->HandleBeforeHttpSendRequest(request); | 268 instance->HandleBeforeHttpSendRequest(request); |
269 return ::HttpSendRequestA(request, headers, headers_length, optional, | 269 return ::HttpSendRequestA(request, headers, headers_length, optional, |
270 optional_length); | 270 optional_length); |
271 } | 271 } |
272 | 272 |
273 BOOL STDAPICALLTYPE WebRequestNotifier::HttpSendRequestWPatch( | 273 BOOL STDAPICALLTYPE WebRequestNotifier::HttpSendRequestWPatch( |
274 HINTERNET request, | 274 HINTERNET request, |
275 LPCWSTR headers, | 275 LPCWSTR headers, |
276 DWORD headers_length, | 276 DWORD headers_length, |
277 LPVOID optional, | 277 LPVOID optional, |
278 DWORD optional_length) { | 278 DWORD optional_length) { |
279 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 279 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
280 instance->HandleBeforeHttpSendRequest(request); | 280 instance->HandleBeforeHttpSendRequest(request); |
281 return ::HttpSendRequestW(request, headers, headers_length, optional, | 281 return ::HttpSendRequestW(request, headers, headers_length, optional, |
282 optional_length); | 282 optional_length); |
283 } | 283 } |
284 | 284 |
285 void CALLBACK WebRequestNotifier::InternetStatusCallbackPatch( | 285 void CALLBACK WebRequestNotifier::InternetStatusCallbackPatch( |
286 INTERNET_STATUS_CALLBACK original, | 286 INTERNET_STATUS_CALLBACK original, |
287 HINTERNET internet, | 287 HINTERNET internet, |
288 DWORD_PTR context, | 288 DWORD_PTR context, |
289 DWORD internet_status, | 289 DWORD internet_status, |
290 LPVOID status_information, | 290 LPVOID status_information, |
291 DWORD status_information_length) { | 291 DWORD status_information_length) { |
292 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 292 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
293 instance->HandleBeforeInternetStatusCallback(original, internet, context, | 293 instance->HandleBeforeInternetStatusCallback(original, internet, context, |
294 internet_status, | 294 internet_status, |
295 status_information, | 295 status_information, |
296 status_information_length); | 296 status_information_length); |
297 original(internet, context, internet_status, status_information, | 297 original(internet, context, internet_status, status_information, |
298 status_information_length); | 298 status_information_length); |
299 } | 299 } |
300 | 300 |
301 BOOL STDAPICALLTYPE WebRequestNotifier::InternetReadFilePatch( | 301 BOOL STDAPICALLTYPE WebRequestNotifier::InternetReadFilePatch( |
302 HINTERNET file, | 302 HINTERNET file, |
303 LPVOID buffer, | 303 LPVOID buffer, |
304 DWORD number_of_bytes_to_read, | 304 DWORD number_of_bytes_to_read, |
305 LPDWORD number_of_bytes_read) { | 305 LPDWORD number_of_bytes_read) { |
306 BOOL result = ::InternetReadFile(file, buffer, number_of_bytes_to_read, | 306 BOOL result = ::InternetReadFile(file, buffer, number_of_bytes_to_read, |
307 number_of_bytes_read); | 307 number_of_bytes_read); |
308 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 308 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
309 instance->HandleAfterInternetReadFile(file, result, number_of_bytes_read); | 309 instance->HandleAfterInternetReadFile(file, result, number_of_bytes_read); |
310 | 310 |
311 return result; | 311 return result; |
312 } | 312 } |
313 | 313 |
314 INTERNET_STATUS_CALLBACK | 314 INTERNET_STATUS_CALLBACK |
315 WebRequestNotifier::HandleBeforeInternetSetStatusCallback( | 315 WebRequestNotifier::HandleBeforeInternetSetStatusCallback( |
316 HINTERNET internet, | 316 HINTERNET internet, |
317 INTERNET_STATUS_CALLBACK internet_callback) { | 317 INTERNET_STATUS_CALLBACK internet_callback) { |
318 CComCritSecLock<CComAutoCriticalSection> lock(critical_section_); | 318 CComCritSecLock<CComAutoCriticalSection> lock(critical_section_); |
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 NOTREACHED(); | 806 NOTREACHED(); |
807 break; | 807 break; |
808 } | 808 } |
809 | 809 |
810 if (fire_on_error_occurred) { | 810 if (fire_on_error_occurred) { |
811 webrequest_events_funnel().OnErrorOccurred( | 811 webrequest_events_funnel().OnErrorOccurred( |
812 info->id, info->url.c_str(), L"", base::Time::Now()); | 812 info->id, info->url.c_str(), L"", base::Time::Now()); |
813 } | 813 } |
814 info->state = next_state; | 814 info->state = next_state; |
815 } | 815 } |
| 816 |
| 817 // static |
| 818 ProductionWebRequestNotifier* ProductionWebRequestNotifier::GetInstance() { |
| 819 return Singleton<ProductionWebRequestNotifier>::get(); |
| 820 } |
OLD | NEW |