| Index: chrome_frame/test/mock_ie_event_sink_test.h
|
| diff --git a/chrome_frame/test/mock_ie_event_sink_test.h b/chrome_frame/test/mock_ie_event_sink_test.h
|
| deleted file mode 100644
|
| index 262597e5bbb0d1d124e55e2c587d76dfc1daef50..0000000000000000000000000000000000000000
|
| --- a/chrome_frame/test/mock_ie_event_sink_test.h
|
| +++ /dev/null
|
| @@ -1,368 +0,0 @@
|
| -// Copyright (c) 2012 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_MOCK_IE_EVENT_SINK_TEST_H_
|
| -#define CHROME_FRAME_TEST_MOCK_IE_EVENT_SINK_TEST_H_
|
| -
|
| -#include <atlbase.h>
|
| -#include <atlcom.h>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/files/file_path.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/win/object_watcher.h"
|
| -#include "chrome_frame/test/chrome_frame_test_utils.h"
|
| -#include "chrome_frame/test/chrome_frame_ui_test_utils.h"
|
| -#include "chrome_frame/test/ie_event_sink.h"
|
| -#include "chrome_frame/test/test_server.h"
|
| -#include "chrome_frame/test/test_with_web_server.h"
|
| -#include "chrome_frame/test/win_event_receiver.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "third_party/xulrunner-sdk/win/include/accessibility/AccessibleEventId.h"
|
| -
|
| -namespace chrome_frame_test {
|
| -
|
| -// Convenience enum for specifying whether a load occurred in IE or CF.
|
| -enum LoadedInRenderer {
|
| - IN_IE = 0,
|
| - IN_CF
|
| -};
|
| -
|
| -// This mocks an IEEventListener, providing methods for expecting certain
|
| -// sequences of events.
|
| -class MockIEEventSink : public IEEventListener {
|
| - public:
|
| - MockIEEventSink() {
|
| - CComObject<IEEventSink>::CreateInstance(&event_sink_);
|
| - event_sink_->AddRef();
|
| - }
|
| -
|
| - ~MockIEEventSink() {
|
| - Detach();
|
| - int reference_count = event_sink_->reference_count();
|
| - LOG_IF(ERROR, reference_count != 1)
|
| - << "Event sink is still referenced externally: ref count = "
|
| - << reference_count;
|
| - event_sink_->Release();
|
| - }
|
| -
|
| - // Override IEEventListener methods.
|
| - MOCK_METHOD7(OnBeforeNavigate2, void (IDispatch* dispatch, // NOLINT
|
| - VARIANT* url,
|
| - VARIANT* flags,
|
| - VARIANT* target_frame_name,
|
| - VARIANT* post_data,
|
| - VARIANT* headers,
|
| - VARIANT_BOOL* cancel));
|
| - MOCK_METHOD2(OnNavigateComplete2, void (IDispatch* dispatch, // NOLINT
|
| - VARIANT* url));
|
| - MOCK_METHOD5(OnNewWindow3, void (IDispatch** dispatch, // NOLINT
|
| - VARIANT_BOOL* cancel,
|
| - DWORD flags,
|
| - BSTR url_context,
|
| - BSTR url));
|
| - MOCK_METHOD2(OnNewWindow2, void (IDispatch** dispatch, // NOLINT
|
| - VARIANT_BOOL* cancel));
|
| - MOCK_METHOD5(OnNavigateError, void (IDispatch* dispatch, // NOLINT
|
| - VARIANT* url,
|
| - VARIANT* frame_name,
|
| - VARIANT* status_code,
|
| - VARIANT* cancel));
|
| - MOCK_METHOD2(OnFileDownload, void (VARIANT_BOOL active_doc, // NOLINT
|
| - VARIANT_BOOL* cancel));
|
| - MOCK_METHOD0(OnQuit, void ()); // NOLINT
|
| - MOCK_METHOD1(OnLoadError, void (const wchar_t* url)); // NOLINT
|
| - MOCK_METHOD3(OnMessage, void (const wchar_t* message, // NOLINT
|
| - const wchar_t* origin,
|
| - const wchar_t* source));
|
| - MOCK_METHOD2(OnNewBrowserWindow, void (IDispatch* dispatch, // NOLINT
|
| - const wchar_t* url));
|
| -
|
| - // Convenience OnLoad method which is called once when a page is loaded with
|
| - // |is_cf| set to whether the renderer is CF or not.
|
| - MOCK_METHOD2(OnLoad, void (bool is_cf, const wchar_t* url)); // NOLINT
|
| -
|
| - // Attach |dispatch| to the event sink and begin listening to the source's
|
| - // events.
|
| - void Attach(IDispatch* dispatch) {
|
| - event_sink_->set_listener(this);
|
| - event_sink_->Attach(dispatch);
|
| - }
|
| -
|
| - void Detach() {
|
| - event_sink_->set_listener(NULL);
|
| - event_sink_->Uninitialize();
|
| - }
|
| -
|
| - // Expect a normal navigation to |url| to occur in CF or IE.
|
| - void ExpectNavigation(bool is_cf, const std::wstring& url);
|
| -
|
| - // Similar as above, but should be used in cases where IE6 with CF may not
|
| - // generate an OnBeforeNavigate event during the navigation. This occurs
|
| - // during in-page navigation (via anchors), form submission, window.open
|
| - // to target "self", and possibly others.
|
| - void ExpectNavigationOptionalBefore(bool is_cf, const std::wstring& url);
|
| -
|
| - // Expect a navigation in a new window created by a window.open call to |url|.
|
| - // |parent_cf| signifies whether the parent frame was loaded in CF, while
|
| - // |new_window_cf| signifies whether to expect the new page to be loaded in
|
| - // CF.
|
| - void ExpectJavascriptWindowOpenNavigation(bool parent_cf, bool new_window_cf,
|
| - const std::wstring& url);
|
| -
|
| - // Expect a new window to open. The new event sink will be attached to
|
| - // |new_window_mock|.
|
| - void ExpectNewWindow(MockIEEventSink* new_window_mock);
|
| -
|
| - // Expects any and all navigations.
|
| - void ExpectAnyNavigations();
|
| -
|
| - void ExpectDocumentReadystate(int ready_state);
|
| -
|
| - IEEventSink* event_sink() { return event_sink_; }
|
| -
|
| - private:
|
| - // Override IE's OnDocumentComplete to call our OnLoad, iff it is IE actually
|
| - // rendering the page.
|
| - virtual void OnDocumentComplete(IDispatch* dispatch, VARIANT* url);
|
| -
|
| - // Override CF's OnLoad to call our OnLoad.
|
| - virtual void OnLoad(const wchar_t* url) {
|
| - OnLoad(IN_CF, url);
|
| - }
|
| -
|
| - // Helper method for expecting navigations. |before_cardinality| specifies
|
| - // the cardinality for the BeforeNavigate expectation and
|
| - // |complete_cardinality| specifies the cardinality for the NavigateComplete
|
| - // expectation. Returns the set of expectations added.
|
| - // Note: Prefer making a new Expect... method before making this public.
|
| - testing::ExpectationSet ExpectNavigationCardinality(const std::wstring& url,
|
| - testing::Cardinality before_cardinality,
|
| - testing::Cardinality complete_cardinality);
|
| -
|
| - // It may be necessary to create this on the heap. Otherwise, if the
|
| - // reference count is greater than zero, a debug assert will be triggered
|
| - // in the destructor. This happens at least when IE crashes. In that case,
|
| - // DispEventUnadvise and CoDisconnectObject are not sufficient to decrement
|
| - // the reference count.
|
| - // TODO(kkania): Investigate if the above is true.
|
| - CComObject<IEEventSink>* event_sink_;
|
| -};
|
| -
|
| -// This mocks a PropertyNotifySinkListener, providing methods for
|
| -// expecting certain sequences of events.
|
| -class MockPropertyNotifySinkListener : public PropertyNotifySinkListener {
|
| - public:
|
| - MockPropertyNotifySinkListener() : cookie_(0), sink_(NULL) {
|
| - CComObject<PropertyNotifySinkImpl>::CreateInstance(&sink_);
|
| - sink_->AddRef();
|
| - sink_->set_listener(this);
|
| - }
|
| -
|
| - ~MockPropertyNotifySinkListener() {
|
| - Detach();
|
| - sink_->set_listener(NULL);
|
| - LOG_IF(ERROR, sink_->m_dwRef != 1)
|
| - << "Event sink is still referenced externally: ref count = "
|
| - << sink_->m_dwRef;
|
| - sink_->Release();
|
| - }
|
| -
|
| - // Override PropertyNotifySinkListener methods.
|
| - MOCK_METHOD1(OnChanged, void (DISPID dispid)); // NOLINT
|
| -
|
| - bool Attach(IUnknown* obj) {
|
| - DCHECK_EQ(cookie_, 0UL);
|
| - DCHECK(obj);
|
| - HRESULT hr = AtlAdvise(obj, sink_->GetUnknown(), IID_IPropertyNotifySink,
|
| - &cookie_);
|
| - if (SUCCEEDED(hr)) {
|
| - event_source_ = obj;
|
| - } else {
|
| - LOG(ERROR) << base::StringPrintf("AtlAdvise: 0x%08X", hr);
|
| - cookie_ = 0;
|
| - }
|
| -
|
| - return SUCCEEDED(hr);
|
| - }
|
| -
|
| - void Detach() {
|
| - if (event_source_) {
|
| - DCHECK_NE(cookie_, 0UL);
|
| - AtlUnadvise(event_source_, IID_IPropertyNotifySink, cookie_);
|
| - event_source_.Release();
|
| - cookie_ = 0;
|
| - }
|
| - }
|
| -
|
| - private:
|
| - CComObject<PropertyNotifySinkImpl>* sink_;
|
| - DWORD cookie_;
|
| - base::win::ScopedComPtr<IUnknown> event_source_;
|
| -};
|
| -
|
| -// Allows tests to observe when processes exit.
|
| -class MockObjectWatcherDelegate : public base::win::ObjectWatcher::Delegate {
|
| - public:
|
| - // base::win::ObjectWatcher::Delegate implementation
|
| - MOCK_METHOD1(OnObjectSignaled, void (HANDLE process_handle)); // NOLINT
|
| -
|
| - virtual ~MockObjectWatcherDelegate() {
|
| - // Would be nice to free them when OnObjectSignaled is called, too, but
|
| - // it doesn't seem worth it.
|
| - for (std::vector<HANDLE>::iterator it = process_handles_.begin();
|
| - it != process_handles_.end(); ++it) {
|
| - ::CloseHandle(*it);
|
| - }
|
| - }
|
| -
|
| - // Registers this instance to watch |process_handle| for termination.
|
| - void WatchProcess(HANDLE process_handle) {
|
| - process_handles_.push_back(process_handle);
|
| - object_watcher_.StartWatching(process_handle, this);
|
| - }
|
| -
|
| - // Registers this instance to watch |hwnd|'s owning process for termination.
|
| - void WatchProcessForHwnd(HWND hwnd) {
|
| - DWORD pid = 0;
|
| - ::GetWindowThreadProcessId(hwnd, &pid);
|
| - EXPECT_TRUE(pid);
|
| - if (pid != 0) {
|
| - HANDLE process_handle = ::OpenProcess(SYNCHRONIZE, FALSE, pid);
|
| - EXPECT_TRUE(process_handle);
|
| - if (process_handle != NULL) {
|
| - WatchProcess(process_handle);
|
| - }
|
| - }
|
| - }
|
| -
|
| - private:
|
| - std::vector<HANDLE> process_handles_;
|
| - base::win::ObjectWatcher object_watcher_;
|
| -};
|
| -
|
| -// Mocks a window observer so that tests can detect new windows.
|
| -class MockWindowObserver : public WindowObserver {
|
| - public:
|
| - // WindowObserver implementation
|
| - MOCK_METHOD1(OnWindowOpen, void (HWND hwnd)); // NOLINT
|
| - MOCK_METHOD1(OnWindowClose, void (HWND hwnd)); // NOLINT
|
| -
|
| - void WatchWindow(std::string caption_pattern, std::string class_pattern) {
|
| - window_watcher_.AddObserver(this, caption_pattern, class_pattern);
|
| - }
|
| -
|
| - private:
|
| - WindowWatchdog window_watcher_;
|
| -};
|
| -
|
| -class MockAccEventObserver : public AccEventObserver {
|
| - public:
|
| - MOCK_METHOD1(OnAccDocLoad, void (HWND)); // NOLINT
|
| - MOCK_METHOD3(OnAccValueChange, void (HWND, AccObject*, // NOLINT
|
| - const std::wstring&));
|
| - MOCK_METHOD1(OnMenuPopup, void (HWND)); // NOLINT
|
| - MOCK_METHOD2(OnTextCaretMoved, void (HWND, AccObject*)); // NOLINT
|
| -};
|
| -
|
| -// This test fixture provides common methods needed for testing CF
|
| -// integration with IE. gMock is used to verify that IE is reporting correct
|
| -// navigational events and MockWebServer is used to verify that the correct
|
| -// requests are going out.
|
| -class MockIEEventSinkTest {
|
| - public:
|
| - MockIEEventSinkTest();
|
| - MockIEEventSinkTest(int port, const std::wstring& address,
|
| - const base::FilePath& root_dir);
|
| -
|
| - ~MockIEEventSinkTest() {
|
| - // Detach manually here so that it occurs before |last_resort_close_ie_|
|
| - // is destroyed.
|
| - ie_mock_.Detach();
|
| - }
|
| -
|
| - // Launches IE as a COM server and sets |ie_mock_| as the event sink, then
|
| - // navigates to the given url. Then the timed message loop is run until
|
| - // |ie_mock_| receives OnQuit or the timeout is exceeded.
|
| - void LaunchIEAndNavigate(const std::wstring& url);
|
| -
|
| - // Same as above but allows the timeout to be specified.
|
| - void LaunchIENavigateAndLoop(const std::wstring& url,
|
| - base::TimeDelta timeout);
|
| -
|
| - // Returns the url for the test file given. |relative_path| should be
|
| - // relative to the test data directory.
|
| - std::wstring GetTestUrl(const std::wstring& relative_path);
|
| -
|
| - // Returns the absolute FilePath for the test file given. |relative_path|
|
| - // should be relative to the test data directory.
|
| - base::FilePath GetTestFilePath(const std::wstring& relative_path);
|
| -
|
| - // Returns the url for an html page just containing some text. Iff |use_cf|
|
| - // is true, the chrome_frame meta tag will be included too.
|
| - std::wstring GetSimplePageUrl() {
|
| - return GetTestUrl(L"simple.html");
|
| - }
|
| -
|
| - // Returns the title of the html page at |GetSimplePageUrl()|.
|
| - std::wstring GetSimplePageTitle() {
|
| - return L"simple web page";
|
| - }
|
| -
|
| - // Returns the url for an html page just containing one link to the simple
|
| - // page mentioned above.
|
| - std::wstring GetLinkPageUrl() {
|
| - return GetTestUrl(L"link.html");
|
| - }
|
| -
|
| - // Returns the title of the html page at |GetLinkPageUrl()|.
|
| - std::wstring GetLinkPageTitle() {
|
| - return L"link";
|
| - }
|
| -
|
| - // Returns the url for an html page containing several anchors pointing
|
| - // to different parts of the page. |index| specifies what fragment to
|
| - // append to the url. If zero, no fragment is appended. The highest fragment
|
| - // is #a4.
|
| - std::wstring GetAnchorPageUrl(int index) {
|
| - DCHECK_LT(index, 5);
|
| - std::wstring base_name = L"anchor.html";
|
| - if (index > 0)
|
| - base_name += std::wstring(L"#a") + base::IntToString16(index);
|
| - return GetTestUrl(base_name);
|
| - }
|
| -
|
| - // Returns the title of the html page at |GetAnchorPageUrl()|.
|
| - std::wstring GetAnchorPageTitle() {
|
| - return L"Chrome Frame Test";
|
| - }
|
| -
|
| - // Returns the url for an html page that will, when clicked, open a new window
|
| - // to |target|.
|
| - std::wstring GetWindowOpenUrl(const wchar_t* target) {
|
| - return GetTestUrl(std::wstring(L"window_open.html?").append(target));
|
| - }
|
| -
|
| - // Returns the title of the html page at |GetWindowOpenUrl()|.
|
| - std::wstring GetWindowOpenTitle() {
|
| - return L"window open";
|
| - }
|
| -
|
| - protected:
|
| - CloseIeAtEndOfScope last_resort_close_ie_;
|
| - chrome_frame_test::TimedMsgLoop loop_;
|
| - testing::StrictMock<MockIEEventSink> ie_mock_;
|
| - testing::StrictMock<MockWebServer> server_mock_;
|
| - scoped_refptr<HungCOMCallDetector> hung_call_detector_;
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(MockIEEventSinkTest);
|
| -};
|
| -
|
| -} // namespace chrome_frame_test
|
| -
|
| -#endif // CHROME_FRAME_TEST_MOCK_IE_EVENT_SINK_TEST_H_
|
|
|