#include <mshtmcid.h>
#include <string>
#include "base/test/test_file_util.h"
#include "base/utf_string_conversions.h"
#include "base/win/scoped_bstr.h"
#include "base/win/scoped_variant.h"
#include "base/win/windows_version.h"
#include "chrome/common/url_constants.h"
#include "chrome_frame/test/chrome_frame_test_utils.h"
#include "chrome_frame/test/chrome_frame_ui_test_utils.h"
#include "chrome_frame/test/mock_ie_event_sink_actions.h"
#include "chrome_frame/test/mock_ie_event_sink_test.h"
#include "testing/gmock_mutant.h"
using testing::_;
using testing::InSequence;
using testing::StrCaseEq;
using testing::StrEq;
namespace chrome_frame_test {
class FullTabUITest : public MockIEEventSinkTest,
public testing::TestWithParam<CFInvocation> {
public:
FullTabUITest() {}
virtual void SetUp() {
server_mock_.ExpectAndServeAnyRequests(GetParam());
ie_mock_.ExpectAnyNavigations();
}
};
INSTANTIATE_TEST_CASE_P(IE, FullTabUITest,
testing::Values(CFInvocation::None()));
INSTANTIATE_TEST_CASE_P(CF, FullTabUITest,
testing::Values(CFInvocation::MetaTag()));
TEST_P(FullTabUITest, KeyboardInput) {
if (!GetParam().invokes_cf()) {
LOG(ERROR) << "Test not implemented for this configuration.";
return;
}
std::wstring key_event_url = GetTestUrl(L"keyevent.html");
const char* input = "Chrome";
EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), StrEq(key_event_url)))
.WillOnce(PostCharMessagesToRenderer(&ie_mock_, input));
EXPECT_CALL(ie_mock_, OnMessage(StrCaseEq(UTF8ToWide(input)), _, _))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(key_event_url);
}
TEST_P(FullTabUITest, DISABLED_KeyboardBackForward) {
if (IsWorkstationLocked()) {
LOG(ERROR) << "This test cannot be run in a locked workstation.";
return;
}
std::wstring page1 = GetSimplePageUrl();
std::wstring page2 = GetLinkPageUrl();
bool in_cf = GetParam().invokes_cf();
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page1)))
.WillOnce(Navigate(&ie_mock_, page2));
short bkspace = VkKeyScanA(VK_BACK);
EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page2)))
.WillOnce(testing::DoAll(
SetFocusToRenderer(&ie_mock_),
DelaySendScanCode(&loop_,
base::TimeDelta::FromSeconds(1),
bkspace,
simulate_input::NONE)));
EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page1)))
.WillOnce(testing::DoAll(
SetFocusToRenderer(&ie_mock_),
DelaySendScanCode(&loop_,
base::TimeDelta::FromSeconds(1),
bkspace,
simulate_input::SHIFT)));
EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page2)))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIENavigateAndLoop(page1, kChromeFrameVeryLongNavigationTimeout);
}
TEST_P(FullTabUITest, FLAKY_CtrlN) {
if (IsWorkstationLocked()) {
LOG(ERROR) << "This test cannot be run in a locked workstation.";
return;
}
bool is_cf = GetParam().invokes_cf();
if (!is_cf) {
LOG(ERROR) << "Test not implemented for this configuration.";
return;
}
MockWindowObserver win_observer_mock;
const char* kNewWindowTitlePattern = "*Internet Explorer*";
EXPECT_CALL(ie_mock_, OnLoad(is_cf, StrEq(GetSimplePageUrl())))
.WillOnce(testing::DoAll(
WatchWindow(&win_observer_mock, kNewWindowTitlePattern, ""),
SetFocusToRenderer(&ie_mock_),
DelaySendChar(&loop_,
base::TimeDelta::FromSeconds(1),
'n',
simulate_input::CONTROL)));
EXPECT_CALL(win_observer_mock, OnWindowOpen(_))
.Times(testing::AtMost(2))
.WillOnce(CloseBrowserMock(&ie_mock_))
.WillOnce(testing::Return());
EXPECT_CALL(win_observer_mock, OnWindowClose(_))
.Times(testing::AtMost(2));
LaunchIENavigateAndLoop(GetSimplePageUrl(),
kChromeFrameVeryLongNavigationTimeout);
}
TEST_P(FullTabUITest, FLAKY_CtrlF) {
if (IsWorkstationLocked()) {
LOG(ERROR) << "This test cannot be run in a locked workstation.";
return;
}
bool is_cf = GetParam().invokes_cf();
if (!is_cf) {
LOG(ERROR) << "Test not implemented for this configuration.";
return;
}
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
MockWindowObserver win_observer_mock;
InSequence expect_in_sequence_for_scope;
const char* kFindDialogCaption = "Find";
EXPECT_CALL(ie_mock_, OnLoad(IN_CF, StrEq(GetSimplePageUrl())))
.WillOnce(testing::DoAll(
WatchWindow(&win_observer_mock, kFindDialogCaption, ""),
SetFocusToRenderer(&ie_mock_),
DelaySendChar(&loop_,
base::TimeDelta::FromMilliseconds(1500),
'f',
simulate_input::CONTROL)));
EXPECT_CALL(win_observer_mock, OnWindowOpen(_))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIENavigateAndLoop(GetSimplePageUrl(),
kChromeFrameVeryLongNavigationTimeout);
}
TEST_P(FullTabUITest, FLAKY_CtrlR) {
if (IsWorkstationLocked()) {
LOG(ERROR) << "This test cannot be run in a locked workstation.";
return;
}
EXPECT_CALL(server_mock_, Get(_, UrlPathEq(GetSimplePageUrl()), _))
.Times(testing::AtMost(2))
.WillRepeatedly(SendResponse(&server_mock_, GetParam()));
EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(),
StrEq(GetSimplePageUrl())))
.Times(testing::AtMost(2))
.WillOnce(testing::DoAll(
SetFocusToRenderer(&ie_mock_),
DelaySendChar(&loop_,
base::TimeDelta::FromSeconds(1),
'r',
simulate_input::CONTROL),
DelayCloseBrowserMock(
&loop_, base::TimeDelta::FromSeconds(4), &ie_mock_)))
.WillRepeatedly(testing::Return());
LaunchIENavigateAndLoop(GetSimplePageUrl(),
kChromeFrameVeryLongNavigationTimeout);
}
TEST_P(FullTabUITest, FLAKY_CtrlW) {
if (IsWorkstationLocked()) {
LOG(ERROR) << "This test cannot be run in a locked workstation.";
return;
}
EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(),
StrEq(GetSimplePageUrl())))
.WillOnce(testing::DoAll(
SetFocusToRenderer(&ie_mock_),
DelaySendChar(&loop_,
base::TimeDelta::FromSeconds(1),
'w',
simulate_input::CONTROL)));
LaunchIENavigateAndLoop(GetSimplePageUrl(),
kChromeFrameVeryLongNavigationTimeout);
}
TEST_P(FullTabUITest, FLAKY_AltD) {
if (IsWorkstationLocked()) {
LOG(ERROR) << "This test cannot be run in a locked workstation.";
return;
}
EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(),
StrEq(GetSimplePageUrl())))
.WillOnce(testing::DoAll(
SetFocusToRenderer(&ie_mock_),
TypeUrlInAddressBar(&loop_,
GetLinkPageUrl(),
base::TimeDelta::FromMilliseconds(1500))));
EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(),
StrEq(GetLinkPageUrl())))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIENavigateAndLoop(GetSimplePageUrl(),
kChromeFrameVeryLongNavigationTimeout);
}
TEST_P(FullTabUITest, DISABLED_RendererHasFocus) {
EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(),
StrEq(GetSimplePageUrl())))
.WillOnce(testing::DoAll(
ExpectRendererHasFocus(&ie_mock_),
CloseBrowserMock(&ie_mock_)));
LaunchIEAndNavigate(GetSimplePageUrl());
}
TEST_P(FullTabUITest, ViewSource) {
if (base::win::GetVersion() == base::win::VERSION_VISTA &&
GetInstalledIEVersion() == IE_7) {
LOG(INFO) << "Not running test on Vista with IE7";
return;
}
bool in_cf = GetParam().invokes_cf();
if (!in_cf) {
LOG(ERROR) << "Test not implemented for this configuration.";
return;
}
MockIEEventSink view_source_mock;
view_source_mock.ExpectAnyNavigations();
InSequence expect_in_sequence_for_scope;
VARIANT empty = base::win::ScopedVariant::kEmptyVariant;
EXPECT_CALL(ie_mock_, OnLoad(in_cf,
StrEq(GetSimplePageUrl())))
.WillOnce(DelayExecCommand(
&ie_mock_, &loop_, base::TimeDelta(), &CGID_MSHTML,
static_cast<OLECMDID>(IDM_VIEWSOURCE),
OLECMDEXECOPT_DONTPROMPTUSER, &empty, &empty));
std::wstring view_source_url;
view_source_url += UTF8ToWide(chrome::kViewSourceScheme);
view_source_url += L":";
view_source_url += GetSimplePageUrl();
std::wstring url_in_new_window = kChromeProtocolPrefix;
url_in_new_window += view_source_url;
ie_mock_.ExpectNewWindow(&view_source_mock);
EXPECT_CALL(view_source_mock, OnLoad(IN_IE, StrEq(url_in_new_window)))
.Times(testing::AtMost(1));
EXPECT_CALL(view_source_mock, OnLoad(in_cf, StrEq(view_source_url)))
.WillOnce(testing::DoAll(
VerifyAddressBarUrlWithGcf(&view_source_mock),
CloseBrowserMock(&view_source_mock)));
EXPECT_CALL(view_source_mock, OnQuit())
.Times(testing::AtMost(1))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(GetSimplePageUrl());
}
void NavigateToCurrentUrl(MockIEEventSink* mock) {
IWebBrowser2* browser = mock->event_sink()->web_browser2();
DCHECK(browser);
base::win::ScopedBstr bstr;
HRESULT hr = browser->get_LocationURL(bstr.Receive());
EXPECT_HRESULT_SUCCEEDED(hr);
if (SUCCEEDED(hr)) {
DCHECK(bstr.Length());
VARIANT empty = base::win::ScopedVariant::kEmptyVariant;
hr = browser->Navigate(bstr, &empty, &empty, &empty, &empty);
EXPECT_HRESULT_SUCCEEDED(hr);
}
}
TEST_P(FullTabUITest, TabCrashReload) {
using testing::DoAll;
if (!GetParam().invokes_cf()) {
LOG(ERROR) << "Test needs CF.";
return;
}
MockPropertyNotifySinkListener prop_listener;
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(ie_mock_, OnLoad(_, StrEq(GetSimplePageUrl())))
.WillOnce(DoAll(
ExpectRendererHasFocus(&ie_mock_),
ExpectDocumentReadystate(&ie_mock_, READYSTATE_COMPLETE),
ConnectDocPropNotifySink(&ie_mock_, &prop_listener),
KillChromeFrameProcesses()));
EXPECT_CALL(prop_listener, OnChanged(DISPID_READYSTATE))
.WillOnce(DoAll(
ExpectDocumentReadystate(&ie_mock_, READYSTATE_UNINITIALIZED),
DelayNavigateToCurrentUrl(
&ie_mock_, &loop_, base::TimeDelta::FromMilliseconds(10))));
EXPECT_CALL(ie_mock_, OnLoad(_, StrEq(GetSimplePageUrl())))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(GetSimplePageUrl());
}
TEST_P(FullTabUITest, DISABLED_TabCrashRefresh) {
using testing::DoAll;
if (!GetParam().invokes_cf()) {
LOG(ERROR) << "Test needs CF.";
return;
}
MockPropertyNotifySinkListener prop_listener;
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(ie_mock_, OnLoad(_, StrEq(GetSimplePageUrl())))
.WillOnce(DoAll(
ExpectRendererHasFocus(&ie_mock_),
ExpectDocumentReadystate(&ie_mock_, READYSTATE_COMPLETE),
ConnectDocPropNotifySink(&ie_mock_, &prop_listener),
KillChromeFrameProcesses()));
VARIANT empty = base::win::ScopedVariant::kEmptyVariant;
EXPECT_CALL(prop_listener, OnChanged(_))
.WillOnce(DoAll(
DisconnectDocPropNotifySink(&prop_listener),
ExpectDocumentReadystate(&ie_mock_, READYSTATE_UNINITIALIZED),
DelayExecCommand(
&ie_mock_, &loop_, base::TimeDelta::FromMilliseconds(10),
static_cast<GUID*>(NULL), OLECMDID_REFRESH, 0, &empty, &empty)));
EXPECT_CALL(ie_mock_, OnLoad(_, StrEq(GetSimplePageUrl())))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(GetSimplePageUrl());
}
TEST_P(FullTabUITest, WindowPrintOpensNativePrintDialog) {
std::wstring window_print_url(GetTestUrl(L"window_print.html"));
std::wstring window_print_title(L"window.print");
const bool is_cf = GetParam().invokes_cf();
MockWindowObserver win_observer_mock;
EXPECT_CALL(ie_mock_, OnLoad(is_cf, StrEq(window_print_url)))
.WillOnce(WatchWindow(&win_observer_mock, "Print", ""));
EXPECT_CALL(win_observer_mock, OnWindowOpen(_))
.WillOnce(DoCloseWindow());
EXPECT_CALL(win_observer_mock, OnWindowClose(_))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(window_print_url);
}
class ContextMenuTest : public MockIEEventSinkTest, public testing::Test {
public:
ContextMenuTest(): kTextFieldInitValue(L"SomeInitializedTextValue") {}
virtual void SetUp() {
context_menu_page_url = GetTestUrl(L"context_menu.html");
context_menu_page_title = L"context menu";
SetClipboardText(L"");
ie_mock_.ExpectAnyNavigations();
EXPECT_CALL(ie_mock_, OnLoad(_, _)).Times(testing::AnyNumber());
EXPECT_CALL(acc_observer_, OnAccDocLoad(_)).Times(testing::AnyNumber());
}
void DoSaveAsTest(const wchar_t* role, const wchar_t* menu_item_name,
const wchar_t* file_ext) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
MockWindowObserver win_observer_mock;
InSequence expect_in_sequence_for_scope;
const char* kSaveDlgCaption = "Save As";
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(L"Save As download test")))
.WillOnce(testing::DoAll(
WatchWindow(&win_observer_mock, kSaveDlgCaption, ""),
AccRightClick(AccObjectMatcher(L"", role))));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(menu_item_name)));
FilePath temp_file_path;
ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path));
ASSERT_TRUE(file_util::DieFileDie(temp_file_path, false));
temp_file_path = temp_file_path.ReplaceExtension(file_ext);
AccObjectMatcher file_name_box(L"File name:", L"editable text");
EXPECT_CALL(win_observer_mock, OnWindowOpen(_))
.WillOnce(testing::DoAll(
AccSendCharMessage(file_name_box, L'a'),
AccSetValue(file_name_box, temp_file_path.value()),
AccDoDefaultAction(AccObjectMatcher(L"Save", L"push button"))));
EXPECT_CALL(win_observer_mock, OnWindowClose(_))
.WillOnce(CloseWhenFileSaved(&ie_mock_, temp_file_path, 8000));
LaunchIENavigateAndLoop(GetTestUrl(L"save_as_context_menu.html"),
kChromeFrameVeryLongNavigationTimeout);
ASSERT_TRUE(file_util::DieFileDie(temp_file_path, false));
}
protected:
std::wstring context_menu_page_url;
std::wstring context_menu_page_title;
const std::wstring kTextFieldInitValue;
testing::NiceMock<MockAccEventObserver> acc_observer_;
};
TEST_F(ContextMenuTest, CFReload) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(GetSimplePageTitle())))
.WillOnce(OpenContextMenuAsync());
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Reload")));
EXPECT_CALL(ie_mock_, OnLoad(IN_CF, StrEq(GetSimplePageUrl())))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(GetSimplePageUrl());
}
TEST_F(ContextMenuTest, CFViewSource) {
if (base::win::GetVersion() == base::win::VERSION_VISTA &&
GetInstalledIEVersion() == IE_7) {
LOG(INFO) << "Not running test on Vista with IE7";
return;
}
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
MockIEEventSink view_source_mock;
view_source_mock.ExpectAnyNavigations();
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(GetSimplePageTitle())))
.WillOnce(OpenContextMenuAsync());
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"View page source")));
std::wstring view_source_url;
view_source_url += UTF8ToWide(chrome::kViewSourceScheme);
view_source_url += L":";
view_source_url += GetSimplePageUrl();
std::wstring url_in_new_window = kChromeProtocolPrefix;
url_in_new_window += view_source_url;
ie_mock_.ExpectNewWindow(&view_source_mock);
EXPECT_CALL(view_source_mock, OnLoad(IN_IE, StrEq(url_in_new_window)))
.Times(testing::AtMost(1));
EXPECT_CALL(view_source_mock, OnLoad(IN_CF, StrEq(view_source_url)))
.WillOnce(testing::DoAll(
VerifyAddressBarUrlWithGcf(&view_source_mock),
CloseBrowserMock(&view_source_mock)));
EXPECT_CALL(view_source_mock, OnQuit())
.Times(testing::AtMost(1))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(GetSimplePageUrl());
}
TEST_F(ContextMenuTest, DISABLED_CFPageInfo) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
MockWindowObserver win_observer_mock;
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(GetSimplePageTitle())))
.WillOnce(testing::DoAll(
WatchWindow(&win_observer_mock, "", "Chrome_WidgetWin_*"),
OpenContextMenuAsync()));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"View page info")));
EXPECT_CALL(win_observer_mock, OnWindowOpen(_)).Times(1);
EXPECT_CALL(win_observer_mock, OnWindowOpen(_))
.WillOnce(DoCloseWindow());
EXPECT_CALL(win_observer_mock, OnWindowClose(_)).Times(1);
EXPECT_CALL(win_observer_mock, OnWindowClose(_))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(GetSimplePageUrl());
}
TEST_F(ContextMenuTest, CFInspector) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
MockWindowObserver win_observer_mock;
InSequence expect_in_sequence_for_scope;
const char* kPageInfoCaptionPattern = "Untitled*";
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(GetSimplePageTitle())))
.WillOnce(testing::DoAll(
WatchWindow(&win_observer_mock, kPageInfoCaptionPattern, ""),
OpenContextMenuAsync()));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Inspect element")));
EXPECT_CALL(win_observer_mock, OnWindowOpen(_))
.WillOnce(DelayDoCloseWindow(5000));
EXPECT_CALL(win_observer_mock, OnWindowClose(_))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIENavigateAndLoop(GetSimplePageUrl(),
kChromeFrameVeryLongNavigationTimeout);
}
TEST_F(ContextMenuTest, DISABLED_CFSavePageAs) {
if (base::win::GetVersion() == base::win::VERSION_VISTA &&
GetInstalledIEVersion() == IE_7) {
LOG(INFO) << "Not running test on Vista with IE7";
return;
}
ASSERT_NO_FATAL_FAILURE(DoSaveAsTest(L"", L"Save as...", L".html"));
}
TEST_F(ContextMenuTest, DISABLED_CFSaveLinkAs) {
if (base::win::GetVersion() == base::win::VERSION_VISTA &&
GetInstalledIEVersion() == IE_7) {
LOG(INFO) << "Not running test on Vista with IE7";
return;
}
ASSERT_NO_FATAL_FAILURE(DoSaveAsTest(L"link", L"Save link as...", L".zip"));
}
TEST_F(ContextMenuTest, CFAboutVersionLoads) {
if (base::win::GetVersion() == base::win::VERSION_VISTA &&
GetInstalledIEVersion() == IE_7) {
LOG(INFO) << "Not running test on Vista with IE7";
return;
}
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
const wchar_t* kAboutVersionUrl = L"gcf:about:version";
const wchar_t* kAboutVersionWithoutProtoUrl = L"about:version";
MockIEEventSink new_window_mock;
new_window_mock.ExpectAnyNavigations();
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(GetSimplePageTitle())))
.WillOnce(OpenContextMenuAsync());
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"About*")));
ie_mock_.ExpectNewWindow(&new_window_mock);
EXPECT_CALL(new_window_mock, OnLoad(IN_IE, StrEq(kAboutVersionUrl)))
.Times(testing::AtMost(1));
EXPECT_CALL(new_window_mock,
OnLoad(IN_CF, StrEq(kAboutVersionWithoutProtoUrl)))
.WillOnce(testing::DoAll(
VerifyAddressBarUrlWithGcf(&new_window_mock),
CloseBrowserMock(&new_window_mock)));
EXPECT_CALL(new_window_mock, OnQuit())
.Times(testing::AtMost(1))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(GetSimplePageUrl());
}
TEST_F(ContextMenuTest, IEOpen) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::None());
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(GetLinkPageTitle())))
.WillOnce(AccRightClick(AccObjectMatcher(L"", L"link")));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Open")));
EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(GetSimplePageUrl())))
.WillOnce(testing::DoAll(
VerifyAddressBarUrl(&ie_mock_),
CloseBrowserMock(&ie_mock_)));
LaunchIEAndNavigate(GetLinkPageUrl());
}
TEST_F(ContextMenuTest, IEOpenInNewWindow) {
if (GetInstalledIEVersion() == IE_7) {
LOG(INFO) << "Not running test with IE7";
return;
}
server_mock_.ExpectAndServeAnyRequests(CFInvocation::None());
MockIEEventSink new_window_mock;
new_window_mock.ExpectAnyNavigations();
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(GetLinkPageTitle())))
.WillOnce(AccRightClick(AccObjectMatcher(L"", L"link")));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Open in New Window")));
ie_mock_.ExpectNewWindow(&new_window_mock);
EXPECT_CALL(new_window_mock, OnLoad(IN_IE, StrEq(GetSimplePageUrl())))
.WillOnce(CloseBrowserMock(&new_window_mock));
EXPECT_CALL(new_window_mock, OnQuit())
.Times(testing::AtMost(1))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(GetLinkPageUrl());
}
TEST_F(ContextMenuTest, IEBackForward) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::None());
std::wstring page1 = GetLinkPageUrl();
std::wstring title1 = GetLinkPageTitle();
std::wstring page2 = GetSimplePageUrl();
std::wstring title2 = GetSimplePageTitle();
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(title1)))
.WillOnce(Navigate(&ie_mock_, page2));
EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(title2)))
.WillOnce(testing::DoAll(
VerifyPageLoad(&ie_mock_, IN_IE, page2),
OpenContextMenuAsync()));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Back")));
EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(title1)))
.WillOnce(testing::DoAll(
VerifyPageLoad(&ie_mock_, IN_IE, page1),
OpenContextMenuAsync()));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Forward")));
EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(page2)))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(page1);
}
TEST_F(ContextMenuTest, DISABLED_CFOpenLinkInNewWindow) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
MockIEEventSink new_window_mock;
new_window_mock.ExpectAnyNavigations();
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(GetLinkPageTitle())))
.Times(testing::AtMost(2))
.WillOnce(AccRightClick(AccObjectMatcher(L"", L"link")))
.WillOnce(testing::Return());
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Open link in new window*")));
ie_mock_.ExpectNewWindow(&new_window_mock);
EXPECT_CALL(new_window_mock, OnLoad(IN_CF, StrEq(GetSimplePageUrl())))
.WillOnce(CloseBrowserMock(&new_window_mock));
EXPECT_CALL(new_window_mock, OnQuit())
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(GetLinkPageUrl());
}
TEST_F(ContextMenuTest, CFCopyLinkAddress) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(GetLinkPageTitle())))
.WillOnce(AccRightClick(AccObjectMatcher(L"", L"link")));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(testing::DoAll(
AccLeftClick(AccObjectMatcher(L"Copy link address*")),
CloseBrowserMock(&ie_mock_)));
LaunchIEAndNavigate(GetLinkPageUrl());
EXPECT_STREQ(GetSimplePageUrl().c_str(), GetClipboardText().c_str());
}
TEST_F(ContextMenuTest, FLAKY_CFTxtFieldCut) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
AccObjectMatcher txtfield_matcher(L"", L"editable text");
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(context_menu_page_title)))
.WillOnce(testing::DoAll(
AccRightClick(txtfield_matcher),
AccWatchForOneValueChange(&acc_observer_, txtfield_matcher)));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Cut*")));
EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L"")))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(context_menu_page_url);
EXPECT_STREQ(kTextFieldInitValue.c_str(), GetClipboardText().c_str());
}
TEST_F(ContextMenuTest, FLAKY_CFTxtFieldCopy) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
AccObjectMatcher txtfield_matcher(L"", L"editable text");
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(context_menu_page_title)))
.WillOnce(testing::DoAll(
AccRightClick(txtfield_matcher),
AccWatchForOneValueChange(&acc_observer_, txtfield_matcher)));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(testing::DoAll(
AccLeftClick(AccObjectMatcher(L"Copy*")),
CloseBrowserMock(&ie_mock_)));
EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, _))
.Times(testing::AtMost(0));
LaunchIEAndNavigate(context_menu_page_url);
EXPECT_STREQ(kTextFieldInitValue.c_str(), GetClipboardText().c_str());
}
TEST_F(ContextMenuTest, FLAKY_CFTxtFieldPaste) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
AccObjectMatcher txtfield_matcher(L"", L"editable text");
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(context_menu_page_title)))
.WillOnce(testing::DoAll(
AccRightClick(txtfield_matcher),
AccWatchForOneValueChange(&acc_observer_, txtfield_matcher)));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Paste*")));
EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(kTextFieldInitValue)))
.WillOnce(CloseBrowserMock(&ie_mock_));
SetClipboardText(kTextFieldInitValue);
LaunchIEAndNavigate(context_menu_page_url);
}
TEST_F(ContextMenuTest, FLAKY_CFTxtFieldDelete) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
AccObjectMatcher txtfield_matcher(L"", L"editable text");
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(context_menu_page_title)))
.WillOnce(testing::DoAll(
AccRightClick(txtfield_matcher),
AccWatchForOneValueChange(&acc_observer_, txtfield_matcher)));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Delete*")));
EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L"")))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(context_menu_page_url);
}
TEST_F(ContextMenuTest, CFTxtFieldSelectAll) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(context_menu_page_title)))
.WillOnce(AccRightClick(AccObjectMatcher(L"", L"editable text")));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(testing::DoAll(
AccLeftClick(AccObjectMatcher(L"Select all*")),
PostMessageToCF(&ie_mock_, L"selectall")));
EXPECT_CALL(ie_mock_, OnMessage(testing::StrCaseEq(L"OK"), _, _))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(context_menu_page_url + L"?action=selectall");
}
TEST_F(ContextMenuTest, FLAKY_CFTxtFieldUndo) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
AccObjectMatcher txtfield_matcher(L"", L"editable text");
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(context_menu_page_title)))
.WillOnce(testing::DoAll(
AccWatchForOneValueChange(&acc_observer_, txtfield_matcher),
AccSendCharMessage(txtfield_matcher, L'A')));
EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L"A")))
.WillOnce(AccRightClick(txtfield_matcher));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(testing::DoAll(
AccWatchForOneValueChange(&acc_observer_, txtfield_matcher),
AccLeftClick(AccObjectMatcher(L"Undo*"))));
EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(kTextFieldInitValue)))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(context_menu_page_url);
}
TEST_F(ContextMenuTest, FLAKY_CFTxtFieldRedo) {
server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag());
AccObjectMatcher txtfield_matcher(L"", L"editable text");
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(acc_observer_,
OnAccDocLoad(TabContentsTitleEq(context_menu_page_title)))
.WillOnce(testing::DoAll(
AccWatchForOneValueChange(&acc_observer_, txtfield_matcher),
AccSendCharMessage(txtfield_matcher, L'A')));
EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L"A")))
.WillOnce(AccRightClick(txtfield_matcher));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(testing::DoAll(
AccWatchForOneValueChange(&acc_observer_, txtfield_matcher),
AccLeftClick(AccObjectMatcher(L"Undo*"))));
EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(kTextFieldInitValue)))
.WillOnce(AccRightClick(txtfield_matcher));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(testing::DoAll(
AccWatchForOneValueChange(&acc_observer_, txtfield_matcher),
AccLeftClick(AccObjectMatcher(L"Redo*"))));
EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L"A")))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIEAndNavigate(context_menu_page_url);
}
TEST_F(ContextMenuTest, DISABLED_CFBackForward) {
std::wstring page1 = GetLinkPageUrl();
std::wstring title1 = GetLinkPageTitle();
std::wstring page2 = GetSimplePageUrl();
std::wstring title2 = GetSimplePageTitle();
std::wstring page3 = GetTestUrl(L"anchor.html");
std::wstring title3 = GetAnchorPageTitle();
server_mock_.ExpectAndServeRequestWithCardinality(
CFInvocation::MetaTag(), page1, testing::Exactly(2));
server_mock_.ExpectAndServeRequestWithCardinality(
CFInvocation::None(), page2, testing::Exactly(3));
server_mock_.ExpectAndServeRequestWithCardinality(
CFInvocation::MetaTag(), page3, testing::Exactly(2));
InSequence expect_in_sequence_for_scope;
EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(title1)))
.WillOnce(testing::DoAll(
VerifyPageLoad(&ie_mock_, IN_CF, page1),
Navigate(&ie_mock_, page2)));
EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(title2)))
.WillOnce(testing::DoAll(
VerifyPageLoad(&ie_mock_, IN_IE, page2),
Navigate(&ie_mock_, page3)));
EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(title3)))
.WillOnce(testing::DoAll(
VerifyPageLoad(&ie_mock_, IN_CF, page3),
OpenContextMenuAsync()));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Back")));
EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(title2)))
.WillOnce(testing::DoAll(
VerifyPageLoad(&ie_mock_, IN_IE, page2),
OpenContextMenuAsync()));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Back")));
EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(title1)))
.WillOnce(testing::DoAll(
VerifyPageLoad(&ie_mock_, IN_CF, page1),
OpenContextMenuAsync()));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Forward")));
EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(title2)))
.WillOnce(testing::DoAll(
VerifyPageLoad(&ie_mock_, IN_IE, page2),
OpenContextMenuAsync()));
EXPECT_CALL(acc_observer_, OnMenuPopup(_))
.WillOnce(AccLeftClick(AccObjectMatcher(L"Forward")));
EXPECT_CALL(ie_mock_, OnLoad(IN_CF, StrEq(page3)))
.WillOnce(CloseBrowserMock(&ie_mock_));
LaunchIENavigateAndLoop(page1, kChromeFrameVeryLongNavigationTimeout);
}
}