summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/external_popup_menu_unittest.cc
blob: 9ab6067b0fb42b1e29c5bc71b3e843e7b9c51ec6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// 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("<select id='mySelect'>"
             "  <option>zero</option>"
             "  <option selected='1'>one</option>"
             "  <option>two</option>"
             "</select>");

    // 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<ViewHostMsg_ShowPopup_Params> param;
  ViewHostMsg_ShowPopup::Read(message, &param);
  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, &param);
  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("<blink>Awesome page!</blink>");

  // Now the user selects something, we should not crash.
  view_->OnSelectPopupMenuItem(-1);
}