1// Copyright (c) 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "config.h" 6#include "web/ExternalPopupMenu.h" 7 8#include "platform/PopupMenu.h" 9#include "platform/PopupMenuClient.h" 10#include "public/web/WebPopupMenuInfo.h" 11#include <gtest/gtest.h> 12 13using namespace blink; 14 15namespace { 16 17const size_t kListSize = 7; 18 19class TestPopupMenuClient : public PopupMenuClient { 20public: 21 TestPopupMenuClient() : m_listSize(0) { } 22 virtual ~TestPopupMenuClient() { } 23 24 virtual void valueChanged(unsigned listIndex, bool fireEvents = true) OVERRIDE { } 25 virtual void selectionChanged(unsigned listIndex, bool fireEvents = true) OVERRIDE { } 26 virtual void selectionCleared() OVERRIDE { } 27 28 virtual String itemText(unsigned listIndex) const OVERRIDE { return emptyString(); } 29 virtual String itemToolTip(unsigned listIndex) const OVERRIDE { return emptyString(); } 30 virtual String itemAccessibilityText(unsigned listIndex) const OVERRIDE { return emptyString(); } 31 virtual bool itemIsEnabled(unsigned listIndex) const OVERRIDE { return true; } 32 virtual PopupMenuStyle itemStyle(unsigned listIndex) const OVERRIDE 33 { 34 FontDescription fontDescription; 35 fontDescription.setComputedSize(12.0); 36 Font font(fontDescription); 37 font.update(nullptr); 38 bool displayNone = m_displayNoneIndexSet.find(listIndex) != m_displayNoneIndexSet.end(); 39 return PopupMenuStyle(Color::black, Color::white, font, true, displayNone, Length(), TextDirection(), false); 40 } 41 virtual PopupMenuStyle menuStyle() const OVERRIDE { return itemStyle(0); } 42 virtual LayoutUnit clientPaddingLeft() const OVERRIDE { return 0; } 43 virtual LayoutUnit clientPaddingRight() const OVERRIDE { return 0; } 44 virtual int listSize() const OVERRIDE { return m_listSize; } 45 virtual int selectedIndex() const OVERRIDE { return 0; } 46 virtual void popupDidHide() OVERRIDE { } 47 virtual bool itemIsSeparator(unsigned listIndex) const OVERRIDE { return false;} 48 virtual bool itemIsLabel(unsigned listIndex) const OVERRIDE { return false; } 49 virtual bool itemIsSelected(unsigned listIndex) const OVERRIDE { return listIndex == 0;} 50 virtual void setTextFromItem(unsigned listIndex) OVERRIDE { } 51 virtual bool multiple() const OVERRIDE { return false; } 52 53 void setListSize(size_t size) { m_listSize = size; } 54 void setDisplayNoneIndex(unsigned index) { m_displayNoneIndexSet.insert(index); } 55private: 56 size_t m_listSize; 57 std::set<unsigned> m_displayNoneIndexSet; 58}; 59 60class ExternalPopupMenuDisplayNoneItemsTest : public testing::Test { 61public: 62 ExternalPopupMenuDisplayNoneItemsTest() { } 63 64protected: 65 virtual void SetUp() OVERRIDE 66 { 67 m_popupMenuClient.setListSize(kListSize); 68 69 // Set the 4th an 5th items to have "display: none" property 70 m_popupMenuClient.setDisplayNoneIndex(3); 71 m_popupMenuClient.setDisplayNoneIndex(4); 72 } 73 74 TestPopupMenuClient m_popupMenuClient; 75}; 76 77TEST_F(ExternalPopupMenuDisplayNoneItemsTest, PopupMenuInfoSizeTest) 78{ 79 WebPopupMenuInfo info; 80 ExternalPopupMenu::getPopupMenuInfo(info, m_popupMenuClient); 81 EXPECT_EQ(5U, info.items.size()); 82} 83 84TEST_F(ExternalPopupMenuDisplayNoneItemsTest, IndexMappingTest) 85{ 86 // 6th indexed item in popupmenu would be the 4th item in ExternalPopupMenu, 87 // and vice-versa. 88 EXPECT_EQ(4, ExternalPopupMenu::toExternalPopupMenuItemIndex(6, m_popupMenuClient)); 89 EXPECT_EQ(6, ExternalPopupMenu::toPopupMenuItemIndex(4, m_popupMenuClient)); 90 91 // Invalid index, methods should return -1. 92 EXPECT_EQ(-1, ExternalPopupMenu::toExternalPopupMenuItemIndex(8, m_popupMenuClient)); 93 EXPECT_EQ(-1, ExternalPopupMenu::toPopupMenuItemIndex(8, m_popupMenuClient)); 94} 95 96} // namespace 97