Index: chrome_frame/test/ui_test.cc |
=================================================================== |
--- chrome_frame/test/ui_test.cc (revision 65066) |
+++ chrome_frame/test/ui_test.cc (working copy) |
@@ -5,6 +5,7 @@ |
#include <mshtmcid.h> |
#include <string> |
+#include "base/scoped_variant_win.h" |
#include "base/test/test_file_util.h" |
#include "base/utf_string_conversions.h" |
#include "base/win/scoped_bstr.h" |
@@ -351,9 +352,12 @@ |
// menus for CF and IE are different, these tests are not parameterized. |
class ContextMenuTest : public MockIEEventSinkTest, public testing::Test { |
public: |
- ContextMenuTest() {} |
+ ContextMenuTest(): kTextFieldInitValue(L"SomeInitializedTextValue") {} |
virtual void SetUp() { |
+ context_menu_page_url = GetTestUrl(L"context_menu.html"); |
+ // Clear clipboard to make sure there is no effect from previous tests. |
+ SetClipboardText(L""); |
// These are UI-related tests, so we do not care about the exact |
// navigations that occur. |
ie_mock_.ExpectAnyNavigations(); |
@@ -398,6 +402,11 @@ |
} |
protected: |
+ // Html page that holds a text field for context menu testing. |
+ std::wstring context_menu_page_url; |
+ // This is the text value used to test cut/copy/paste etc. |
+ const std::wstring kTextFieldInitValue; |
+ |
testing::NiceMock<MockAccEventObserver> acc_observer_; |
}; |
@@ -647,4 +656,204 @@ |
LaunchIEAndNavigate(page1); |
} |
+// Test CF link context menu - Open link in new window. |
+TEST_F(ContextMenuTest, CFOpenLinkInNewWindow) { |
+ server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); |
+ MockIEEventSink new_window_mock; |
+ new_window_mock.ExpectAnyNavigations(); |
+ |
+ // Invoke 'Open link in new window' context menu item. |
+ EXPECT_CALL(acc_observer_, OnAccDocLoad(_)) |
+ .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 CF link context menu - Copy link address. |
+TEST_F(ContextMenuTest, CFCopyLinkAddress) { |
+ server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); |
+ |
+ // Invoke 'Copy link address' context menu item. |
+ EXPECT_CALL(acc_observer_, OnAccDocLoad(_)) |
+ .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 CF text field context menu - cut. |
+TEST_F(ContextMenuTest, CFTxtFieldCut) { |
+ server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); |
amit
2010/11/09 23:45:27
There's a lot of common code between the following
mdu
2010/11/10 01:21:16
To do this we have to split ContextMenuTest into t
|
+ AccObjectMatcher txtfield_matcher(L"", L"editable text"); |
+ |
+ // Invoke "Cut" context menu item of text field. |
+ EXPECT_CALL(acc_observer_, OnAccDocLoad(_)) |
+ .WillOnce(testing::DoAll( |
+ AccRightClick(txtfield_matcher), |
+ AccWatchForOneValueChange(&acc_observer_, txtfield_matcher))); |
+ EXPECT_CALL(acc_observer_, OnMenuPopup(_)) |
+ .WillOnce(AccLeftClick(AccObjectMatcher(L"Cut*"))); |
+ |
+ // Verify that text field is empty after cut operation. |
+ EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L""))) |
+ .WillOnce(CloseBrowserMock(&ie_mock_)); |
+ |
+ LaunchIEAndNavigate(context_menu_page_url); |
+ // Verify that the text value has been cut to clipboard. |
+ EXPECT_STREQ(kTextFieldInitValue.c_str(), GetClipboardText().c_str()); |
+} |
+ |
+// Test CF text field context menu - copy. |
+TEST_F(ContextMenuTest, CFTxtFieldCopy) { |
+ server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); |
+ AccObjectMatcher txtfield_matcher(L"", L"editable text"); |
+ |
+ // Invoke "Copy" context menu item of text field. |
+ EXPECT_CALL(acc_observer_, OnAccDocLoad(_)) |
+ .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_))); |
+ |
+ // Verify that there is no change on text field value after copy operation. |
+ EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, _)) |
+ .Times(testing::AtMost(0)); |
+ |
+ LaunchIEAndNavigate(context_menu_page_url); |
+ // Verify that the text value has been copied to clipboard. |
+ EXPECT_STREQ(kTextFieldInitValue.c_str(), GetClipboardText().c_str()); |
+} |
+ |
+// Test CF text field context menu - paste. |
+TEST_F(ContextMenuTest, CFTxtFieldPaste) { |
+ server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); |
+ AccObjectMatcher txtfield_matcher(L"", L"editable text"); |
+ |
+ // Invoke "Paste" context menu item of text field. |
+ EXPECT_CALL(acc_observer_, OnAccDocLoad(_)) |
+ .WillOnce(testing::DoAll( |
+ AccRightClick(txtfield_matcher), |
+ AccWatchForOneValueChange(&acc_observer_, txtfield_matcher))); |
+ EXPECT_CALL(acc_observer_, OnMenuPopup(_)) |
+ .WillOnce(AccLeftClick(AccObjectMatcher(L"Paste*"))); |
+ // Verify that value has been pasted to text field. |
+ EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(kTextFieldInitValue))) |
+ .WillOnce(CloseBrowserMock(&ie_mock_)); |
+ |
+ // Set some text value to clipboard, this is to emulate the 'copy' action. |
+ SetClipboardText(kTextFieldInitValue); |
+ |
+ LaunchIEAndNavigate(context_menu_page_url); |
+} |
+ |
+// Test CF text field context menu - delete. |
+TEST_F(ContextMenuTest, CFTxtFieldDelete) { |
+ server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); |
+ AccObjectMatcher txtfield_matcher(L"", L"editable text"); |
+ |
+ // Invoke 'Delete' context menu item of text field. |
+ EXPECT_CALL(acc_observer_, OnAccDocLoad(_)) |
+ .WillOnce(testing::DoAll( |
+ AccRightClick(txtfield_matcher), |
+ AccWatchForOneValueChange(&acc_observer_, txtfield_matcher))); |
+ EXPECT_CALL(acc_observer_, OnMenuPopup(_)) |
+ .WillOnce(AccLeftClick(AccObjectMatcher(L"Delete*"))); |
+ // Verify that value has been deleted from text field. |
+ EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L""))) |
+ .WillOnce(CloseBrowserMock(&ie_mock_)); |
+ |
+ LaunchIEAndNavigate(context_menu_page_url); |
+} |
+ |
+// Test CF text field context menu - select all. |
+TEST_F(ContextMenuTest, CFTxtFieldSelectAll) { |
+ server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); |
+ |
+ // Invoke 'Select all' context menu item of text field. |
+ EXPECT_CALL(acc_observer_, OnAccDocLoad(_)) |
+ .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"))); |
+ // Client side script verifies that the text field value has been selected, |
+ // then send 'OK' message. |
+ EXPECT_CALL(ie_mock_, OnMessage(testing::StrCaseEq(L"OK"), _, _)) |
+ .WillOnce(CloseBrowserMock(&ie_mock_)); |
+ |
+ LaunchIEAndNavigate(context_menu_page_url + L"?action=selectall"); |
+} |
+ |
+// Test CF text field context menu - undo. |
+TEST_F(ContextMenuTest, CFTxtFieldUndo) { |
+ server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); |
+ AccObjectMatcher txtfield_matcher(L"", L"editable text"); |
+ |
+ // Change the value of text field to 'A', then invoke 'Undo' context menu item |
+ // of text field. |
+ EXPECT_CALL(acc_observer_, OnAccDocLoad(_)) |
+ .WillOnce(testing::DoAll( |
+ AccSendCharMessage(txtfield_matcher, L'A'), |
+ AccRightClick(txtfield_matcher))); |
+ EXPECT_CALL(acc_observer_, OnMenuPopup(_)) |
+ .WillOnce(testing::DoAll( |
+ AccWatchForOneValueChange(&acc_observer_, txtfield_matcher), |
+ AccLeftClick(AccObjectMatcher(L"Undo*")))); |
+ |
+ // Verify that value has been reset to initial value after undo operation. |
+ EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(kTextFieldInitValue))) |
+ .WillOnce(CloseBrowserMock(&ie_mock_)); |
+ |
+ LaunchIEAndNavigate(context_menu_page_url); |
+} |
+ |
+// Test CF text field context menu - redo. |
+TEST_F(ContextMenuTest, CFTxtFieldRedo) { |
+ server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); |
+ AccObjectMatcher txtfield_matcher(L"", L"editable text"); |
+ InSequence expect_in_sequence_for_scope; |
+ |
+ // Change text field value to 'A', then undo it. |
+ EXPECT_CALL(acc_observer_, OnAccDocLoad(_)) |
+ .WillOnce(testing::DoAll( |
+ AccSendCharMessage(txtfield_matcher, L'A'), |
+ AccRightClick(txtfield_matcher))); |
+ EXPECT_CALL(acc_observer_, OnMenuPopup(_)) |
+ .WillOnce(testing::DoAll( |
+ AccWatchForOneValueChange(&acc_observer_, txtfield_matcher), |
+ AccLeftClick(AccObjectMatcher(L"Undo*")))); |
+ |
+ // After undo operation is done, invoke 'Redo' context menu item. |
+ EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(kTextFieldInitValue))) |
+ .WillOnce(testing::DoAll( |
+ AccRightClick(txtfield_matcher), |
+ AccWatchForOneValueChange(&acc_observer_, txtfield_matcher))); |
+ EXPECT_CALL(acc_observer_, OnMenuPopup(_)) |
+ .WillOnce(AccLeftClick(AccObjectMatcher(L"Redo*"))); |
+ |
+ // After redo operation is done, verify that text field value is reset to its |
+ // changed value 'A'. |
+ EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L"A"))) |
+ .WillOnce(CloseBrowserMock(&ie_mock_)); |
+ |
+ LaunchIEAndNavigate(context_menu_page_url); |
+} |
+ |
} // namespace chrome_frame_test |