Changeset 97123 in webkit
- Timestamp:
- Oct 10, 2011 9:57:27 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r97121 r97123 1 2011-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 1 53 2011-10-10 Kent Tamura <tkent@chromium.org> 2 54 -
trunk/Source/WebCore/dom/SelectElement.cpp
r97121 r97123 64 64 , m_multiple(false) 65 65 , m_activeSelectionState(false) 66 , m_recalcListItems(false) 66 67 { 67 68 } … … 71 72 } 72 73 74 void 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 73 83 } 84 85 Vector<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 95 const 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 74 74 Vector<bool>& cachedStateForActiveSelection() { return m_cachedStateForActiveSelection; } 75 75 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 76 83 UChar repeatingChar() const { return m_repeatingChar; } 77 84 void setRepeatingChar(const UChar& value) { m_repeatingChar = value; } … … 86 93 void checkListItems(const Element*) const; 87 94 95 Vector<Element*> m_listItems; 88 96 Vector<bool> m_lastOnChangeSelection; 89 97 Vector<bool> m_cachedStateForActiveSelection; … … 102 110 bool m_multiple; 103 111 bool m_activeSelectionState; 112 bool m_recalcListItems; 104 113 }; 105 114 -
trunk/Source/WebCore/html/HTMLSelectElement.cpp
r97121 r97123 77 77 HTMLSelectElement::HTMLSelectElement(const QualifiedName& tagName, Document* document, HTMLFormElement* form) 78 78 : HTMLFormControlElementWithState(tagName, document, form) 79 , m_recalcListItems(false)80 79 { 81 80 ASSERT(hasTagName(selectTag)); … … 316 315 void HTMLSelectElement::recalcListItems(bool updateSelectedStates) const 317 316 { 318 const_cast<HTMLSelectElement*>(this)->recalcListItemsInternal(updateSelectedStates);317 recalcListItems(const_cast<SelectElementData&>(m_data), this, updateSelectedStates); 319 318 } 320 319 321 320 void HTMLSelectElement::recalcListItemsIfNeeded() 322 321 { 323 if (m_ recalcListItems)322 if (m_data.shouldRecalcListItems()) 324 323 recalcListItems(); 325 324 } … … 458 457 int HTMLSelectElement::nextSelectableListIndex(int startIndex) const 459 458 { 460 return nextValidIndex( listItems(), startIndex, SkipForwards, 1);459 return nextValidIndex(m_data.listItems(this), startIndex, SkipForwards, 1); 461 460 } 462 461 … … 464 463 { 465 464 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); 468 467 } 469 468 470 469 int HTMLSelectElement::firstSelectableListIndex() const 471 470 { 472 const Vector<Element*>& items = listItems();471 const Vector<Element*>& items = m_data.listItems(this); 473 472 int index = nextValidIndex(items, items.size(), SkipBackwards, INT_MAX); 474 473 if (static_cast<unsigned>(index) == items.size()) … … 479 478 int HTMLSelectElement::lastSelectableListIndex() const 480 479 { 481 return nextValidIndex( listItems(), -1, SkipForwards, INT_MAX);480 return nextValidIndex(m_data.listItems(this), -1, SkipForwards, INT_MAX); 482 481 } 483 482 … … 485 484 int HTMLSelectElement::nextSelectableListIndexPageAway(int startIndex, SkipDirection direction) const 486 485 { 487 const Vector<Element*>& items = listItems();486 const Vector<Element*>& items = m_data.listItems(this); 488 487 // Can't use data->size() because renderer forces a minimum size. 489 488 int pageSize = 0; … … 528 527 lastOnChangeSelection.clear(); 529 528 530 const Vector<Element*>& items = listItems();529 const Vector<Element*>& items = m_data.listItems(this); 531 530 for (unsigned i = 0; i < items.size(); ++i) { 532 531 OptionElement* optionElement = toOptionElement(items[i]); … … 544 543 cachedStateForActiveSelection.clear(); 545 544 546 const Vector<Element*>& items = listItems();545 const Vector<Element*>& items = m_data.listItems(this); 547 546 for (unsigned i = 0; i < items.size(); ++i) { 548 547 OptionElement* optionElement = toOptionElement(items[i]); … … 559 558 { 560 559 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); 562 561 563 562 unsigned start = min(m_data.activeSelectionAnchorIndex(), m_data.activeSelectionEndIndex()); … … 565 564 Vector<bool>& cachedStateForActiveSelection = m_data.cachedStateForActiveSelection(); 566 565 567 const Vector<Element*>& items = listItems();566 const Vector<Element*>& items = m_data.listItems(this); 568 567 for (unsigned i = 0; i < items.size(); ++i) { 569 568 OptionElement* optionElement = toOptionElement(items[i]); … … 588 587 589 588 Vector<bool>& lastOnChangeSelection = m_data.lastOnChangeSelection(); 590 const Vector<Element*>& items = listItems();589 const Vector<Element*>& items = m_data.listItems(this); 591 590 592 591 // If the cached selection list is empty, or the size has changed, then fire … … 642 641 } 643 642 644 void HTMLSelectElement::checkListItems() const645 {646 #if !ASSERT_DISABLED647 Vector<Element*> items = m_listItems;648 const_cast<HTMLSelectElement*>(this)->recalcListItemsInternal(false);649 ASSERT(items == m_listItems);650 #endif651 }652 653 const Vector<Element*>& HTMLSelectElement::listItems() const654 {655 if (m_recalcListItems)656 const_cast<HTMLSelectElement*>(this)->recalcListItemsInternal(false);657 else658 checkListItems();659 660 return m_listItems;661 }662 663 643 void HTMLSelectElement::setRecalcListItems() 664 644 { 665 m_ recalcListItems = true;645 m_data.setShouldRecalcListItems(true); 666 646 // Manual selection anchor is reset when manipulating the select programmatically. 667 647 m_data.setActiveSelectionAnchorIndex(-1); … … 672 652 } 673 653 674 void HTMLSelectElement::recalcListItemsInternal(bool updateSelectedStates) 675 { 676 m_listItems.clear(); 677 678 m_recalcListItems = false; 654 void HTMLSelectElement::recalcListItems(SelectElementData& data, const Element* element, bool updateSelectedStates) 655 { 656 Vector<Element*>& listItems = data.rawListItems(); 657 listItems.clear(); 658 659 data.setShouldRecalcListItems(false); 679 660 680 661 OptionElement* foundSelected = 0; 681 for (Node* currentNode = this->firstChild(); currentNode;) {662 for (Node* currentNode = element->firstChild(); currentNode;) { 682 663 if (!currentNode->isElementNode()) { 683 currentNode = currentNode->traverseNextSibling( this);664 currentNode = currentNode->traverseNextSibling(element); 684 665 continue; 685 666 } … … 691 672 // (http://www.w3.org/TR/html401/interact/forms.html#h-17.6) 692 673 if (isOptionGroupElement(current)) { 693 m_listItems.append(current);674 listItems.append(current); 694 675 if (current->firstChild()) { 695 676 currentNode = current->firstChild(); … … 699 680 700 681 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())) { 705 686 foundSelected = optionElement; 706 687 foundSelected->setSelectedState(true); … … 713 694 714 695 if (current->hasTagName(HTMLNames::hrTag)) 715 m_listItems.append(current);696 listItems.append(current); 716 697 717 698 // In conforming HTML code, only <optgroup> and <option> will be found … … 721 702 // handle this because such tags have already been removed from the 722 703 // <select>'s subtree at this point. 723 currentNode = currentNode->traverseNextSibling( this);704 currentNode = currentNode->traverseNextSibling(element); 724 705 } 725 706 } … … 730 711 731 712 // return the number of the first option selected 732 const Vector<Element*>& items = listItems();713 const Vector<Element*>& items = m_data.listItems(this); 733 714 for (size_t i = 0; i < items.size(); ++i) { 734 715 if (OptionElement* optionElement = toOptionElement(items[i])) { … … 749 730 deselect = true; 750 731 751 const Vector<Element*>& items = listItems();732 const Vector<Element*>& items = m_data.listItems(this); 752 733 int listIndex = optionToListIndex(optionIndex); 753 734 … … 792 773 int HTMLSelectElement::optionToListIndex(int optionIndex) const 793 774 { 794 const Vector<Element*>& items = listItems();775 const Vector<Element*>& items = m_data.listItems(this); 795 776 int listSize = static_cast<int>(items.size()); 796 777 if (optionIndex < 0 || optionIndex >= listSize) … … 811 792 int HTMLSelectElement::listToOptionIndex(int listIndex) const 812 793 { 813 const Vector<Element*>& items = listItems();794 const Vector<Element*>& items = m_data.listItems(this); 814 795 if (listIndex < 0 || listIndex >= static_cast<int>(items.size()) || !isOptionElement(items[listIndex])) 815 796 return -1; … … 846 827 void HTMLSelectElement::deselectItemsWithoutValidation(Element* excludeElement) 847 828 { 848 const Vector<Element*>& items = listItems();829 const Vector<Element*>& items = m_data.listItems(this); 849 830 for (unsigned i = 0; i < items.size(); ++i) { 850 831 if (items[i] == excludeElement) … … 858 839 bool HTMLSelectElement::saveFormControlState(String& value) const 859 840 { 860 const Vector<Element*>& items = listItems();841 const Vector<Element*>& items = m_data.listItems(this); 861 842 int length = items.size(); 862 843 … … 875 856 void HTMLSelectElement::restoreFormControlState(const String& state) 876 857 { 877 recalcListItems( );878 879 const Vector<Element*>& items = listItems();858 recalcListItems(m_data, this); 859 860 const Vector<Element*>& items = m_data.listItems(this); 880 861 int length = items.size(); 881 862 … … 905 886 906 887 bool successful = false; 907 const Vector<Element*>& items = listItems();888 const Vector<Element*>& items = m_data.listItems(this); 908 889 909 890 for (unsigned i = 0; i < items.size(); ++i) { … … 926 907 OptionElement* selectedOption = 0; 927 908 928 const Vector<Element*>& items = listItems();909 const Vector<Element*>& items = m_data.listItems(this); 929 910 for (unsigned i = 0; i < items.size(); ++i) { 930 911 OptionElement* optionElement = toOptionElement(items[i]); … … 1000 981 const String& keyIdentifier = static_cast<KeyboardEvent*>(event)->keyIdentifier(); 1001 982 bool handled = true; 1002 const Vector<Element*>& listItems = this->listItems();983 const Vector<Element*>& listItems = m_data.listItems(this); 1003 984 int listIndex = optionToListIndex(selectedIndex()); 1004 985 … … 1128 1109 bool multiSelect = m_data.multiple() && multi && !shift; 1129 1110 1130 Element* clickedElement = listItems()[listIndex];1111 Element* clickedElement = m_data.listItems(this)[listIndex]; 1131 1112 OptionElement* option = toOptionElement(clickedElement); 1132 1113 if (option) { … … 1168 1149 void HTMLSelectElement::listBoxDefaultEventHandler(Event* event) 1169 1150 { 1170 const Vector<Element*>& listItems = this->listItems();1151 const Vector<Element*>& listItems = m_data.listItems(this); 1171 1152 1172 1153 if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) { … … 1326 1307 unsigned index = 0; 1327 1308 bool found = false; 1328 const Vector<Element*>& items = listItems();1309 const Vector<Element*>& items = m_data.listItems(this); 1329 1310 for (size_t i = 0; i < items.size(); ++i) { 1330 1311 if (OptionElement* optionElement = toOptionElement(items[i])) { … … 1382 1363 } 1383 1364 1384 const Vector<Element*>& items = listItems();1365 const Vector<Element*>& items = m_data.listItems(this); 1385 1366 int itemCount = items.size(); 1386 1367 if (itemCount < 1) … … 1420 1401 // items yet - but for innerHTML and related methods, this method is called 1421 1402 // after the whole subtree is constructed. 1422 recalcListItems( true);1403 recalcListItems(m_data, this, true); 1423 1404 HTMLFormControlElementWithState::insertedIntoTree(deep); 1424 1405 } … … 1431 1412 1432 1413 // 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); 1434 1415 int listIndex = optionToListIndex(index); 1435 1416 if (OptionElement* optionElement = (listIndex >= 0 ? toOptionElement(items[listIndex]) : 0)) { … … 1452 1433 unsigned options = 0; 1453 1434 1454 const Vector<Element*>& items = listItems();1435 const Vector<Element*>& items = m_data.listItems(this); 1455 1436 for (unsigned i = 0; i < items.size(); ++i) { 1456 1437 if (isOptionElement(items[i])) -
trunk/Source/WebCore/html/HTMLSelectElement.h
r97121 r97123 31 31 #include "HTMLFormControlElement.h" 32 32 #include "SelectElement.h" 33 #include <wtf/Vector.h>34 33 35 34 namespace WebCore { … … 68 67 void recalcListItemsIfNeeded(); 69 68 70 const Vector<Element*>& listItems() const ;69 const Vector<Element*>& listItems() const { return m_data.listItems(this); } 71 70 72 71 virtual void accessKeyAction(bool sendToAnyElement); … … 145 144 bool hasPlaceholderLabelOption() const; 146 145 147 void checkListItems() const; 148 void recalcListItemsInternal(bool updateSelectedStates = true); 146 static void recalcListItems(SelectElementData&, const Element*, bool updateSelectedStates = true); 149 147 void setSelectedIndexInternal(int optionIndex, bool deselect = true, bool fireOnChangeNow = false, bool userDrivenChange = true); 150 148 void deselectItemsWithoutValidation(Element* excludeElement = 0); … … 156 154 void listBoxDefaultEventHandler(Event*); 157 155 void setOptionsChangedOnRenderer(); 156 friend class SelectElementData; 158 157 159 158 enum SkipDirection { … … 170 169 SelectElementData m_data; 171 170 CollectionCache m_collectionInfo; 172 Vector<Element*> m_listItems;173 bool m_recalcListItems;174 171 }; 175 172 -
trunk/Source/WebCore/html/HTMLSelectElementWin.cpp
r97121 r97123 49 49 int index = selectedIndex(); 50 50 ASSERT(index >= 0); 51 ASSERT(index < listItems().size());51 ASSERT(index < m_data.listItems(this).size()); 52 52 setSelectedIndexInternal(index); 53 53 event->setDefaultHandled();
Note: See TracChangeset
for help on using the changeset viewer.