OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). | 2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
3 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 3 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
4 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 4 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
5 * (C) 2001 Dirk Mueller (mueller@kde.org) | 5 * (C) 2001 Dirk Mueller (mueller@kde.org) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights reserved. |
7 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 7 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
8 * Copyright (C) 2010 Google Inc. All rights reserved. | 8 * Copyright (C) 2010 Google Inc. All rights reserved. |
9 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) | 9 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) |
10 * | 10 * |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
69 , m_lastOnChangeIndex(-1) | 69 , m_lastOnChangeIndex(-1) |
70 , m_activeSelectionAnchorIndex(-1) | 70 , m_activeSelectionAnchorIndex(-1) |
71 , m_activeSelectionEndIndex(-1) | 71 , m_activeSelectionEndIndex(-1) |
72 , m_isProcessingUserDrivenChange(false) | 72 , m_isProcessingUserDrivenChange(false) |
73 , m_multiple(false) | 73 , m_multiple(false) |
74 , m_activeSelectionState(false) | 74 , m_activeSelectionState(false) |
75 , m_shouldRecalcListItems(false) | 75 , m_shouldRecalcListItems(false) |
76 , m_suggestedIndex(-1) | 76 , m_suggestedIndex(-1) |
77 { | 77 { |
78 ScriptWrappable::init(this); | 78 ScriptWrappable::init(this); |
79 setHasCustomStyleCallbacks(); | |
79 } | 80 } |
80 | 81 |
81 PassRefPtr<HTMLSelectElement> HTMLSelectElement::create(Document& document) | 82 PassRefPtr<HTMLSelectElement> HTMLSelectElement::create(Document& document) |
82 { | 83 { |
83 return adoptRef(new HTMLSelectElement(document, 0)); | 84 return adoptRef(new HTMLSelectElement(document, 0)); |
84 } | 85 } |
85 | 86 |
86 PassRefPtr<HTMLSelectElement> HTMLSelectElement::create(Document& document, HTML FormElement* form) | 87 PassRefPtr<HTMLSelectElement> HTMLSelectElement::create(Document& document, HTML FormElement* form) |
87 { | 88 { |
88 return adoptRef(new HTMLSelectElement(document, form)); | 89 return adoptRef(new HTMLSelectElement(document, form)); |
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
501 // Otherwise, it returns |listIndex|. | 502 // Otherwise, it returns |listIndex|. |
502 // Valid means that it is enabled and an option element. | 503 // Valid means that it is enabled and an option element. |
503 int HTMLSelectElement::nextValidIndex(int listIndex, SkipDirection direction, in t skip) const | 504 int HTMLSelectElement::nextValidIndex(int listIndex, SkipDirection direction, in t skip) const |
504 { | 505 { |
505 ASSERT(direction == -1 || direction == 1); | 506 ASSERT(direction == -1 || direction == 1); |
506 const Vector<HTMLElement*>& listItems = this->listItems(); | 507 const Vector<HTMLElement*>& listItems = this->listItems(); |
507 int lastGoodIndex = listIndex; | 508 int lastGoodIndex = listIndex; |
508 int size = listItems.size(); | 509 int size = listItems.size(); |
509 for (listIndex += direction; listIndex >= 0 && listIndex < size; listIndex + = direction) { | 510 for (listIndex += direction; listIndex >= 0 && listIndex < size; listIndex + = direction) { |
510 --skip; | 511 --skip; |
511 if (!listItems[listIndex]->isDisabledFormControl() && isHTMLOptionElemen t(*listItems[listIndex])) { | 512 HTMLElement* element = listItems[listIndex]; |
512 lastGoodIndex = listIndex; | 513 if (!isHTMLOptionElement(*element) || toHTMLOptionElement(element)->isDi sabledFormControl() || toHTMLOptionElement(element)->isDisplayNone()) |
513 if (skip <= 0) | 514 continue; |
514 break; | 515 lastGoodIndex = listIndex; |
515 } | 516 if (skip <= 0) |
517 break; | |
516 } | 518 } |
517 return lastGoodIndex; | 519 return lastGoodIndex; |
518 } | 520 } |
519 | 521 |
520 int HTMLSelectElement::nextSelectableListIndex(int startIndex) const | 522 int HTMLSelectElement::nextSelectableListIndex(int startIndex) const |
521 { | 523 { |
522 return nextValidIndex(startIndex, SkipForwards, 1); | 524 return nextValidIndex(startIndex, SkipForwards, 1); |
523 } | 525 } |
524 | 526 |
525 int HTMLSelectElement::previousSelectableListIndex(int startIndex) const | 527 int HTMLSelectElement::previousSelectableListIndex(int startIndex) const |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
618 { | 620 { |
619 ASSERT(renderer() && (renderer()->isListBox() || m_multiple)); | 621 ASSERT(renderer() && (renderer()->isListBox() || m_multiple)); |
620 ASSERT(!listItems().size() || m_activeSelectionAnchorIndex >= 0); | 622 ASSERT(!listItems().size() || m_activeSelectionAnchorIndex >= 0); |
621 | 623 |
622 unsigned start = min(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex ); | 624 unsigned start = min(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex ); |
623 unsigned end = max(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex); | 625 unsigned end = max(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex); |
624 | 626 |
625 const Vector<HTMLElement*>& items = listItems(); | 627 const Vector<HTMLElement*>& items = listItems(); |
626 for (unsigned i = 0; i < items.size(); ++i) { | 628 for (unsigned i = 0; i < items.size(); ++i) { |
627 HTMLElement* element = items[i]; | 629 HTMLElement* element = items[i]; |
628 if (!isHTMLOptionElement(*element) || toHTMLOptionElement(element)->isDi sabledFormControl()) | 630 if (!isHTMLOptionElement(*element) || toHTMLOptionElement(element)->isDi sabledFormControl() || toHTMLOptionElement(element)->isDisplayNone()) |
629 continue; | 631 continue; |
630 | 632 |
631 if (i >= start && i <= end) | 633 if (i >= start && i <= end) |
632 toHTMLOptionElement(element)->setSelectedState(m_activeSelectionStat e); | 634 toHTMLOptionElement(element)->setSelectedState(m_activeSelectionStat e); |
633 else if (deselectOtherOptions || i >= m_cachedStateForActiveSelection.si ze()) | 635 else if (deselectOtherOptions || i >= m_cachedStateForActiveSelection.si ze()) |
634 toHTMLOptionElement(element)->setSelectedState(false); | 636 toHTMLOptionElement(element)->setSelectedState(false); |
635 else | 637 else |
636 toHTMLOptionElement(element)->setSelectedState(m_cachedStateForActiv eSelection[i]); | 638 toHTMLOptionElement(element)->setSelectedState(m_cachedStateForActiv eSelection[i]); |
637 } | 639 } |
638 | 640 |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
836 { | 838 { |
837 return m_suggestedIndex; | 839 return m_suggestedIndex; |
838 } | 840 } |
839 | 841 |
840 void HTMLSelectElement::setSuggestedIndex(int suggestedIndex) | 842 void HTMLSelectElement::setSuggestedIndex(int suggestedIndex) |
841 { | 843 { |
842 m_suggestedIndex = suggestedIndex; | 844 m_suggestedIndex = suggestedIndex; |
843 | 845 |
844 if (RenderObject* renderer = this->renderer()) { | 846 if (RenderObject* renderer = this->renderer()) { |
845 renderer->updateFromElement(); | 847 renderer->updateFromElement(); |
846 if (renderer->isListBox()) | 848 if (renderer->isListBox()) { |
847 toRenderListBox(renderer)->scrollToRevealElementAtListIndex(suggeste dIndex); | 849 RenderListBox* listBox = toRenderListBox(renderer); |
850 listBox->scrollToRevealElementAtListIndex(listBox->toRenderListBoxIn dex(suggestedIndex)); | |
keishi
2014/04/11 06:40:13
I don't like to have yet another index. We have op
spartha
2014/04/11 11:19:45
Done.
| |
851 } | |
848 } | 852 } |
849 } | 853 } |
850 | 854 |
851 void HTMLSelectElement::optionSelectionStateChanged(HTMLOptionElement* option, b ool optionIsSelected) | 855 void HTMLSelectElement::optionSelectionStateChanged(HTMLOptionElement* option, b ool optionIsSelected) |
852 { | 856 { |
853 ASSERT(option->ownerSelectElement() == this); | 857 ASSERT(option->ownerSelectElement() == this); |
854 if (optionIsSelected) | 858 if (optionIsSelected) |
855 selectOption(option->index()); | 859 selectOption(option->index()); |
856 else if (!usesMenuList() || multiple()) | 860 else if (!usesMenuList() || multiple()) |
857 selectOption(-1); | 861 selectOption(-1); |
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1443 if (selectNewItem) | 1447 if (selectNewItem) |
1444 m_activeSelectionState = true; | 1448 m_activeSelectionState = true; |
1445 // If the anchor is unitialized, or if we're going to deselect all | 1449 // If the anchor is unitialized, or if we're going to deselect all |
1446 // other options, then set the anchor index equal to the end index. | 1450 // other options, then set the anchor index equal to the end index. |
1447 bool deselectOthers = !m_multiple || (!toKeyboardEvent(event)->shift Key() && selectNewItem); | 1451 bool deselectOthers = !m_multiple || (!toKeyboardEvent(event)->shift Key() && selectNewItem); |
1448 if (m_activeSelectionAnchorIndex < 0 || deselectOthers) { | 1452 if (m_activeSelectionAnchorIndex < 0 || deselectOthers) { |
1449 if (deselectOthers) | 1453 if (deselectOthers) |
1450 deselectItemsWithoutValidation(); | 1454 deselectItemsWithoutValidation(); |
1451 setActiveSelectionAnchorIndex(m_activeSelectionEndIndex); | 1455 setActiveSelectionAnchorIndex(m_activeSelectionEndIndex); |
1452 } | 1456 } |
1453 | 1457 RenderListBox* listBox = toRenderListBox(renderer()); |
1454 toRenderListBox(renderer())->scrollToRevealElementAtListIndex(endInd ex); | 1458 toRenderListBox(renderer())->scrollToRevealElementAtListIndex(listBo x->toRenderListBoxIndex(endIndex)); |
keishi
2014/04/11 06:40:13
Ditto.
spartha
2014/04/11 11:19:45
Done.
| |
1455 if (selectNewItem) { | 1459 if (selectNewItem) { |
1456 updateListBoxSelection(deselectOthers); | 1460 updateListBoxSelection(deselectOthers); |
1457 listBoxOnChange(); | 1461 listBoxOnChange(); |
1458 } else | 1462 } else |
1459 scrollToSelection(); | 1463 scrollToSelection(); |
1460 | 1464 |
1461 event->setDefaultHandled(); | 1465 event->setDefaultHandled(); |
1462 } | 1466 } |
1463 } else if (event->type() == EventTypeNames::keypress) { | 1467 } else if (event->type() == EventTypeNames::keypress) { |
1464 if (!event->isKeyboardEvent()) | 1468 if (!event->isKeyboardEvent()) |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1617 bool HTMLSelectElement::isInteractiveContent() const | 1621 bool HTMLSelectElement::isInteractiveContent() const |
1618 { | 1622 { |
1619 return true; | 1623 return true; |
1620 } | 1624 } |
1621 | 1625 |
1622 bool HTMLSelectElement::supportsAutofocus() const | 1626 bool HTMLSelectElement::supportsAutofocus() const |
1623 { | 1627 { |
1624 return true; | 1628 return true; |
1625 } | 1629 } |
1626 | 1630 |
1631 void HTMLSelectElement::updateListOnRenderer() | |
1632 { | |
1633 setOptionsChangedOnRenderer(); | |
1634 } | |
1635 | |
1636 void HTMLSelectElement::didRecalcStyle(StyleRecalcChange) | |
1637 { | |
1638 if (RenderObject* renderer = this->renderer()) | |
1639 renderer->updateFromElement(); | |
1640 } | |
1641 | |
1627 } // namespace | 1642 } // namespace |
OLD | NEW |