17242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 27242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Use of this source code is governed by a BSD-style license that can be 37242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// found in the LICENSE file. 47242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 57242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "config.h" 67242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/HTMLSelectElement.h" 77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/frame/FrameView.h" 97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/HTMLDocument.h" 107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/forms/FormController.h" 117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/loader/EmptyClients.h" 127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/testing/DummyPageHolder.h" 137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include <gtest/gtest.h> 147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccinamespace blink { 167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass HTMLSelectElementTest : public::testing::Test { 187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciprotected: 197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci virtual void SetUp() OVERRIDE; 207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HTMLDocument& document() const { return *m_document; } 217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciprivate: 237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci OwnPtr<DummyPageHolder> m_dummyPageHolder; 247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBePersistent<HTMLDocument> m_document; 257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}; 267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid HTMLSelectElementTest::SetUp() 287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Page::PageClients pageClients; 307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci fillWithEmptyClients(pageClients); 317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600), &pageClients); 327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_document = toHTMLDocument(&m_dummyPageHolder->document()); 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_document->setMimeType("text/html"); 357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_document->setCharset("utf-8"); 367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciTEST_F(HTMLSelectElementTest, SaveRestoreSelectSingleFormControlState) 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci document().documentElement()->setInnerHTML(String("<!DOCTYPE HTML><select id='sel'>" 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "<option value='111' id='0'>111</option>" 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "<option value='222'>222</option>" 437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "<option value='111' selected id='2'>!666</option>" 447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "<option value='999'>999</option></select>"), ASSERT_NO_EXCEPTION); 457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci document().view()->updateLayoutAndStyleIfNeededRecursive(); 467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Element* element = document().getElementById("sel"); 477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HTMLFormControlElementWithState* select = toHTMLSelectElement(element); 487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HTMLOptionElement* opt0 = toHTMLOptionElement(document().getElementById("0")); 497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HTMLOptionElement* opt2 = toHTMLOptionElement(document().getElementById("2")); 507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Save the select element state, and then restore again. 527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Test passes if the restored state is not changed. 537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_EQ(2, toHTMLSelectElement(element)->selectedIndex()); 547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_FALSE(opt0->selected()); 557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_TRUE(opt2->selected()); 567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FormControlState selectState = select->saveFormControlState(); 577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_EQ(2U, selectState.valueSize()); 587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Clear the selected state, to be restored by restoreFormControlState. 607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci toHTMLSelectElement(select)->setSelectedIndex(-1); 617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT_FALSE(opt2->selected()); 627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Restore 647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci select->restoreFormControlState(selectState); 657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_EQ(2, toHTMLSelectElement(element)->selectedIndex()); 667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_FALSE(opt0->selected()); 677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_TRUE(opt2->selected()); 687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciTEST_F(HTMLSelectElementTest, SaveRestoreSelectMultipleFormControlState) 717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci document().documentElement()->setInnerHTML(String("<!DOCTYPE HTML><select id='sel' multiple>" 737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "<option value='111' id='0'>111</option>" 747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "<option value='222'>222</option>" 757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "<option value='111' selected id='2'>!666</option>" 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "<option value='999' selected id='3'>999</option></select>"), ASSERT_NO_EXCEPTION); 777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci document().view()->updateLayoutAndStyleIfNeededRecursive(); 787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HTMLFormControlElementWithState* select = toHTMLSelectElement(document().getElementById("sel")); 797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HTMLOptionElement* opt0 = toHTMLOptionElement(document().getElementById("0")); 817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HTMLOptionElement* opt2 = toHTMLOptionElement(document().getElementById("2")); 827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HTMLOptionElement* opt3 = toHTMLOptionElement(document().getElementById("3")); 837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Save the select element state, and then restore again. 857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Test passes if the selected options are not changed. 867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_FALSE(opt0->selected()); 877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_TRUE(opt2->selected()); 887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_TRUE(opt3->selected()); 897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FormControlState selectState = select->saveFormControlState(); 907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_EQ(4U, selectState.valueSize()); 917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Clear the selected state, to be restored by restoreFormControlState. 937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci opt2->setSelected(false); 947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci opt3->setSelected(false); 957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT_FALSE(opt2->selected()); 967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT_FALSE(opt3->selected()); 977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Restore 997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci select->restoreFormControlState(selectState); 1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_FALSE(opt0->selected()); 1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_TRUE(opt2->selected()); 1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci EXPECT_TRUE(opt3->selected()); 1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink 106