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