Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(989)

Side by Side Diff: chrome_frame/protocol_sink_wrap.cc

Issue 3443017: Committing http://codereview.chromium.org/3420004/show for grt@... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome_frame/protocol_sink_wrap.h ('k') | chrome_frame/test/chrome_frame_test_utils.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 #include <htiframe.h> 5 #include <htiframe.h>
6 #include <mshtml.h> 6 #include <mshtml.h>
7 7
8 #include "chrome_frame/protocol_sink_wrap.h" 8 #include "chrome_frame/protocol_sink_wrap.h"
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 return true; 266 return true;
267 if (LowerCaseEqualsASCII(str, "video/webm")) 267 if (LowerCaseEqualsASCII(str, "video/webm"))
268 return true; 268 return true;
269 if (LowerCaseEqualsASCII(str, "video/mp4")) 269 if (LowerCaseEqualsASCII(str, "video/mp4"))
270 return true; 270 return true;
271 271
272 return false; 272 return false;
273 } 273 }
274 274
275 // Returns: 275 // Returns:
276 // CHROME: if suggested mime type is a supported one and at least one of the 276 // RENDERER_TYPE_OTHER: if suggested mime type is not text/html.
277 // following is true: 1) X-UA-Compatible tag is in HTTP headers. 277 // RENDERER_TYPE_UNDETERMINED: if suggested mime type is text/html.
278 // 2) Url is listed in OptInURLs registry key. 278 // RENDERER_TYPE_CHROME_RESPONSE_HEADER: X-UA-Compatible tag is in HTTP headers.
279 // OTHER: if suggested mime type is not text/html. 279 // RENDERER_TYPE_CHROME_DEFAULT_RENDERER: GCF is the default renderer and the
280 // UNDETERMINED: if suggested mime type is text/html. 280 // Url is not listed in the
281 // RenderInHostUrls registry key.
282 // RENDERER_TYPE_CHROME_OPT_IN_URL: GCF is not the default renderer and the Url
283 // is listed in the RenderInGcfUrls registry
284 // key.
281 RendererType DetermineRendererTypeFromMetaData( 285 RendererType DetermineRendererTypeFromMetaData(
282 const wchar_t* suggested_mime_type, 286 const wchar_t* suggested_mime_type,
283 const std::wstring& url, 287 const std::wstring& url,
284 IWinInetHttpInfo* info) { 288 IWinInetHttpInfo* info) {
285 289
286 bool is_text_html = IsTextHtml(suggested_mime_type); 290 bool is_text_html = IsTextHtml(suggested_mime_type);
287 bool is_supported_content_type = is_text_html || 291 bool is_supported_content_type = is_text_html ||
288 IsAdditionallySupportedContentType(suggested_mime_type); 292 IsAdditionallySupportedContentType(suggested_mime_type);
289 293
290 if (!is_supported_content_type) 294 if (!is_supported_content_type)
291 return OTHER; 295 return RENDERER_TYPE_OTHER;
292 296
293 if (!url.empty() && IsOptInUrl(url.c_str())) { 297 if (!url.empty()) {
294 return CHROME; 298 RendererType renderer_type = RendererTypeForUrl(url);
299 if (IsChrome(renderer_type)) {
300 return renderer_type;
301 }
295 } 302 }
296 303
297 if (info) { 304 if (info) {
298 char buffer[32] = "x-ua-compatible"; 305 char buffer[32] = "x-ua-compatible";
299 DWORD len = sizeof(buffer); 306 DWORD len = sizeof(buffer);
300 DWORD flags = 0; 307 DWORD flags = 0;
301 HRESULT hr = info->QueryInfo(HTTP_QUERY_CUSTOM, buffer, &len, &flags, NULL); 308 HRESULT hr = info->QueryInfo(HTTP_QUERY_CUSTOM, buffer, &len, &flags, NULL);
302 if (hr == S_OK && len > 0) { 309 if (hr == S_OK && len > 0) {
303 if (StrStrIA(buffer, "chrome=1")) { 310 if (StrStrIA(buffer, "chrome=1")) {
304 return CHROME; 311 return RENDERER_TYPE_CHROME_RESPONSE_HEADER;
305 } 312 }
306 } 313 }
307 } 314 }
308 315
309 // We can (and want) to sniff the content. 316 // We can (and want) to sniff the content.
310 if (is_text_html) { 317 if (is_text_html) {
311 return UNDETERMINED; 318 return RENDERER_TYPE_UNDETERMINED;
312 } 319 }
313 320
314 // We cannot sniff the content. 321 // We cannot sniff the content.
315 return OTHER; 322 return RENDERER_TYPE_OTHER;
316 } 323 }
317 324
318 RendererType DetermineRendererType(void* buffer, DWORD size, bool last_chance) { 325 RendererType DetermineRendererType(void* buffer, DWORD size, bool last_chance) {
319 RendererType type = UNDETERMINED; 326 RendererType renderer_type = RENDERER_TYPE_UNDETERMINED;
320 if (last_chance) 327 if (last_chance)
321 type = OTHER; 328 renderer_type = RENDERER_TYPE_OTHER;
322 329
323 std::wstring html_contents; 330 std::wstring html_contents;
324 // TODO(joshia): detect and handle different content encodings 331 // TODO(joshia): detect and handle different content encodings
325 UTF8ToWide(reinterpret_cast<char*>(buffer), size, &html_contents); 332 UTF8ToWide(reinterpret_cast<char*>(buffer), size, &html_contents);
326 333
327 // Note that document_contents_ may have NULL characters in it. While 334 // Note that document_contents_ may have NULL characters in it. While
328 // browsers may handle this properly, we don't and will stop scanning 335 // browsers may handle this properly, we don't and will stop scanning
329 // for the XUACompat content value if we encounter one. 336 // for the XUACompat content value if we encounter one.
330 std::wstring xua_compat_content; 337 std::wstring xua_compat_content;
331 UtilGetXUACompatContentValue(html_contents, &xua_compat_content); 338 UtilGetXUACompatContentValue(html_contents, &xua_compat_content);
332 if (StrStrI(xua_compat_content.c_str(), kChromeContentPrefix)) { 339 if (StrStrI(xua_compat_content.c_str(), kChromeContentPrefix)) {
333 type = CHROME; 340 renderer_type = RENDERER_TYPE_CHROME_HTTP_EQUIV;
334 } 341 }
335 342
336 return type; 343 return renderer_type;
337 } 344 }
338 345
339 // ProtData 346 // ProtData
340 ProtData::ProtData(IInternetProtocol* protocol, 347 ProtData::ProtData(IInternetProtocol* protocol,
341 InternetProtocol_Read_Fn read_fun, const wchar_t* url) 348 InternetProtocol_Read_Fn read_fun, const wchar_t* url)
342 : has_suggested_mime_type_(false), has_server_mime_type_(false), 349 : has_suggested_mime_type_(false), has_server_mime_type_(false),
343 buffer_size_(0), buffer_pos_(0), 350 buffer_size_(0), buffer_pos_(0),
344 renderer_type_(UNDETERMINED), protocol_(protocol), read_fun_(read_fun), 351 renderer_type_(RENDERER_TYPE_UNDETERMINED), protocol_(protocol),
345 url_(url) { 352 read_fun_(read_fun), url_(url) {
346 memset(buffer_, 0, arraysize(buffer_)); 353 memset(buffer_, 0, arraysize(buffer_));
347 DLOG(INFO) << __FUNCTION__ << " " << this; 354 DLOG(INFO) << __FUNCTION__ << " " << this;
348 355
349 // Add to map. 356 // Add to map.
350 AutoLock lock(datamap_lock_); 357 AutoLock lock(datamap_lock_);
351 DCHECK(datamap_.end() == datamap_.find(protocol_)); 358 DCHECK(datamap_.end() == datamap_.find(protocol_));
352 datamap_[protocol] = this; 359 datamap_[protocol] = this;
353 } 360 }
354 361
355 ProtData::~ProtData() { 362 ProtData::~ProtData() {
356 DLOG(INFO) << __FUNCTION__ << " " << this; 363 DLOG(INFO) << __FUNCTION__ << " " << this;
357 Invalidate(); 364 Invalidate();
358 } 365 }
359 366
360 HRESULT ProtData::Read(void* buffer, ULONG size, ULONG* size_read) { 367 HRESULT ProtData::Read(void* buffer, ULONG size, ULONG* size_read) {
361 if (renderer_type_ == UNDETERMINED) { 368 if (renderer_type_ == RENDERER_TYPE_UNDETERMINED) {
362 return E_PENDING; 369 return E_PENDING;
363 } 370 }
364 371
365 const ULONG bytes_available = buffer_size_ - buffer_pos_; 372 const ULONG bytes_available = buffer_size_ - buffer_pos_;
366 const ULONG bytes_to_copy = std::min(bytes_available, size); 373 const ULONG bytes_to_copy = std::min(bytes_available, size);
367 if (bytes_to_copy) { 374 if (bytes_to_copy) {
368 // Copy from the local buffer. 375 // Copy from the local buffer.
369 memcpy(buffer, buffer_ + buffer_pos_, bytes_to_copy); 376 memcpy(buffer, buffer_ + buffer_pos_, bytes_to_copy);
370 *size_read = bytes_to_copy; 377 *size_read = bytes_to_copy;
371 buffer_pos_ += bytes_to_copy; 378 buffer_pos_ += bytes_to_copy;
(...skipping 10 matching lines...) Expand all
382 if (size_read) 389 if (size_read)
383 *size_read = bytes_to_copy + new_data; 390 *size_read = bytes_to_copy + new_data;
384 return hr; 391 return hr;
385 } 392 }
386 393
387 return read_fun_(protocol_, buffer, size, size_read); 394 return read_fun_(protocol_, buffer, size, size_read);
388 } 395 }
389 396
390 // Attempt to detect ChromeFrame from HTTP headers when 397 // Attempt to detect ChromeFrame from HTTP headers when
391 // BINDSTATUS_MIMETYPEAVAILABLE is received. 398 // BINDSTATUS_MIMETYPEAVAILABLE is received.
392 // There are three possible outcomes: CHROME/OTHER/UNDETERMINED. 399 // There are three possible outcomes: CHROME_*/OTHER/UNDETERMINED.
393 // If UNDETERMINED we are going to sniff the content later in ReportData(). 400 // If RENDERER_TYPE_UNDETERMINED we are going to sniff the content later in
401 // ReportData().
394 // 402 //
395 // With not-so-well-written software (mime filters/protocols/protocol patchers) 403 // With not-so-well-written software (mime filters/protocols/protocol patchers)
396 // BINDSTATUS_MIMETYPEAVAILABLE might be fired multiple times with different 404 // BINDSTATUS_MIMETYPEAVAILABLE might be fired multiple times with different
397 // values for the same client. 405 // values for the same client.
398 // If the renderer_type_ member is: 406 // If the renderer_type_ member is:
399 // CHROME - 2nd (and any subsequent) BINDSTATUS_MIMETYPEAVAILABLE is ignored. 407 // RENDERER_TYPE_CHROME_* - 2nd (and any subsequent)
400 // OTHER - 2nd (and any subsequent) BINDSTATUS_MIMETYPEAVAILABLE is 408 // BINDSTATUS_MIMETYPEAVAILABLE is ignored.
401 // passed through. 409 // RENDERER_TYPE_OTHER - 2nd (and any subsequent) BINDSTATUS_MIMETYPEAVAILABLE
402 // UNDETERMINED - Try to detect ChromeFrame from HTTP headers (acts as if this 410 // is passed through.
403 // is the first time BINDSTATUS_MIMETYPEAVAILABLE is received). 411 // RENDERER_TYPE_UNDETERMINED - Try to detect ChromeFrame from HTTP headers
412 // (acts as if this is the first time
413 // BINDSTATUS_MIMETYPEAVAILABLE is received).
404 HRESULT ProtData::ReportProgress(IInternetProtocolSink* delegate, 414 HRESULT ProtData::ReportProgress(IInternetProtocolSink* delegate,
405 ULONG status_code, LPCWSTR status_text) { 415 ULONG status_code, LPCWSTR status_text) {
406 switch (status_code) { 416 switch (status_code) {
407 case BINDSTATUS_DIRECTBIND: 417 case BINDSTATUS_DIRECTBIND:
408 renderer_type_ = OTHER; 418 renderer_type_ = RENDERER_TYPE_OTHER;
409 break; 419 break;
410 420
411 case BINDSTATUS_REDIRECTING: 421 case BINDSTATUS_REDIRECTING:
412 url_.empty(); 422 url_.empty();
413 if (status_text) 423 if (status_text)
414 url_ = status_text; 424 url_ = status_text;
415 break; 425 break;
416 426
417 case BINDSTATUS_SERVER_MIMETYPEAVAILABLE: 427 case BINDSTATUS_SERVER_MIMETYPEAVAILABLE:
418 has_server_mime_type_ = true; 428 has_server_mime_type_ = true;
419 SaveSuggestedMimeType(status_text); 429 SaveSuggestedMimeType(status_text);
420 return S_OK; 430 return S_OK;
421 431
422 // TODO(stoyan): BINDSTATUS_RAWMIMETYPE 432 // TODO(stoyan): BINDSTATUS_RAWMIMETYPE
423 case BINDSTATUS_MIMETYPEAVAILABLE: 433 case BINDSTATUS_MIMETYPEAVAILABLE:
424 case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: 434 case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE:
425 SaveSuggestedMimeType(status_text); 435 SaveSuggestedMimeType(status_text);
426 // When Transaction is attached i.e. when existing BTS it terminated 436 // When Transaction is attached i.e. when existing BTS it terminated
427 // and "converted" to BTO, events will be re-fired for the new sink, 437 // and "converted" to BTO, events will be re-fired for the new sink,
428 // but we may skip the renderer_type_ determination since it's already 438 // but we may skip the renderer_type_ determination since it's already
429 // done. 439 // done.
430 if (renderer_type_ == UNDETERMINED) { 440 if (renderer_type_ == RENDERER_TYPE_UNDETERMINED) {
431 // This may seem awkward. CBinding's implementation of IWinInetHttpInfo 441 // This may seem awkward. CBinding's implementation of IWinInetHttpInfo
432 // will forward to CTransaction that will forward to the real protocol. 442 // will forward to CTransaction that will forward to the real protocol.
433 // We may ask CTransaction (our protocol_ member) for IWinInetHttpInfo. 443 // We may ask CTransaction (our protocol_ member) for IWinInetHttpInfo.
434 ScopedComPtr<IWinInetHttpInfo> info; 444 ScopedComPtr<IWinInetHttpInfo> info;
435 info.QueryFrom(delegate); 445 info.QueryFrom(delegate);
436 renderer_type_ = DetermineRendererTypeFromMetaData(suggested_mime_type_, 446 renderer_type_ = DetermineRendererTypeFromMetaData(suggested_mime_type_,
437 url_, info); 447 url_, info);
438 } 448 }
439 449
440 if (renderer_type_ == CHROME) { 450 if (IsChrome(renderer_type_)) {
441 // Suggested mime type is "text/html" and we either have OptInUrl 451 // Suggested mime type is "text/html" and we have DEFAULT_RENDERER,
442 // or X-UA-Compatible HTTP headers. 452 // OPT_IN_URL, or RESPONSE_HEADER.
443 DLOG(INFO) << "Forwarding BINDSTATUS_MIMETYPEAVAILABLE " 453 DLOG(INFO) << "Forwarding BINDSTATUS_MIMETYPEAVAILABLE "
444 << kChromeMimeType; 454 << kChromeMimeType;
445 SaveReferrer(delegate); 455 SaveReferrer(delegate);
446 delegate->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, kChromeMimeType); 456 delegate->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, kChromeMimeType);
447 } else if (renderer_type_ == OTHER) { 457 } else if (renderer_type_ == RENDERER_TYPE_OTHER) {
448 // Suggested mime type is not "text/html" - we are not interested in 458 // Suggested mime type is not "text/html" - we are not interested in
449 // this request anymore. 459 // this request anymore.
450 FireSuggestedMimeType(delegate); 460 FireSuggestedMimeType(delegate);
451 } else { 461 } else {
452 // Suggested mime type is "text/html"; We will try to sniff the 462 // Suggested mime type is "text/html"; We will try to sniff the
453 // HTML content in ReportData. 463 // HTML content in ReportData.
454 DCHECK_EQ(UNDETERMINED, renderer_type_); 464 DCHECK_EQ(RENDERER_TYPE_UNDETERMINED, renderer_type_);
455 } 465 }
456 return S_OK; 466 return S_OK;
457 } 467 }
458 468
459 // We are just pass through at this point, avoid false positive crash reports. 469 // We are just pass through at this point, avoid false positive crash reports.
460 ExceptionBarrierReportOnlyModule barrier; 470 ExceptionBarrierReportOnlyModule barrier;
461 return delegate->ReportProgress(status_code, status_text); 471 return delegate->ReportProgress(status_code, status_text);
462 } 472 }
463 473
464 HRESULT ProtData::ReportData(IInternetProtocolSink* delegate, 474 HRESULT ProtData::ReportData(IInternetProtocolSink* delegate,
465 DWORD flags, ULONG progress, ULONG max_progress) { 475 DWORD flags, ULONG progress, ULONG max_progress) {
466 if (renderer_type_ != UNDETERMINED) { 476 if (renderer_type_ != RENDERER_TYPE_UNDETERMINED) {
467 // We are just pass through now, avoid false positive crash reports. 477 // We are just pass through now, avoid false positive crash reports.
468 ExceptionBarrierReportOnlyModule barrier; 478 ExceptionBarrierReportOnlyModule barrier;
469 return delegate->ReportData(flags, progress, max_progress); 479 return delegate->ReportData(flags, progress, max_progress);
470 } 480 }
471 481
472 HRESULT hr = FillBuffer(); 482 HRESULT hr = FillBuffer();
473 483
474 bool last_chance = false; 484 bool last_chance = false;
475 if (hr == S_OK || hr == S_FALSE) { 485 if (hr == S_OK || hr == S_FALSE) {
476 last_chance = true; 486 last_chance = true;
477 } 487 }
478 488
479 renderer_type_ = DetermineRendererType(buffer_, buffer_size_, last_chance); 489 renderer_type_ = DetermineRendererType(buffer_, buffer_size_, last_chance);
480 490
481 if (renderer_type_ == UNDETERMINED) { 491 if (renderer_type_ == RENDERER_TYPE_UNDETERMINED) {
482 // do not report anything, we need more data. 492 // do not report anything, we need more data.
483 return S_OK; 493 return S_OK;
484 } 494 }
485 495
486 if (renderer_type_ == CHROME) { 496 if (IsChrome(renderer_type_)) {
487 DLOG(INFO) << "Forwarding BINDSTATUS_MIMETYPEAVAILABLE " 497 DLOG(INFO) << "Forwarding BINDSTATUS_MIMETYPEAVAILABLE "
488 << kChromeMimeType; 498 << kChromeMimeType;
489 SaveReferrer(delegate); 499 SaveReferrer(delegate);
490 delegate->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, kChromeMimeType); 500 delegate->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, kChromeMimeType);
491 } 501 }
492 502
493 if (renderer_type_ == OTHER) { 503 if (renderer_type_ == RENDERER_TYPE_OTHER) {
494 FireSuggestedMimeType(delegate); 504 FireSuggestedMimeType(delegate);
495 } 505 }
496 506
497 // This is the first data notification we forward, since up to now we hold 507 // This is the first data notification we forward, since up to now we hold
498 // the content received. 508 // the content received.
499 flags |= BSCF_FIRSTDATANOTIFICATION; 509 flags |= BSCF_FIRSTDATANOTIFICATION;
500 510
501 if (hr == S_FALSE) { 511 if (hr == S_FALSE) {
502 flags |= (BSCF_LASTDATANOTIFICATION | BSCF_DATAFULLYAVAILABLE); 512 flags |= (BSCF_LASTDATANOTIFICATION | BSCF_DATAFULLYAVAILABLE);
503 } 513 }
504 514
505 return delegate->ReportData(flags, progress, max_progress); 515 return delegate->ReportData(flags, progress, max_progress);
506 } 516 }
507 517
508 HRESULT ProtData::ReportResult(IInternetProtocolSink* delegate, HRESULT result, 518 HRESULT ProtData::ReportResult(IInternetProtocolSink* delegate, HRESULT result,
509 DWORD error, LPCWSTR result_text) { 519 DWORD error, LPCWSTR result_text) {
510 // We may receive ReportResult without ReportData, if the connection fails 520 // We may receive ReportResult without ReportData, if the connection fails
511 // for example. 521 // for example.
512 if (renderer_type_ == UNDETERMINED) { 522 if (renderer_type_ == RENDERER_TYPE_UNDETERMINED) {
513 DLOG(INFO) << "ReportResult received but renderer type is yet unknown."; 523 DLOG(INFO) << "ReportResult received but renderer type is yet unknown.";
514 renderer_type_ = OTHER; 524 renderer_type_ = RENDERER_TYPE_OTHER;
515 FireSuggestedMimeType(delegate); 525 FireSuggestedMimeType(delegate);
516 } 526 }
517 527
518 HRESULT hr = S_OK; 528 HRESULT hr = S_OK;
519 if (delegate) 529 if (delegate)
520 hr = delegate->ReportResult(result, error, result_text); 530 hr = delegate->ReportResult(result, error, result_text);
521 return hr; 531 return hr;
522 } 532 }
523 533
524 534
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 568
559 if (has_suggested_mime_type_) { 569 if (has_suggested_mime_type_) {
560 DLOG(INFO) << "Forwarding BINDSTATUS_MIMETYPEAVAILABLE " 570 DLOG(INFO) << "Forwarding BINDSTATUS_MIMETYPEAVAILABLE "
561 << suggested_mime_type_; 571 << suggested_mime_type_;
562 delegate->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, 572 delegate->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE,
563 suggested_mime_type_); 573 suggested_mime_type_);
564 } 574 }
565 } 575 }
566 576
567 void ProtData::SaveReferrer(IInternetProtocolSink* delegate) { 577 void ProtData::SaveReferrer(IInternetProtocolSink* delegate) {
568 DCHECK_EQ(CHROME, renderer_type_); 578 DCHECK(IsChrome(renderer_type_));
569 ScopedComPtr<IWinInetHttpInfo> info; 579 ScopedComPtr<IWinInetHttpInfo> info;
570 info.QueryFrom(delegate); 580 info.QueryFrom(delegate);
571 if (info) { 581 if (info) {
572 char buffer[4096] = {0}; 582 char buffer[4096] = {0};
573 DWORD len = sizeof(buffer); 583 DWORD len = sizeof(buffer);
574 DWORD flags = 0; 584 DWORD flags = 0;
575 HRESULT hr = info->QueryInfo( 585 HRESULT hr = info->QueryInfo(
576 HTTP_QUERY_REFERER | HTTP_QUERY_FLAG_REQUEST_HEADERS, 586 HTTP_QUERY_REFERER | HTTP_QUERY_FLAG_REQUEST_HEADERS,
577 buffer, &len, &flags, 0); 587 buffer, &len, &flags, 0);
578 if (hr == S_OK && len > 0) 588 if (hr == S_OK && len > 0)
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 // Explicit release, otherwise ~CComObjectStackEx will complain about 945 // Explicit release, otherwise ~CComObjectStackEx will complain about
936 // outstanding reference to us, because it runs before ~FakeProtocol 946 // outstanding reference to us, because it runs before ~FakeProtocol
937 prot.transaction_.Release(); 947 prot.transaction_.Release();
938 } 948 }
939 } 949 }
940 950
941 void TransactionHooks::RevertHooks() { 951 void TransactionHooks::RevertHooks() {
942 vtable_patch::UnpatchInterfaceMethods(CTransaction_PatchInfo); 952 vtable_patch::UnpatchInterfaceMethods(CTransaction_PatchInfo);
943 vtable_patch::UnpatchInterfaceMethods(CTransaction2_PatchInfo); 953 vtable_patch::UnpatchInterfaceMethods(CTransaction2_PatchInfo);
944 } 954 }
OLDNEW
« no previous file with comments | « chrome_frame/protocol_sink_wrap.h ('k') | chrome_frame/test/chrome_frame_test_utils.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698