int AccessibilityListBoxOption::listBoxOptionIndex() const { if (!m_optionElement) return -1; HTMLSelectElement* selectElement = listBoxOptionParentNode(); if (!selectElement) return -1; const auto& listItems = selectElement->listItems(); unsigned length = listItems.size(); for (unsigned i = 0; i < length; i++) if (listItems[i] == m_optionElement) return i; return -1; }
String RenderMenuList::itemText(unsigned listIndex) const { HTMLSelectElement* select = selectElement(); const Vector<HTMLElement*>& listItems = select->listItems(); if (listIndex >= listItems.size()) return String(); String itemString; Element* element = listItems[listIndex]; if (isHTMLOptGroupElement(element)) itemString = toHTMLOptGroupElement(element)->groupLabelText(); else if (element->hasTagName(optionTag)) itemString = toHTMLOptionElement(element)->textIndentedToRespectGroupLabel(); applyTextTransform(style(), itemString, ' '); return itemString; }
int AXListBoxOption::listBoxOptionIndex() const { if (!m_optionElement) return -1; HTMLSelectElement* selectElement = listBoxOptionParentNode(); if (!selectElement) return -1; const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems = selectElement->listItems(); unsigned length = listItems.size(); for (unsigned i = 0; i < length; i++) { if (listItems[i] == m_optionElement) return i; } return -1; }
void RenderMenuList::setTextFromOption(int optionIndex) { HTMLSelectElement* select = selectElement(); const Vector<HTMLElement*>& listItems = select->listItems(); int size = listItems.size(); int i = select->optionToListIndex(optionIndex); String text = emptyString(); if (i >= 0 && i < size) { Element* element = listItems[i]; if (element->hasTagName(optionTag)) { text = toHTMLOptionElement(element)->textIndentedToRespectGroupLabel(); m_optionStyle = element->renderStyle(); } } setText(text.stripWhiteSpace()); didUpdateActiveOption(optionIndex); }
int HTMLOptionElement::index() const { // Let's do this dynamically. Might be a bit slow, but we're sure // we won't forget to update a member variable in some cases... HTMLSelectElement* select = ownerSelectElement(); if (select) { const Vector<HTMLElement*>& items = select->listItems(); int l = items.size(); int optionIndex = 0; for(int i = 0; i < l; i++) { if (items[i]->hasLocalName(optionTag)) { if (static_cast<HTMLOptionElement*>(items[i]) == this) return optionIndex; optionIndex++; } } } return 0; }
int HTMLOptionElement::index() const { // It would be faster to cache the index, but harder to get it right in all cases. HTMLSelectElement* selectElement = ownerSelectElement(); if (!selectElement) return 0; int optionIndex = 0; for (auto& item : selectElement->listItems()) { if (!is<HTMLOptionElement>(*item)) continue; if (item == this) return optionIndex; ++optionIndex; } return 0; }
Color RenderMenuList::itemBackgroundColor(unsigned listIndex) const { HTMLSelectElement* select = static_cast<HTMLSelectElement*>(node()); HTMLElement* element = select->listItems()[listIndex]; Color backgroundColor; if (element->renderStyle()) backgroundColor = element->renderStyle()->backgroundColor(); // If the item has an opaque background color, return that. if (!backgroundColor.hasAlpha()) return backgroundColor; // Otherwise, the item's background is overlayed on top of the menu background. backgroundColor = style()->backgroundColor().blend(backgroundColor); if (!backgroundColor.hasAlpha()) return backgroundColor; // If the menu background is not opaque, then add an opaque white background behind. return Color(Color::white).blend(backgroundColor); }
void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo& info, HTMLSelectElement& ownerElement) { const WillBeHeapVector<RawPtrWillBeMember<HTMLElement>>& listItems = ownerElement.listItems(); size_t itemCount = listItems.size(); size_t count = 0; Vector<WebMenuItemInfo> items(itemCount); for (size_t i = 0; i < itemCount; ++i) { if (ownerElement.itemIsDisplayNone(*listItems[i])) continue; Element& itemElement = *listItems[i]; WebMenuItemInfo& popupItem = items[count++]; popupItem.label = ownerElement.itemText(itemElement); popupItem.toolTip = itemElement.title(); popupItem.checked = false; if (isHTMLHRElement(itemElement)) { popupItem.type = WebMenuItemInfo::Separator; } else if (isHTMLOptGroupElement(itemElement)) { popupItem.type = WebMenuItemInfo::Group; } else { popupItem.type = WebMenuItemInfo::Option; popupItem.checked = toHTMLOptionElement(itemElement).selected(); } popupItem.enabled = !itemElement.isDisabledFormControl(); const ComputedStyle& style = *ownerElement.itemComputedStyle(itemElement); popupItem.textDirection = toWebTextDirection(style.direction()); popupItem.hasTextDirectionOverride = isOverride(style.unicodeBidi()); } const ComputedStyle& menuStyle = ownerElement.computedStyle() ? *ownerElement.computedStyle() : *ownerElement.ensureComputedStyle(); info.itemHeight = menuStyle.font().fontMetrics().height(); info.itemFontSize = static_cast<int>(menuStyle.font().fontDescription().computedSize()); info.selectedIndex = toExternalPopupMenuItemIndex(ownerElement.optionToListIndex(ownerElement.selectedIndex()), ownerElement); info.rightAligned = menuStyle.direction() == RTL; info.allowMultipleSelection = ownerElement.multiple(); if (count < itemCount) items.shrink(count); info.items = items; }
int HTMLOptionElement::index() const { // It would be faster to cache the index, but harder to get it right in all cases. HTMLSelectElement* selectElement = ownerSelectElement(); if (!selectElement) return 0; int optionIndex = 0; const Vector<HTMLElement*>& items = selectElement->listItems(); size_t length = items.size(); for (size_t i = 0; i < length; ++i) { if (!items[i]->hasTagName(optionTag)) continue; if (items[i] == this) return optionIndex; ++optionIndex; } return 0; }
int HTMLOptionElement::index() const { // It would be faster to cache the index, but harder to get it right in all cases. HTMLSelectElement* selectElement = ownerSelectElement(); if (!selectElement) return 0; int optionIndex = 0; const WillBeHeapVector<RawPtrWillBeMember<HTMLElement>>& items = selectElement->listItems(); size_t length = items.size(); for (size_t i = 0; i < length; ++i) { if (!isHTMLOptionElement(*items[i])) continue; if (items[i].get() == this) return optionIndex; ++optionIndex; } return 0; }
void RenderListBox::paintItemBackground(PaintInfo& paintInfo, int tx, int ty, int listIndex) { HTMLSelectElement* select = static_cast<HTMLSelectElement*>(node()); const Vector<HTMLElement*>& listItems = select->listItems(); HTMLElement* element = listItems[listIndex]; Color backColor; if (element->hasTagName(optionTag) && static_cast<HTMLOptionElement*>(element)->selected()) { if (document()->frame()->isActive() && document()->focusedNode() == node()) backColor = theme()->activeListBoxSelectionBackgroundColor(); else backColor = theme()->inactiveListBoxSelectionBackgroundColor(); } else backColor = element->renderStyle() ? element->renderStyle()->backgroundColor() : style()->backgroundColor(); // Draw the background for this list box item if (!element->renderStyle() || element->renderStyle()->visibility() != HIDDEN) { IntRect itemRect = itemBoundingBoxRect(tx, ty, listIndex); itemRect.intersect(controlClipRect(tx, ty)); paintInfo.context->fillRect(itemRect, backColor); } }
void LayoutMenuList::didUpdateActiveOption(int optionIndex) { if (!document().existingAXObjectCache()) return; if (m_lastActiveIndex == optionIndex) return; m_lastActiveIndex = optionIndex; HTMLSelectElement* select = selectElement(); int listIndex = select->optionToListIndex(optionIndex); if (listIndex < 0 || listIndex >= static_cast<int>(select->listItems().size())) return; // We skip sending accessiblity notifications for the very first option, otherwise // we get extra focus and select events that are undesired. if (!m_hasUpdatedActiveOption) { m_hasUpdatedActiveOption = true; return; } document().existingAXObjectCache()->handleUpdateActiveMenuOption(this, optionIndex); }
LayoutUnit LayoutListBox::itemHeight() const { HTMLSelectElement* select = selectElement(); if (!select) return LayoutUnit(); const auto& items = select->listItems(); if (items.isEmpty()) return defaultItemHeight(); LayoutUnit maxHeight; for (Element* element : items) { if (isHTMLOptGroupElement(element)) element = &toHTMLOptGroupElement(element)->optGroupLabelElement(); LayoutObject* layoutObject = element->layoutObject(); LayoutUnit itemHeight; if (layoutObject && layoutObject->isBox()) itemHeight = toLayoutBox(layoutObject)->size().height(); else itemHeight = defaultItemHeight(); maxHeight = std::max(maxHeight, itemHeight); } return maxHeight; }
bool RenderMenuList::itemIsLabel(unsigned listIndex) const { HTMLSelectElement* select = static_cast<HTMLSelectElement*>(node()); HTMLElement* element = select->listItems()[listIndex]; return element->hasTagName(optgroupTag); }
int RenderMenuList::listSize() const { HTMLSelectElement* select = static_cast<HTMLSelectElement*>(node()); return select->listItems().size(); }