| Index: chrome_frame/test/chrome_frame_unittests.h
|
| ===================================================================
|
| --- chrome_frame/test/chrome_frame_unittests.h (revision 30411)
|
| +++ chrome_frame/test/chrome_frame_unittests.h (working copy)
|
| @@ -11,6 +11,7 @@
|
| #include <exdispid.h>
|
|
|
| #include "base/ref_counted.h"
|
| +#include "base/scoped_comptr_win.h"
|
| #include "base/scoped_handle_win.h"
|
| #include "googleurl/src/gurl.h"
|
| #include "chrome_frame/test/http_server.h"
|
| @@ -94,18 +95,34 @@
|
| // subscribes to the following events:-
|
| // 1. DISPID_BEFORENAVIGATE2
|
| // 2. DISPID_NAVIGATEERROR
|
| -// 3. DISPID_NAVIGATECOMPLETE2
|
| +// 3. DISPID_NAVIGATECOMPLETE2
|
| +// 4. DISPID_NEWWINDOW3
|
| // Other events can be subscribed to on an if needed basis.
|
| class WebBrowserEventSink
|
| : public CComObjectRootEx<CComSingleThreadModel>,
|
| public IDispEventSimpleImpl<0, WebBrowserEventSink,
|
| &DIID_DWebBrowserEvents2> {
|
| public:
|
| - WebBrowserEventSink()
|
| - : navigation_failed_(false),
|
| - main_thread_id_(0) {
|
| + typedef IDispEventSimpleImpl<0, WebBrowserEventSink,
|
| + &DIID_DWebBrowserEvents2> DispEventsImpl;
|
| + WebBrowserEventSink() {}
|
| + ~WebBrowserEventSink() {
|
| + Uninitialize();
|
| }
|
|
|
| + void Uninitialize() {
|
| + if (web_browser2_.get()) {
|
| + DispEventUnadvise(web_browser2_);
|
| + web_browser2_.Release();
|
| + }
|
| + }
|
| +
|
| + // Helper function to launch IE and navigate to a URL.
|
| + // Returns S_OK on success, S_FALSE if the test was not run, other
|
| + // errors on failure.
|
| + HRESULT LaunchIEAndNavigate(const std::wstring& navigate_url,
|
| + _IDispEvent* sink);
|
| +
|
| BEGIN_COM_MAP(WebBrowserEventSink)
|
| END_COM_MAP()
|
|
|
| @@ -116,12 +133,14 @@
|
| OnNavigateComplete2, &kNavigateComplete2Info)
|
| SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_NAVIGATEERROR,
|
| OnNavigateError, &kNavigateErrorInfo)
|
| + SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW3,
|
| + OnNewWindow3, &kNewWindow3Info)
|
| END_SINK_MAP()
|
|
|
| STDMETHOD_(void, OnNavigateError)(IDispatch* dispatch, VARIANT* url,
|
| VARIANT* frame_name, VARIANT* status_code,
|
| VARIANT* cancel) {
|
| - navigation_failed_ = true;
|
| + DLOG(INFO) << __FUNCTION__;
|
| }
|
|
|
| STDMETHOD(OnBeforeNavigate2)(IDispatch* dispatch, VARIANT* url, VARIANT*
|
| @@ -129,13 +148,6 @@
|
| VARIANT* post_data, VARIANT* headers,
|
| VARIANT_BOOL* cancel) {
|
| DLOG(INFO) << __FUNCTION__;
|
| - // If a navigation fails then IE issues a navigation to an interstitial
|
| - // page. Catch this to track navigation errors as the NavigateError
|
| - // notification does not seem to fire reliably.
|
| - GURL crack_url(url->bstrVal);
|
| - if (crack_url.scheme() == "res") {
|
| - navigation_failed_ = true;
|
| - }
|
| return S_OK;
|
| }
|
|
|
| @@ -143,21 +155,31 @@
|
| DLOG(INFO) << __FUNCTION__;
|
| }
|
|
|
| - bool navigation_failed() const {
|
| - return navigation_failed_;
|
| + STDMETHOD_(void, OnNewWindow3)(IDispatch** dispatch, VARIANT_BOOL* Cancel,
|
| + DWORD flags, BSTR url_context, BSTR url) {
|
| + DLOG(INFO) << __FUNCTION__;
|
| }
|
|
|
| - void set_main_thread_id(DWORD thread_id) {
|
| - main_thread_id_ = thread_id;
|
| +#ifdef _DEBUG
|
| + STDMETHOD(Invoke)(DISPID dispid, REFIID riid,
|
| + LCID lcid, WORD flags, DISPPARAMS* params, VARIANT* result,
|
| + EXCEPINFO* except_info, UINT* arg_error) {
|
| + DLOG(INFO) << __FUNCTION__ << L" disp id :" << dispid;
|
| + return DispEventsImpl::Invoke(dispid, riid, lcid, flags, params, result,
|
| + except_info, arg_error);
|
| }
|
| +#endif // _DEBUG
|
|
|
| + IWebBrowser2* web_browser2() {
|
| + return web_browser2_.get();
|
| + }
|
| +
|
| protected:
|
| - bool navigation_failed_;
|
| -
|
| static _ATL_FUNC_INFO kBeforeNavigate2Info;
|
| static _ATL_FUNC_INFO kNavigateComplete2Info;
|
| static _ATL_FUNC_INFO kNavigateErrorInfo;
|
| - DWORD main_thread_id_;
|
| + static _ATL_FUNC_INFO kNewWindow3Info;
|
| + ScopedComPtr<IWebBrowser2> web_browser2_;
|
| };
|
|
|
| #endif // CHROME_FRAME_TEST_CHROME_FRAME_UNITTESTS_H_
|
|
|