| Index: chrome_frame/test/chrome_frame_unittests.h
|
| ===================================================================
|
| --- chrome_frame/test/chrome_frame_unittests.h (revision 0)
|
| +++ chrome_frame/test/chrome_frame_unittests.h (revision 0)
|
| @@ -0,0 +1,164 @@
|
| +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +#ifndef CHROME_FRAME_TEST_CHROME_FRAME_UNITTESTS_H_
|
| +#define CHROME_FRAME_TEST_CHROME_FRAME_UNITTESTS_H_
|
| +
|
| +#include <atlbase.h>
|
| +#include <atlcom.h>
|
| +#include <string>
|
| +#include <exdisp.h>
|
| +#include <exdispid.h>
|
| +
|
| +#include "base/ref_counted.h"
|
| +#include "base/scoped_handle_win.h"
|
| +#include "googleurl/src/gurl.h"
|
| +#include "chrome_frame/test/http_server.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +// Class that:
|
| +// 1) Starts the local webserver,
|
| +// 2) Supports launching browsers - Internet Explorer and Firefox with local url
|
| +// 3) Wait the webserver to finish. It is supposed the test webpage to shutdown
|
| +// the server by navigating to "kill" page
|
| +// 4) Supports read the posted results from the test webpage to the "dump"
|
| +// webserver directory
|
| +class ChromeFrameTestWithWebServer: public testing::Test {
|
| + protected:
|
| + enum BrowserKind { INVALID, IE, FIREFOX, OPERA, SAFARI, CHROME };
|
| +
|
| + bool LaunchBrowser(BrowserKind browser, const wchar_t* url);
|
| + bool WaitForTestToComplete(int milliseconds);
|
| + // Waits for the page to notify us of the window.onload event firing.
|
| + // Note that the milliseconds value is only approximate.
|
| + bool WaitForOnLoad(int milliseconds);
|
| + bool ReadResultFile(const std::wstring& file_name, std::string* data);
|
| +
|
| + // Launches the specified browser and waits for the test to complete
|
| + // (see WaitForTestToComplete). Then checks that the outcome is OK.
|
| + // This function uses EXPECT_TRUE and ASSERT_TRUE for all steps performed
|
| + // hence no return value.
|
| + void SimpleBrowserTest(BrowserKind browser, const wchar_t* page,
|
| + const wchar_t* result_file_to_check);
|
| +
|
| + // Same as SimpleBrowserTest but if the browser isn't installed (LaunchBrowser
|
| + // fails), the function will print out a warning but not treat the test
|
| + // as failed.
|
| + // Currently this is how we run Opera tests.
|
| + void OptionalBrowserTest(BrowserKind browser, const wchar_t* page,
|
| + const wchar_t* result_file_to_check);
|
| +
|
| + // Test if chrome frame correctly reports its version.
|
| + void VersionTest(BrowserKind browser, const wchar_t* page,
|
| + const wchar_t* result_file_to_check);
|
| +
|
| + void CloseBrowser();
|
| +
|
| + // Ensures (well, at least tries to ensure) that the browser window has focus.
|
| + bool BringBrowserToTop();
|
| +
|
| + // Returns true iff the specified result file contains 'expected result'.
|
| + bool CheckResultFile(const std::wstring& file_name,
|
| + const std::string& expected_result);
|
| +
|
| + virtual void SetUp();
|
| + virtual void TearDown();
|
| +
|
| + // Important: kind means "sheep" in Icelandic. ?:-o
|
| + const char* ToString(BrowserKind kind) {
|
| + switch (kind) {
|
| + case IE:
|
| + return "IE";
|
| + case FIREFOX:
|
| + return "Firefox";
|
| + case OPERA:
|
| + return "Opera";
|
| + case CHROME:
|
| + return "Chrome";
|
| + case SAFARI:
|
| + return "Safari";
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| + return "";
|
| + }
|
| +
|
| + BrowserKind browser_;
|
| + std::wstring results_dir_;
|
| + ScopedHandle browser_handle_;
|
| + ChromeFrameHTTPServer server_;
|
| +};
|
| +
|
| +// This class sets up event sinks to the IWebBrowser interface. Currently it
|
| +// subscribes to the following events:-
|
| +// 1. DISPID_BEFORENAVIGATE2
|
| +// 2. DISPID_NAVIGATEERROR
|
| +// 3. DISPID_NAVIGATECOMPLETE2
|
| +// 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) {
|
| + }
|
| +
|
| +BEGIN_COM_MAP(WebBrowserEventSink)
|
| +END_COM_MAP()
|
| +
|
| +BEGIN_SINK_MAP(WebBrowserEventSink)
|
| + SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2,
|
| + OnBeforeNavigate2, &kBeforeNavigate2Info)
|
| + SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2,
|
| + OnNavigateComplete2, &kNavigateComplete2Info)
|
| + SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_NAVIGATEERROR,
|
| + OnNavigateError, &kNavigateErrorInfo)
|
| +END_SINK_MAP()
|
| +
|
| + STDMETHOD_(void, OnNavigateError)(IDispatch* dispatch, VARIANT* url,
|
| + VARIANT* frame_name, VARIANT* status_code,
|
| + VARIANT* cancel) {
|
| + navigation_failed_ = true;
|
| + }
|
| +
|
| + STDMETHOD(OnBeforeNavigate2)(IDispatch* dispatch, VARIANT* url, VARIANT*
|
| + flags, VARIANT* target_frame_name,
|
| + 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;
|
| + }
|
| +
|
| + STDMETHOD_(void, OnNavigateComplete2)(IDispatch* dispatch, VARIANT* url) {
|
| + DLOG(INFO) << __FUNCTION__;
|
| + }
|
| +
|
| + bool navigation_failed() const {
|
| + return navigation_failed_;
|
| + }
|
| +
|
| + void set_main_thread_id(DWORD thread_id) {
|
| + main_thread_id_ = thread_id;
|
| + }
|
| +
|
| + protected:
|
| + bool navigation_failed_;
|
| +
|
| + static _ATL_FUNC_INFO kBeforeNavigate2Info;
|
| + static _ATL_FUNC_INFO kNavigateComplete2Info;
|
| + static _ATL_FUNC_INFO kNavigateErrorInfo;
|
| + DWORD main_thread_id_;
|
| +};
|
| +
|
| +#endif // CHROME_FRAME_TEST_CHROME_FRAME_UNITTESTS_H_
|
| +
|
|
|