Changeset 97123 in webkit


Ignore:
Timestamp:
Oct 10, 2011 9:57:27 PM (13 years ago)
Author:
tkent@chromium.org
Message:

Unreviewed, rolling out r97121.
http://trac.webkit.org/changeset/97121
https://bugs.webkit.org/show_bug.cgi?id=69815

Many layout tests failed (Requested by tkent on #webkit).

Patch by Sheriff Bot <webkit.review.bot@gmail.com> on 2011-10-10

  • dom/SelectElement.cpp:

(WebCore::SelectElementData::SelectElementData):
(WebCore::SelectElementData::checkListItems):
(WebCore::SelectElementData::listItems):

  • dom/SelectElement.h:

(WebCore::SelectElementData::shouldRecalcListItems):
(WebCore::SelectElementData::setShouldRecalcListItems):
(WebCore::SelectElementData::rawListItems):

  • html/HTMLSelectElement.cpp:

(WebCore::HTMLSelectElement::HTMLSelectElement):
(WebCore::HTMLSelectElement::recalcListItems):
(WebCore::HTMLSelectElement::recalcListItemsIfNeeded):
(WebCore::HTMLSelectElement::nextSelectableListIndex):
(WebCore::HTMLSelectElement::previousSelectableListIndex):
(WebCore::HTMLSelectElement::firstSelectableListIndex):
(WebCore::HTMLSelectElement::lastSelectableListIndex):
(WebCore::HTMLSelectElement::nextSelectableListIndexPageAway):
(WebCore::HTMLSelectElement::saveLastSelection):
(WebCore::HTMLSelectElement::setActiveSelectionAnchorIndex):
(WebCore::HTMLSelectElement::updateListBoxSelection):
(WebCore::HTMLSelectElement::listBoxOnChange):
(WebCore::HTMLSelectElement::setRecalcListItems):
(WebCore::HTMLSelectElement::selectedIndex):
(WebCore::HTMLSelectElement::setSelectedIndexInternal):
(WebCore::HTMLSelectElement::optionToListIndex):
(WebCore::HTMLSelectElement::listToOptionIndex):
(WebCore::HTMLSelectElement::deselectItemsWithoutValidation):
(WebCore::HTMLSelectElement::saveFormControlState):
(WebCore::HTMLSelectElement::restoreFormControlState):
(WebCore::HTMLSelectElement::appendFormData):
(WebCore::HTMLSelectElement::reset):
(WebCore::HTMLSelectElement::menuListDefaultEventHandler):
(WebCore::HTMLSelectElement::updateSelectedState):
(WebCore::HTMLSelectElement::listBoxDefaultEventHandler):
(WebCore::HTMLSelectElement::lastSelectedListIndex):
(WebCore::HTMLSelectElement::typeAheadFind):
(WebCore::HTMLSelectElement::insertedIntoTree):
(WebCore::HTMLSelectElement::accessKeySetSelectedIndex):
(WebCore::HTMLSelectElement::length):

  • html/HTMLSelectElement.h:

(WebCore::HTMLSelectElement::listItems):

  • html/HTMLSelectElementWin.cpp:

(WebCore::HTMLSelectElement::platformHandleKeydownEvent):

Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r97121 r97123  
     12011-10-10  Sheriff Bot  <webkit.review.bot@gmail.com>
     2
     3        Unreviewed, rolling out r97121.
     4        http://trac.webkit.org/changeset/97121
     5        https://bugs.webkit.org/show_bug.cgi?id=69815
     6
     7        Many layout tests failed (Requested by tkent on #webkit).
     8
     9        * dom/SelectElement.cpp:
     10        (WebCore::SelectElementData::SelectElementData):
     11        (WebCore::SelectElementData::checkListItems):
     12        (WebCore::SelectElementData::listItems):
     13        * dom/SelectElement.h:
     14        (WebCore::SelectElementData::shouldRecalcListItems):
     15        (WebCore::SelectElementData::setShouldRecalcListItems):
     16        (WebCore::SelectElementData::rawListItems):
     17        * html/HTMLSelectElement.cpp:
     18        (WebCore::HTMLSelectElement::HTMLSelectElement):
     19        (WebCore::HTMLSelectElement::recalcListItems):
     20        (WebCore::HTMLSelectElement::recalcListItemsIfNeeded):
     21        (WebCore::HTMLSelectElement::nextSelectableListIndex):
     22        (WebCore::HTMLSelectElement::previousSelectableListIndex):
     23        (WebCore::HTMLSelectElement::firstSelectableListIndex):
     24        (WebCore::HTMLSelectElement::lastSelectableListIndex):
     25        (WebCore::HTMLSelectElement::nextSelectableListIndexPageAway):
     26        (WebCore::HTMLSelectElement::saveLastSelection):
     27        (WebCore::HTMLSelectElement::setActiveSelectionAnchorIndex):
     28        (WebCore::HTMLSelectElement::updateListBoxSelection):
     29        (WebCore::HTMLSelectElement::listBoxOnChange):
     30        (WebCore::HTMLSelectElement::setRecalcListItems):
     31        (WebCore::HTMLSelectElement::selectedIndex):
     32        (WebCore::HTMLSelectElement::setSelectedIndexInternal):
     33        (WebCore::HTMLSelectElement::optionToListIndex):
     34        (WebCore::HTMLSelectElement::listToOptionIndex):
     35        (WebCore::HTMLSelectElement::deselectItemsWithoutValidation):
     36        (WebCore::HTMLSelectElement::saveFormControlState):
     37        (WebCore::HTMLSelectElement::restoreFormControlState):
     38        (WebCore::HTMLSelectElement::appendFormData):
     39        (WebCore::HTMLSelectElement::reset):
     40        (WebCore::HTMLSelectElement::menuListDefaultEventHandler):
     41        (WebCore::HTMLSelectElement::updateSelectedState):
     42        (WebCore::HTMLSelectElement::listBoxDefaultEventHandler):
     43        (WebCore::HTMLSelectElement::lastSelectedListIndex):
     44        (WebCore::HTMLSelectElement::typeAheadFind):
     45        (WebCore::HTMLSelectElement::insertedIntoTree):
     46        (WebCore::HTMLSelectElement::accessKeySetSelectedIndex):
     47        (WebCore::HTMLSelectElement::length):
     48        * html/HTMLSelectElement.h:
     49        (WebCore::HTMLSelectElement::listItems):
     50        * html/HTMLSelectElementWin.cpp:
     51        (WebCore::HTMLSelectElement::platformHandleKeydownEvent):
     52
    1532011-10-10  Kent Tamura  <tkent@chromium.org>
    254
  • trunk/Source/WebCore/dom/SelectElement.cpp

    r97121 r97123  
    6464    , m_multiple(false)
    6565    , m_activeSelectionState(false)
     66    , m_recalcListItems(false)
    6667{
    6768}
     
    7172}
    7273
     74void SelectElementData::checkListItems(const Element* element) const
     75{
     76#if !ASSERT_DISABLED
     77    Vector<Element*> items = m_listItems;
     78    HTMLSelectElement::recalcListItems(*const_cast<SelectElementData*>(this), element, false);
     79    ASSERT(items == m_listItems);
     80#else
     81    UNUSED_PARAM(element);
     82#endif
    7383}
     84
     85Vector<Element*>& SelectElementData::listItems(const Element* element)
     86{
     87    if (m_recalcListItems)
     88        HTMLSelectElement::recalcListItems(*this, element);
     89    else
     90        checkListItems(element);
     91
     92    return m_listItems;
     93}
     94
     95const Vector<Element*>& SelectElementData::listItems(const Element* element) const
     96{
     97    if (m_recalcListItems)
     98        HTMLSelectElement::recalcListItems(*const_cast<SelectElementData*>(this), element);
     99    else
     100        checkListItems(element);
     101
     102    return m_listItems;
     103}
     104
     105}
  • trunk/Source/WebCore/dom/SelectElement.h

    r97121 r97123  
    7474    Vector<bool>& cachedStateForActiveSelection() { return m_cachedStateForActiveSelection; }
    7575
     76    bool shouldRecalcListItems() const { return m_recalcListItems; }
     77    void setShouldRecalcListItems(bool value) { m_recalcListItems = value; }
     78
     79    Vector<Element*>& rawListItems() { return m_listItems; }
     80    Vector<Element*>& listItems(const Element*);
     81    const Vector<Element*>& listItems(const Element*) const;
     82
    7683    UChar repeatingChar() const { return m_repeatingChar; }
    7784    void setRepeatingChar(const UChar& value) { m_repeatingChar = value; }
     
    8693    void checkListItems(const Element*) const;
    8794
     95    Vector<Element*> m_listItems;
    8896    Vector<bool> m_lastOnChangeSelection;
    8997    Vector<bool> m_cachedStateForActiveSelection;
     
    102110    bool m_multiple;
    103111    bool m_activeSelectionState;
     112    bool m_recalcListItems;
    104113};
    105114
  • trunk/Source/WebCore/html/HTMLSelectElement.cpp

    r97121 r97123  
    7777HTMLSelectElement::HTMLSelectElement(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
    7878    : HTMLFormControlElementWithState(tagName, document, form)
    79     , m_recalcListItems(false)
    8079{
    8180    ASSERT(hasTagName(selectTag));
     
    316315void HTMLSelectElement::recalcListItems(bool updateSelectedStates) const
    317316{
    318     const_cast<HTMLSelectElement*>(this)->recalcListItemsInternal(updateSelectedStates);
     317    recalcListItems(const_cast<SelectElementData&>(m_data), this, updateSelectedStates);
    319318}
    320319
    321320void HTMLSelectElement::recalcListItemsIfNeeded()
    322321{
    323     if (m_recalcListItems)
     322    if (m_data.shouldRecalcListItems())
    324323        recalcListItems();
    325324}
     
    458457int HTMLSelectElement::nextSelectableListIndex(int startIndex) const
    459458{
    460     return nextValidIndex(listItems(), startIndex, SkipForwards, 1);
     459    return nextValidIndex(m_data.listItems(this), startIndex, SkipForwards, 1);
    461460}
    462461
     
    464463{
    465464    if (startIndex == -1)
    466         startIndex = listItems().size();
    467     return nextValidIndex(listItems(), startIndex, SkipBackwards, 1);
     465        startIndex = m_data.listItems(this).size();
     466    return nextValidIndex(m_data.listItems(this), startIndex, SkipBackwards, 1);
    468467}
    469468
    470469int HTMLSelectElement::firstSelectableListIndex() const
    471470{
    472     const Vector<Element*>& items = listItems();
     471    const Vector<Element*>& items = m_data.listItems(this);
    473472    int index = nextValidIndex(items, items.size(), SkipBackwards, INT_MAX);
    474473    if (static_cast<unsigned>(index) == items.size())
     
    479478int HTMLSelectElement::lastSelectableListIndex() const
    480479{
    481     return nextValidIndex(listItems(), -1, SkipForwards, INT_MAX);
     480    return nextValidIndex(m_data.listItems(this), -1, SkipForwards, INT_MAX);
    482481}
    483482
     
    485484int HTMLSelectElement::nextSelectableListIndexPageAway(int startIndex, SkipDirection direction) const
    486485{
    487     const Vector<Element*>& items = listItems();
     486    const Vector<Element*>& items = m_data.listItems(this);
    488487    // Can't use data->size() because renderer forces a minimum size.
    489488    int pageSize = 0;
     
    528527    lastOnChangeSelection.clear();
    529528
    530     const Vector<Element*>& items = listItems();
     529    const Vector<Element*>& items = m_data.listItems(this);
    531530    for (unsigned i = 0; i < items.size(); ++i) {
    532531        OptionElement* optionElement = toOptionElement(items[i]);
     
    544543    cachedStateForActiveSelection.clear();
    545544
    546     const Vector<Element*>& items = listItems();
     545    const Vector<Element*>& items = m_data.listItems(this);
    547546    for (unsigned i = 0; i < items.size(); ++i) {
    548547        OptionElement* optionElement = toOptionElement(items[i]);
     
    559558{
    560559    ASSERT(renderer() && (renderer()->isListBox() || m_data.multiple()));
    561     ASSERT(!listItems().size() || m_data.activeSelectionAnchorIndex() >= 0);
     560    ASSERT(!m_data.listItems(this).size() || m_data.activeSelectionAnchorIndex() >= 0);
    562561
    563562    unsigned start = min(m_data.activeSelectionAnchorIndex(), m_data.activeSelectionEndIndex());
     
    565564    Vector<bool>& cachedStateForActiveSelection = m_data.cachedStateForActiveSelection();
    566565
    567     const Vector<Element*>& items = listItems();
     566    const Vector<Element*>& items = m_data.listItems(this);
    568567    for (unsigned i = 0; i < items.size(); ++i) {
    569568        OptionElement* optionElement = toOptionElement(items[i]);
     
    588587
    589588    Vector<bool>& lastOnChangeSelection = m_data.lastOnChangeSelection();
    590     const Vector<Element*>& items = listItems();
     589    const Vector<Element*>& items = m_data.listItems(this);
    591590
    592591    // If the cached selection list is empty, or the size has changed, then fire
     
    642641}
    643642
    644 void HTMLSelectElement::checkListItems() const
    645 {
    646 #if !ASSERT_DISABLED
    647     Vector<Element*> items = m_listItems;
    648     const_cast<HTMLSelectElement*>(this)->recalcListItemsInternal(false);
    649     ASSERT(items == m_listItems);
    650 #endif
    651 }
    652 
    653 const Vector<Element*>& HTMLSelectElement::listItems() const
    654 {
    655     if (m_recalcListItems)
    656         const_cast<HTMLSelectElement*>(this)->recalcListItemsInternal(false);
    657     else
    658         checkListItems();
    659 
    660     return m_listItems;
    661 }
    662 
    663643void HTMLSelectElement::setRecalcListItems()
    664644{
    665     m_recalcListItems = true;
     645    m_data.setShouldRecalcListItems(true);
    666646    // Manual selection anchor is reset when manipulating the select programmatically.
    667647    m_data.setActiveSelectionAnchorIndex(-1);
     
    672652}
    673653
    674 void HTMLSelectElement::recalcListItemsInternal(bool updateSelectedStates)
    675 {
    676     m_listItems.clear();
    677 
    678     m_recalcListItems = false;
     654void HTMLSelectElement::recalcListItems(SelectElementData& data, const Element* element, bool updateSelectedStates)
     655{
     656    Vector<Element*>& listItems = data.rawListItems();
     657    listItems.clear();
     658
     659    data.setShouldRecalcListItems(false);
    679660
    680661    OptionElement* foundSelected = 0;
    681     for (Node* currentNode = this->firstChild(); currentNode;) {
     662    for (Node* currentNode = element->firstChild(); currentNode;) {
    682663        if (!currentNode->isElementNode()) {
    683             currentNode = currentNode->traverseNextSibling(this);
     664            currentNode = currentNode->traverseNextSibling(element);
    684665            continue;
    685666        }
     
    691672        // (http://www.w3.org/TR/html401/interact/forms.html#h-17.6)
    692673        if (isOptionGroupElement(current)) {
    693             m_listItems.append(current);
     674            listItems.append(current);
    694675            if (current->firstChild()) {
    695676                currentNode = current->firstChild();
     
    699680
    700681        if (OptionElement* optionElement = toOptionElement(current)) {
    701             m_listItems.append(current);
    702 
    703             if (updateSelectedStates && !m_data.multiple()) {
    704                 if (!foundSelected && (m_data.size() <= 1 || optionElement->selected())) {
     682            listItems.append(current);
     683
     684            if (updateSelectedStates && !data.multiple()) {
     685                if (!foundSelected && (data.size() <= 1 || optionElement->selected())) {
    705686                    foundSelected = optionElement;
    706687                    foundSelected->setSelectedState(true);
     
    713694
    714695        if (current->hasTagName(HTMLNames::hrTag))
    715             m_listItems.append(current);
     696            listItems.append(current);
    716697
    717698        // In conforming HTML code, only <optgroup> and <option> will be found
     
    721702        // handle this because such tags have already been removed from the
    722703        // <select>'s subtree at this point.
    723         currentNode = currentNode->traverseNextSibling(this);
     704        currentNode = currentNode->traverseNextSibling(element);
    724705    }
    725706}
     
    730711
    731712    // return the number of the first option selected
    732     const Vector<Element*>& items = listItems();
     713    const Vector<Element*>& items = m_data.listItems(this);
    733714    for (size_t i = 0; i < items.size(); ++i) {
    734715        if (OptionElement* optionElement = toOptionElement(items[i])) {
     
    749730        deselect = true;
    750731
    751     const Vector<Element*>& items = listItems();
     732    const Vector<Element*>& items = m_data.listItems(this);
    752733    int listIndex = optionToListIndex(optionIndex);
    753734
     
    792773int HTMLSelectElement::optionToListIndex(int optionIndex) const
    793774{
    794     const Vector<Element*>& items = listItems();
     775    const Vector<Element*>& items = m_data.listItems(this);
    795776    int listSize = static_cast<int>(items.size());
    796777    if (optionIndex < 0 || optionIndex >= listSize)
     
    811792int HTMLSelectElement::listToOptionIndex(int listIndex) const
    812793{
    813     const Vector<Element*>& items = listItems();
     794    const Vector<Element*>& items = m_data.listItems(this);
    814795    if (listIndex < 0 || listIndex >= static_cast<int>(items.size()) || !isOptionElement(items[listIndex]))
    815796        return -1;
     
    846827void HTMLSelectElement::deselectItemsWithoutValidation(Element* excludeElement)
    847828{
    848     const Vector<Element*>& items = listItems();
     829    const Vector<Element*>& items = m_data.listItems(this);
    849830    for (unsigned i = 0; i < items.size(); ++i) {
    850831        if (items[i] == excludeElement)
     
    858839bool HTMLSelectElement::saveFormControlState(String& value) const
    859840{
    860     const Vector<Element*>& items = listItems();
     841    const Vector<Element*>& items = m_data.listItems(this);
    861842    int length = items.size();
    862843
     
    875856void HTMLSelectElement::restoreFormControlState(const String& state)
    876857{
    877     recalcListItems();
    878 
    879     const Vector<Element*>& items = listItems();
     858    recalcListItems(m_data, this);
     859
     860    const Vector<Element*>& items = m_data.listItems(this);
    880861    int length = items.size();
    881862
     
    905886
    906887    bool successful = false;
    907     const Vector<Element*>& items = listItems();
     888    const Vector<Element*>& items = m_data.listItems(this);
    908889
    909890    for (unsigned i = 0; i < items.size(); ++i) {
     
    926907    OptionElement* selectedOption = 0;
    927908
    928     const Vector<Element*>& items = listItems();
     909    const Vector<Element*>& items = m_data.listItems(this);
    929910    for (unsigned i = 0; i < items.size(); ++i) {
    930911        OptionElement* optionElement = toOptionElement(items[i]);
     
    1000981        const String& keyIdentifier = static_cast<KeyboardEvent*>(event)->keyIdentifier();
    1001982        bool handled = true;
    1002         const Vector<Element*>& listItems = this->listItems();
     983        const Vector<Element*>& listItems = m_data.listItems(this);
    1003984        int listIndex = optionToListIndex(selectedIndex());
    1004985
     
    11281109    bool multiSelect = m_data.multiple() && multi && !shift;
    11291110
    1130     Element* clickedElement = listItems()[listIndex];
     1111    Element* clickedElement = m_data.listItems(this)[listIndex];
    11311112    OptionElement* option = toOptionElement(clickedElement);
    11321113    if (option) {
     
    11681149void HTMLSelectElement::listBoxDefaultEventHandler(Event* event)
    11691150{
    1170     const Vector<Element*>& listItems = this->listItems();
     1151    const Vector<Element*>& listItems = m_data.listItems(this);
    11711152
    11721153    if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) {
     
    13261307    unsigned index = 0;
    13271308    bool found = false;
    1328     const Vector<Element*>& items = listItems();
     1309    const Vector<Element*>& items = m_data.listItems(this);
    13291310    for (size_t i = 0; i < items.size(); ++i) {
    13301311        if (OptionElement* optionElement = toOptionElement(items[i])) {
     
    13821363    }
    13831364
    1384     const Vector<Element*>& items = listItems();
     1365    const Vector<Element*>& items = m_data.listItems(this);
    13851366    int itemCount = items.size();
    13861367    if (itemCount < 1)
     
    14201401    // items yet - but for innerHTML and related methods, this method is called
    14211402    // after the whole subtree is constructed.
    1422     recalcListItems(true);
     1403    recalcListItems(m_data, this, true);
    14231404    HTMLFormControlElementWithState::insertedIntoTree(deep);
    14241405}
     
    14311412   
    14321413    // if this index is already selected, unselect. otherwise update the selected index
    1433     const Vector<Element*>& items = listItems();
     1414    const Vector<Element*>& items = m_data.listItems(this);
    14341415    int listIndex = optionToListIndex(index);
    14351416    if (OptionElement* optionElement = (listIndex >= 0 ? toOptionElement(items[listIndex]) : 0)) {
     
    14521433    unsigned options = 0;
    14531434
    1454     const Vector<Element*>& items = listItems();
     1435    const Vector<Element*>& items = m_data.listItems(this);
    14551436    for (unsigned i = 0; i < items.size(); ++i) {
    14561437        if (isOptionElement(items[i]))
  • trunk/Source/WebCore/html/HTMLSelectElement.h

    r97121 r97123  
    3131#include "HTMLFormControlElement.h"
    3232#include "SelectElement.h"
    33 #include <wtf/Vector.h>
    3433
    3534namespace WebCore {
     
    6867    void recalcListItemsIfNeeded();
    6968
    70     const Vector<Element*>& listItems() const;
     69    const Vector<Element*>& listItems() const { return m_data.listItems(this); }
    7170
    7271    virtual void accessKeyAction(bool sendToAnyElement);
     
    145144    bool hasPlaceholderLabelOption() const;
    146145
    147     void checkListItems() const;
    148     void recalcListItemsInternal(bool updateSelectedStates = true);
     146    static void recalcListItems(SelectElementData&, const Element*, bool updateSelectedStates = true);
    149147    void setSelectedIndexInternal(int optionIndex, bool deselect = true, bool fireOnChangeNow = false, bool userDrivenChange = true);
    150148    void deselectItemsWithoutValidation(Element* excludeElement = 0);
     
    156154    void listBoxDefaultEventHandler(Event*);
    157155    void setOptionsChangedOnRenderer();
     156    friend class SelectElementData;
    158157
    159158    enum SkipDirection {
     
    170169    SelectElementData m_data;
    171170    CollectionCache m_collectionInfo;
    172     Vector<Element*> m_listItems;
    173     bool m_recalcListItems;
    174171};
    175172
  • trunk/Source/WebCore/html/HTMLSelectElementWin.cpp

    r97121 r97123  
    4949    int index = selectedIndex();
    5050    ASSERT(index >= 0);
    51     ASSERT(index < listItems().size());
     51    ASSERT(index < m_data.listItems(this).size());
    5252    setSelectedIndexInternal(index);
    5353    event->setDefaultHandled();
Note: See TracChangeset for help on using the changeset viewer.