| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "chrome_frame/test/ie_event_sink.h" | 5 #include "chrome_frame/test/ie_event_sink.h" |
| 6 | 6 |
| 7 #include <shlguid.h> | 7 #include <shlguid.h> |
| 8 #include <shobjidl.h> | 8 #include <shobjidl.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 LOG(ERROR) << "OnQuit was not received for browser with url " | 259 LOG(ERROR) << "OnQuit was not received for browser with url " |
| 260 << browser_url_string; | 260 << browser_url_string; |
| 261 web_browser2_->Quit(); | 261 web_browser2_->Quit(); |
| 262 } | 262 } |
| 263 | 263 |
| 264 base::win::ScopedHandle process; | 264 base::win::ScopedHandle process; |
| 265 process.Set(OpenProcess(SYNCHRONIZE, FALSE, ie_process_id_)); | 265 process.Set(OpenProcess(SYNCHRONIZE, FALSE, ie_process_id_)); |
| 266 web_browser2_.Release(); | 266 web_browser2_.Release(); |
| 267 | 267 |
| 268 if (!process.IsValid()) { | 268 if (!process.IsValid()) { |
| 269 DLOG_IF(WARNING, !process.IsValid()) | 269 LOG_IF(WARNING, !process.IsValid()) |
| 270 << base::StringPrintf("OpenProcess failed: %i", ::GetLastError()); | 270 << base::StringPrintf("OpenProcess failed: %i", ::GetLastError()); |
| 271 return; | 271 return; |
| 272 } | 272 } |
| 273 // IE may not have closed yet. Wait here for the process to finish. | 273 // IE may not have closed yet. Wait here for the process to finish. |
| 274 // This is necessary at least on some browser/platform configurations. | 274 // This is necessary at least on some browser/platform configurations. |
| 275 WaitForSingleObject(process, kDefaultWaitForIEToTerminateMs); | 275 WaitForSingleObject(process, kDefaultWaitForIEToTerminateMs); |
| 276 } | 276 } |
| 277 } else { | 277 } else { |
| 278 LOG(ERROR) << "Terminating hung IE process"; | 278 LOG(ERROR) << "Terminating hung IE process"; |
| 279 } | 279 } |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 } | 555 } |
| 556 | 556 |
| 557 // Event callbacks | 557 // Event callbacks |
| 558 STDMETHODIMP_(void) IEEventSink::OnDownloadBegin() { | 558 STDMETHODIMP_(void) IEEventSink::OnDownloadBegin() { |
| 559 if (listener_) | 559 if (listener_) |
| 560 listener_->OnDownloadBegin(); | 560 listener_->OnDownloadBegin(); |
| 561 } | 561 } |
| 562 | 562 |
| 563 STDMETHODIMP_(void) IEEventSink::OnNewWindow2(IDispatch** dispatch, | 563 STDMETHODIMP_(void) IEEventSink::OnNewWindow2(IDispatch** dispatch, |
| 564 VARIANT_BOOL* s) { | 564 VARIANT_BOOL* s) { |
| 565 DVLOG(1) << __FUNCTION__; | 565 VLOG(1) << __FUNCTION__; |
| 566 | 566 |
| 567 EXPECT_TRUE(dispatch); | 567 EXPECT_TRUE(dispatch); |
| 568 if (!dispatch) | 568 if (!dispatch) |
| 569 return; | 569 return; |
| 570 | 570 |
| 571 if (listener_) | 571 if (listener_) |
| 572 listener_->OnNewWindow2(dispatch, s); | 572 listener_->OnNewWindow2(dispatch, s); |
| 573 | 573 |
| 574 // Note that |dispatch| is an [in/out] argument. IE is asking listeners if | 574 // Note that |dispatch| is an [in/out] argument. IE is asking listeners if |
| 575 // they want to use a IWebBrowser2 of their choice for the new window. | 575 // they want to use a IWebBrowser2 of their choice for the new window. |
| 576 // Since we need to listen on events on the new browser, we create one | 576 // Since we need to listen on events on the new browser, we create one |
| 577 // if needed. | 577 // if needed. |
| 578 if (!*dispatch) { | 578 if (!*dispatch) { |
| 579 base::win::ScopedComPtr<IDispatch> new_browser; | 579 base::win::ScopedComPtr<IDispatch> new_browser; |
| 580 HRESULT hr = new_browser.CreateInstance(CLSID_InternetExplorer, NULL, | 580 HRESULT hr = new_browser.CreateInstance(CLSID_InternetExplorer, NULL, |
| 581 CLSCTX_LOCAL_SERVER); | 581 CLSCTX_LOCAL_SERVER); |
| 582 DCHECK(SUCCEEDED(hr) && new_browser); | 582 DCHECK(SUCCEEDED(hr) && new_browser); |
| 583 *dispatch = new_browser.Detach(); | 583 *dispatch = new_browser.Detach(); |
| 584 } | 584 } |
| 585 | 585 |
| 586 if (*dispatch && listener_) | 586 if (*dispatch && listener_) |
| 587 listener_->OnNewBrowserWindow(*dispatch, ScopedBstr()); | 587 listener_->OnNewBrowserWindow(*dispatch, ScopedBstr()); |
| 588 } | 588 } |
| 589 | 589 |
| 590 STDMETHODIMP_(void) IEEventSink::OnNavigateError(IDispatch* dispatch, | 590 STDMETHODIMP_(void) IEEventSink::OnNavigateError(IDispatch* dispatch, |
| 591 VARIANT* url, VARIANT* frame_name, VARIANT* status_code, VARIANT* cancel) { | 591 VARIANT* url, VARIANT* frame_name, VARIANT* status_code, VARIANT* cancel) { |
| 592 DVLOG(1) << __FUNCTION__; | 592 VLOG(1) << __FUNCTION__; |
| 593 if (listener_) | 593 if (listener_) |
| 594 listener_->OnNavigateError(dispatch, url, frame_name, status_code, cancel); | 594 listener_->OnNavigateError(dispatch, url, frame_name, status_code, cancel); |
| 595 } | 595 } |
| 596 | 596 |
| 597 STDMETHODIMP IEEventSink::OnBeforeNavigate2( | 597 STDMETHODIMP IEEventSink::OnBeforeNavigate2( |
| 598 IDispatch* dispatch, VARIANT* url, VARIANT* flags, | 598 IDispatch* dispatch, VARIANT* url, VARIANT* flags, |
| 599 VARIANT* target_frame_name, VARIANT* post_data, VARIANT* headers, | 599 VARIANT* target_frame_name, VARIANT* post_data, VARIANT* headers, |
| 600 VARIANT_BOOL* cancel) { | 600 VARIANT_BOOL* cancel) { |
| 601 DVLOG(1) << __FUNCTION__ | 601 VLOG(1) << __FUNCTION__ << " " |
| 602 << base::StringPrintf("%ls - 0x%08X", url->bstrVal, this); | 602 << base::StringPrintf("%ls - 0x%08X", url->bstrVal, this); |
| 603 // Reset any existing reference to chrome frame since this is a new | 603 // Reset any existing reference to chrome frame since this is a new |
| 604 // navigation. | 604 // navigation. |
| 605 DisconnectFromChromeFrame(); | 605 DisconnectFromChromeFrame(); |
| 606 if (listener_) | 606 if (listener_) |
| 607 listener_->OnBeforeNavigate2(dispatch, url, flags, target_frame_name, | 607 listener_->OnBeforeNavigate2(dispatch, url, flags, target_frame_name, |
| 608 post_data, headers, cancel); | 608 post_data, headers, cancel); |
| 609 return S_OK; | 609 return S_OK; |
| 610 } | 610 } |
| 611 | 611 |
| 612 STDMETHODIMP_(void) IEEventSink::OnNavigateComplete2( | 612 STDMETHODIMP_(void) IEEventSink::OnNavigateComplete2( |
| 613 IDispatch* dispatch, VARIANT* url) { | 613 IDispatch* dispatch, VARIANT* url) { |
| 614 DVLOG(1) << __FUNCTION__; | 614 VLOG(1) << __FUNCTION__; |
| 615 ConnectToChromeFrame(); | 615 ConnectToChromeFrame(); |
| 616 if (listener_) | 616 if (listener_) |
| 617 listener_->OnNavigateComplete2(dispatch, url); | 617 listener_->OnNavigateComplete2(dispatch, url); |
| 618 } | 618 } |
| 619 | 619 |
| 620 STDMETHODIMP_(void) IEEventSink::OnDocumentComplete( | 620 STDMETHODIMP_(void) IEEventSink::OnDocumentComplete( |
| 621 IDispatch* dispatch, VARIANT* url) { | 621 IDispatch* dispatch, VARIANT* url) { |
| 622 DVLOG(1) << __FUNCTION__; | 622 VLOG(1) << __FUNCTION__; |
| 623 EXPECT_TRUE(url); | 623 EXPECT_TRUE(url); |
| 624 if (!url) | 624 if (!url) |
| 625 return; | 625 return; |
| 626 if (listener_) | 626 if (listener_) |
| 627 listener_->OnDocumentComplete(dispatch, url); | 627 listener_->OnDocumentComplete(dispatch, url); |
| 628 } | 628 } |
| 629 | 629 |
| 630 STDMETHODIMP_(void) IEEventSink::OnFileDownload( | 630 STDMETHODIMP_(void) IEEventSink::OnFileDownload( |
| 631 VARIANT_BOOL active_doc, VARIANT_BOOL* cancel) { | 631 VARIANT_BOOL active_doc, VARIANT_BOOL* cancel) { |
| 632 DVLOG(1) << __FUNCTION__ | 632 VLOG(1) << __FUNCTION__ << " " |
| 633 << base::StringPrintf(" 0x%08X ad=%i", this, active_doc); | 633 << base::StringPrintf(" 0x%08X ad=%i", this, active_doc); |
| 634 if (listener_) { | 634 if (listener_) { |
| 635 listener_->OnFileDownload(active_doc, cancel); | 635 listener_->OnFileDownload(active_doc, cancel); |
| 636 } else { | 636 } else { |
| 637 *cancel = VARIANT_TRUE; | 637 *cancel = VARIANT_TRUE; |
| 638 } | 638 } |
| 639 } | 639 } |
| 640 | 640 |
| 641 STDMETHODIMP_(void) IEEventSink::OnNewWindow3( | 641 STDMETHODIMP_(void) IEEventSink::OnNewWindow3( |
| 642 IDispatch** dispatch, VARIANT_BOOL* cancel, DWORD flags, BSTR url_context, | 642 IDispatch** dispatch, VARIANT_BOOL* cancel, DWORD flags, BSTR url_context, |
| 643 BSTR url) { | 643 BSTR url) { |
| 644 DVLOG(1) << __FUNCTION__; | 644 VLOG(1) << __FUNCTION__; |
| 645 EXPECT_TRUE(dispatch); | 645 EXPECT_TRUE(dispatch); |
| 646 if (!dispatch) | 646 if (!dispatch) |
| 647 return; | 647 return; |
| 648 | 648 |
| 649 if (listener_) | 649 if (listener_) |
| 650 listener_->OnNewWindow3(dispatch, cancel, flags, url_context, url); | 650 listener_->OnNewWindow3(dispatch, cancel, flags, url_context, url); |
| 651 | 651 |
| 652 // Note that |dispatch| is an [in/out] argument. IE is asking listeners if | 652 // Note that |dispatch| is an [in/out] argument. IE is asking listeners if |
| 653 // they want to use a IWebBrowser2 of their choice for the new window. | 653 // they want to use a IWebBrowser2 of their choice for the new window. |
| 654 // Since we need to listen on events on the new browser, we create one | 654 // Since we need to listen on events on the new browser, we create one |
| 655 // if needed. | 655 // if needed. |
| 656 if (!*dispatch) { | 656 if (!*dispatch) { |
| 657 base::win::ScopedComPtr<IDispatch> new_browser; | 657 base::win::ScopedComPtr<IDispatch> new_browser; |
| 658 HRESULT hr = new_browser.CreateInstance(CLSID_InternetExplorer, NULL, | 658 HRESULT hr = new_browser.CreateInstance(CLSID_InternetExplorer, NULL, |
| 659 CLSCTX_LOCAL_SERVER); | 659 CLSCTX_LOCAL_SERVER); |
| 660 DCHECK(SUCCEEDED(hr) && new_browser); | 660 DCHECK(SUCCEEDED(hr) && new_browser); |
| 661 *dispatch = new_browser.Detach(); | 661 *dispatch = new_browser.Detach(); |
| 662 } | 662 } |
| 663 | 663 |
| 664 if (*dispatch && listener_) | 664 if (*dispatch && listener_) |
| 665 listener_->OnNewBrowserWindow(*dispatch, url); | 665 listener_->OnNewBrowserWindow(*dispatch, url); |
| 666 } | 666 } |
| 667 | 667 |
| 668 STDMETHODIMP_(void) IEEventSink::OnQuit() { | 668 STDMETHODIMP_(void) IEEventSink::OnQuit() { |
| 669 DVLOG(1) << __FUNCTION__; | 669 VLOG(1) << __FUNCTION__; |
| 670 | 670 |
| 671 did_receive_on_quit_ = true; | 671 did_receive_on_quit_ = true; |
| 672 | 672 |
| 673 DispEventUnadvise(web_browser2_); | 673 DispEventUnadvise(web_browser2_); |
| 674 CoDisconnectObject(this, 0); | 674 CoDisconnectObject(this, 0); |
| 675 | 675 |
| 676 if (listener_) | 676 if (listener_) |
| 677 listener_->OnQuit(); | 677 listener_->OnQuit(); |
| 678 } | 678 } |
| 679 | 679 |
| 680 STDMETHODIMP IEEventSink::Invoke(DISPID dispid, REFIID riid, LCID lcid, | 680 STDMETHODIMP IEEventSink::Invoke(DISPID dispid, REFIID riid, LCID lcid, |
| 681 WORD flags, DISPPARAMS* params, | 681 WORD flags, DISPPARAMS* params, |
| 682 VARIANT* result, EXCEPINFO* except_info, | 682 VARIANT* result, EXCEPINFO* except_info, |
| 683 UINT* arg_error) { | 683 UINT* arg_error) { |
| 684 VLOG(1) << __FUNCTION__ << L" event: " << g_dispIdToName.Get().Lookup(dispid); | 684 VLOG(1) << __FUNCTION__ << L" event: " << g_dispIdToName.Get().Lookup(dispid); |
| 685 return DispEventsImpl::Invoke(dispid, riid, lcid, flags, params, result, | 685 return DispEventsImpl::Invoke(dispid, riid, lcid, flags, params, result, |
| 686 except_info, arg_error); | 686 except_info, arg_error); |
| 687 } | 687 } |
| 688 | 688 |
| 689 HRESULT IEEventSink::OnLoad(const VARIANT* param) { | 689 HRESULT IEEventSink::OnLoad(const VARIANT* param) { |
| 690 DVLOG(1) << __FUNCTION__ << " " << param->bstrVal; | 690 VLOG(1) << __FUNCTION__ << " " << param->bstrVal; |
| 691 base::win::ScopedVariant stack_object(*param); | 691 base::win::ScopedVariant stack_object(*param); |
| 692 if (chrome_frame_) { | 692 if (chrome_frame_) { |
| 693 if (listener_) | 693 if (listener_) |
| 694 listener_->OnLoad(param->bstrVal); | 694 listener_->OnLoad(param->bstrVal); |
| 695 } else { | 695 } else { |
| 696 DLOG(WARNING) << "Invalid chrome frame pointer"; | 696 LOG(WARNING) << "Invalid chrome frame pointer"; |
| 697 } | 697 } |
| 698 return S_OK; | 698 return S_OK; |
| 699 } | 699 } |
| 700 | 700 |
| 701 HRESULT IEEventSink::OnLoadError(const VARIANT* param) { | 701 HRESULT IEEventSink::OnLoadError(const VARIANT* param) { |
| 702 DVLOG(1) << __FUNCTION__ << " " << param->bstrVal; | 702 VLOG(1) << __FUNCTION__ << " " << param->bstrVal; |
| 703 if (chrome_frame_) { | 703 if (chrome_frame_) { |
| 704 if (listener_) | 704 if (listener_) |
| 705 listener_->OnLoadError(param->bstrVal); | 705 listener_->OnLoadError(param->bstrVal); |
| 706 } else { | 706 } else { |
| 707 DLOG(WARNING) << "Invalid chrome frame pointer"; | 707 LOG(WARNING) << "Invalid chrome frame pointer"; |
| 708 } | 708 } |
| 709 return S_OK; | 709 return S_OK; |
| 710 } | 710 } |
| 711 | 711 |
| 712 HRESULT IEEventSink::OnMessage(const VARIANT* param) { | 712 HRESULT IEEventSink::OnMessage(const VARIANT* param) { |
| 713 DVLOG(1) << __FUNCTION__ << " " << param; | 713 VLOG(1) << __FUNCTION__ << " " << param; |
| 714 if (!chrome_frame_.get()) { | 714 if (!chrome_frame_.get()) { |
| 715 DLOG(WARNING) << "Invalid chrome frame pointer"; | 715 LOG(WARNING) << "Invalid chrome frame pointer"; |
| 716 return S_OK; | 716 return S_OK; |
| 717 } | 717 } |
| 718 | 718 |
| 719 base::win::ScopedVariant data, origin, source; | 719 base::win::ScopedVariant data, origin, source; |
| 720 if (param && (V_VT(param) == VT_DISPATCH)) { | 720 if (param && (V_VT(param) == VT_DISPATCH)) { |
| 721 wchar_t* properties[] = { L"data", L"origin", L"source" }; | 721 wchar_t* properties[] = { L"data", L"origin", L"source" }; |
| 722 const int prop_count = arraysize(properties); | 722 const int prop_count = arraysize(properties); |
| 723 DISPID ids[prop_count] = {0}; | 723 DISPID ids[prop_count] = {0}; |
| 724 | 724 |
| 725 HRESULT hr = param->pdispVal->GetIDsOfNames(IID_NULL, properties, | 725 HRESULT hr = param->pdispVal->GetIDsOfNames(IID_NULL, properties, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 737 source.Receive(), NULL, NULL)); | 737 source.Receive(), NULL, NULL)); |
| 738 } | 738 } |
| 739 } | 739 } |
| 740 | 740 |
| 741 if (listener_) | 741 if (listener_) |
| 742 listener_->OnMessage(V_BSTR(&data), V_BSTR(&origin), V_BSTR(&source)); | 742 listener_->OnMessage(V_BSTR(&data), V_BSTR(&origin), V_BSTR(&source)); |
| 743 return S_OK; | 743 return S_OK; |
| 744 } | 744 } |
| 745 | 745 |
| 746 } // namespace chrome_frame_test | 746 } // namespace chrome_frame_test |
| OLD | NEW |