// Copyright (c) 2010 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. #include "base/utf_string_conversions.h" #include "chrome/common/render_messages.h" #include "chrome/common/render_messages_params.h" #include "chrome/test/render_view_test.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/WebKit/chromium/public/WebSize.h" #include "third_party/WebKit/WebKit/chromium/public/WebView.h" // Tests for the external select popup menu (Mac specific). namespace { const char* const kSelectID = "mySelect"; } // namespace class ExternalPopupMenuTest : public RenderViewTest { public: ExternalPopupMenuTest() {} virtual void SetUp() { RenderViewTest::SetUp(); // We need to set this explictly as RenderMain is not run. WebKit::WebView::setUseExternalPopupMenus(true); // Load the test page. LoadHTML(""); // Set a minimum size and give focus so simulated events work. view_->webwidget()->resize(WebKit::WebSize(500, 500)); view_->webwidget()->setFocus(true); } int GetSelectedIndex() { string16 script(ASCIIToUTF16(kSelectID)); script.append(ASCIIToUTF16(".selectedIndex")); int selected_index = -1; ExecuteJavaScriptAndReturnIntValue(script, &selected_index); return selected_index; } DISALLOW_COPY_AND_ASSIGN(ExternalPopupMenuTest); }; // Normal case: test showing a select popup, canceling/selecting an item. TEST_F(ExternalPopupMenuTest, NormalCase) { IPC::TestSink& sink = render_thread_.sink(); // Click the text field once. EXPECT_TRUE(SimulateElementClick(kSelectID)); // We should have sent a message to the browser to show the popup menu. const IPC::Message* message = sink.GetUniqueMessageMatching(ViewHostMsg_ShowPopup::ID); ASSERT_TRUE(message != NULL); Tuple1 param; ViewHostMsg_ShowPopup::Read(message, ¶m); ASSERT_EQ(3U, param.a.popup_items.size()); EXPECT_EQ(1, param.a.selected_item); // Simulate the user canceling the popup, the index should not have changed. view_->OnSelectPopupMenuItem(-1); EXPECT_EQ(1, GetSelectedIndex()); // Show the pop-up again and this time make a selection. EXPECT_TRUE(SimulateElementClick(kSelectID)); view_->OnSelectPopupMenuItem(0); EXPECT_EQ(0, GetSelectedIndex()); // Show the pop-up again and make another selection. sink.ClearMessages(); EXPECT_TRUE(SimulateElementClick(kSelectID)); message = sink.GetUniqueMessageMatching(ViewHostMsg_ShowPopup::ID); ASSERT_TRUE(message != NULL); ViewHostMsg_ShowPopup::Read(message, ¶m); ASSERT_EQ(3U, param.a.popup_items.size()); EXPECT_EQ(0, param.a.selected_item); } // Page shows popup, then navigates away while popup showing, then select. TEST_F(ExternalPopupMenuTest, ShowPopupThenNavigate) { // Click the text field once. EXPECT_TRUE(SimulateElementClick(kSelectID)); // Now we navigate to another pager. LoadHTML("Awesome page!"); // Now the user selects something, we should not crash. view_->OnSelectPopupMenuItem(-1); }