bool HTMLSelectElement::appendFormData(FormDataList& list, bool) { bool successful = false; const Vector<HTMLElement*>& items = listItems(); unsigned i; for (i = 0; i < items.size(); i++) { if (items[i]->hasLocalName(optionTag)) { HTMLOptionElement *option = static_cast<HTMLOptionElement*>(items[i]); if (option->selected()) { list.appendData(name(), option->value()); successful = true; } } } // ### this case should not happen. make sure that we select the first option // in any case. otherwise we have no consistency with the DOM interface. FIXME! // we return the first one if it was a combobox select if (!successful && !m_multiple && m_size <= 1 && items.size() && (items[0]->hasLocalName(optionTag))) { HTMLOptionElement *option = static_cast<HTMLOptionElement*>(items[0]); if (option->value().isNull()) list.appendData(name(), option->text().stripWhiteSpace()); else list.appendData(name(), option->value()); successful = true; } return successful; }
template <> inline bool isMatchingElement(const HTMLCollection* htmlCollection, Element* element) { CollectionType type = htmlCollection->type(); if (!element->isHTMLElement() && !(type == DocAll || type == NodeChildren || type == WindowNamedItems)) return false; switch (type) { case DocImages: return element->hasLocalName(imgTag); case DocScripts: return element->hasLocalName(scriptTag); case DocForms: return element->hasLocalName(formTag); case TableTBodies: return element->hasLocalName(tbodyTag); case TRCells: return element->hasLocalName(tdTag) || element->hasLocalName(thTag); case TSectionRows: return element->hasLocalName(trTag); case SelectOptions: return element->hasLocalName(optionTag); case SelectedOptions: return element->hasLocalName(optionTag) && toHTMLOptionElement(element)->selected(); case DataListOptions: if (element->hasLocalName(optionTag)) { HTMLOptionElement* option = toHTMLOptionElement(element); if (!option->isDisabledFormControl() && !option->value().isEmpty()) return true; } return false; case MapAreas: return element->hasLocalName(areaTag); case DocApplets: return element->hasLocalName(appletTag) || (element->hasLocalName(objectTag) && static_cast<HTMLObjectElement*>(element)->containsJavaApplet()); case DocEmbeds: return element->hasLocalName(embedTag); case DocLinks: return (element->hasLocalName(aTag) || element->hasLocalName(areaTag)) && element->fastHasAttribute(hrefAttr); case DocAnchors: return element->hasLocalName(aTag) && element->fastHasAttribute(nameAttr); case DocAll: case NodeChildren: return true; case DocumentNamedItems: return static_cast<const DocumentNameCollection*>(htmlCollection)->nodeMatches(element); case WindowNamedItems: return static_cast<const WindowNameCollection*>(htmlCollection)->nodeMatches(element); case FormControls: case TableRows: case ChildNodeListType: case ClassNodeListType: case NameNodeListType: case TagNodeListType: case HTMLTagNodeListType: case RadioNodeListType: case LabelsNodeListType: ASSERT_NOT_REACHED(); } return false; }
JSValue jsHTMLOptionElementValue(ExecState* exec, JSValue slotBase, const Identifier&) { JSHTMLOptionElement* castedThis = static_cast<JSHTMLOptionElement*>(asObject(slotBase)); UNUSED_PARAM(exec); HTMLOptionElement* imp = static_cast<HTMLOptionElement*>(castedThis->impl()); JSValue result = jsString(exec, imp->value()); return result; }
static inline bool isAcceptableElement(CollectionType type, Element* element) { if (!element->isHTMLElement() && !(type == DocAll || type == NodeChildren)) return false; switch (type) { case DocImages: return element->hasLocalName(imgTag); case DocScripts: return element->hasLocalName(scriptTag); case DocForms: return element->hasLocalName(formTag); case TableTBodies: return element->hasLocalName(tbodyTag); case TRCells: return element->hasLocalName(tdTag) || element->hasLocalName(thTag); case TSectionRows: return element->hasLocalName(trTag); case SelectOptions: return element->hasLocalName(optionTag); case SelectedOptions: return element->hasLocalName(optionTag) && toHTMLOptionElement(element)->selected(); case DataListOptions: if (element->hasLocalName(optionTag)) { HTMLOptionElement* option = static_cast<HTMLOptionElement*>(element); if (!option->disabled() && !option->value().isEmpty()) return true; } return false; case MapAreas: return element->hasLocalName(areaTag); case DocApplets: return element->hasLocalName(appletTag) || (element->hasLocalName(objectTag) && static_cast<HTMLObjectElement*>(element)->containsJavaApplet()); case DocEmbeds: return element->hasLocalName(embedTag); case DocObjects: return element->hasLocalName(objectTag); case DocLinks: return (element->hasLocalName(aTag) || element->hasLocalName(areaTag)) && element->fastHasAttribute(hrefAttr); case DocAnchors: return element->hasLocalName(aTag) && element->fastHasAttribute(nameAttr); case DocAll: case NodeChildren: return true; #if ENABLE(MICRODATA) case ItemProperties: return element->fastHasAttribute(itempropAttr); #endif case FormControls: case DocumentNamedItems: case TableRows: case WindowNamedItems: case NodeListCollectionType: ASSERT_NOT_REACHED(); } return false; }
void RangeInputType::updateTickMarkValues() { if (!m_tickMarkValuesDirty) return; m_tickMarkValues.clear(); m_tickMarkValuesDirty = false; HTMLDataListElement* dataList = element().dataList(); if (!dataList) return; HTMLDataListOptionsCollection* options = dataList->options(); m_tickMarkValues.reserveCapacity(options->length()); for (unsigned i = 0; i < options->length(); ++i) { HTMLOptionElement* optionElement = options->item(i); String optionValue = optionElement->value(); if (!this->element().isValidValue(optionValue)) continue; m_tickMarkValues.append(parseToNumber(optionValue, Decimal::nan())); } m_tickMarkValues.shrinkToFit(); nonCopyingSort(m_tickMarkValues.begin(), m_tickMarkValues.end(), decimalCompare); }
bool HTMLSelectElement::hasPlaceholderLabelOption() const { // The select element has no placeholder label option if it has an attribute "multiple" specified or a display size of non-1. // // The condition "size() > 1" is actually not compliant with the HTML5 spec as of Dec 3, 2010. "size() != 1" is correct. // Using "size() > 1" here because size() may be 0 in WebKit. // See the discussion at https://bugs.webkit.org/show_bug.cgi?id=43887 // // "0 size()" happens when an attribute "size" is absent or an invalid size attribute is specified. // In this case, the display size should be assumed as the default. // The default display size is 1 for non-multiple select elements, and 4 for multiple select elements. // // Finally, if size() == 0 and non-multiple, the display size can be assumed as 1. if (multiple() || size() > 1) return false; int listIndex = optionToListIndex(0); ASSERT(listIndex >= 0); if (listIndex < 0) return false; HTMLOptionElement* option = static_cast<HTMLOptionElement*>(listItems()[listIndex]); return !listIndex && option->value().isEmpty(); }
void RenderTheme::paintSliderTicks(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect) { Node* node = o->node(); if (!node) return; HTMLInputElement* input = node->toInputElement(); if (!input) return; HTMLDataListElement* dataList = static_cast<HTMLDataListElement*>(input->list()); if (!dataList) return; double min = input->minimum(); double max = input->maximum(); ControlPart part = o->style()->appearance(); // We don't support ticks on alternate sliders like MediaVolumeSliders. if (part != SliderHorizontalPart && part != SliderVerticalPart) return; bool isHorizontal = part == SliderHorizontalPart; IntSize thumbSize; RenderObject* thumbRenderer = input->sliderThumbElement()->renderer(); if (thumbRenderer) { RenderStyle* thumbStyle = thumbRenderer->style(); int thumbWidth = thumbStyle->width().intValue(); int thumbHeight = thumbStyle->height().intValue(); thumbSize.setWidth(isHorizontal ? thumbWidth : thumbHeight); thumbSize.setHeight(isHorizontal ? thumbHeight : thumbWidth); } IntSize tickSize = sliderTickSize(); float zoomFactor = o->style()->effectiveZoom(); FloatRect tickRect; int tickRegionSideMargin = 0; int tickRegionWidth = 0; IntRect trackBounds; RenderObject* trackRenderer = input->sliderTrackElement()->renderer(); // We can ignoring transforms because transform is handled by the graphics context. if (trackRenderer) trackBounds = trackRenderer->absoluteBoundingBoxRectIgnoringTransforms(); IntRect sliderBounds = o->absoluteBoundingBoxRectIgnoringTransforms(); // Make position relative to the transformed ancestor element. trackBounds.setX(trackBounds.x() - sliderBounds.x() + rect.x()); trackBounds.setY(trackBounds.y() - sliderBounds.y() + rect.y()); if (isHorizontal) { tickRect.setWidth(floor(tickSize.width() * zoomFactor)); tickRect.setHeight(floor(tickSize.height() * zoomFactor)); tickRect.setY(floor(rect.y() + rect.height() / 2.0 + sliderTickOffsetFromTrackCenter() * zoomFactor)); tickRegionSideMargin = trackBounds.x() + (thumbSize.width() - tickSize.width() * zoomFactor) / 2.0; tickRegionWidth = trackBounds.width() - thumbSize.width(); } else { tickRect.setWidth(floor(tickSize.height() * zoomFactor)); tickRect.setHeight(floor(tickSize.width() * zoomFactor)); tickRect.setX(floor(rect.x() + rect.width() / 2.0 + sliderTickOffsetFromTrackCenter() * zoomFactor)); tickRegionSideMargin = trackBounds.y() + (thumbSize.width() - tickSize.width() * zoomFactor) / 2.0; tickRegionWidth = trackBounds.height() - thumbSize.width(); } RefPtr<HTMLCollection> options = dataList->options(); GraphicsContextStateSaver stateSaver(*paintInfo.context); paintInfo.context->setFillColor(o->style()->visitedDependentColor(CSSPropertyColor), ColorSpaceDeviceRGB); for (unsigned i = 0; Node* node = options->item(i); i++) { ASSERT(node->hasTagName(optionTag)); HTMLOptionElement* optionElement = toHTMLOptionElement(node); String value = optionElement->value(); if (!input->isValidValue(value)) continue; double parsedValue = parseToDoubleForNumberType(input->sanitizeValue(value)); double tickFraction = (parsedValue - min) / (max - min); double tickRatio = isHorizontal && o->style()->isLeftToRightDirection() ? tickFraction : 1.0 - tickFraction; double tickPosition = round(tickRegionSideMargin + tickRegionWidth * tickRatio); if (isHorizontal) tickRect.setX(tickPosition); else tickRect.setY(tickPosition); paintInfo.context->fillRect(tickRect); } }
Element* HTMLCollection::itemAfter(Element* previous) const { bool deep = true; switch (m_type) { case DocAll: case DocAnchors: case DocApplets: case DocEmbeds: case DocForms: case DocImages: case DocLinks: case DocObjects: case DocScripts: case DocumentNamedItems: case MapAreas: case OtherCollection: case SelectOptions: case DataListOptions: case WindowNamedItems: break; case NodeChildren: case TRCells: case TSectionRows: case TableTBodies: deep = false; break; } Node* current; if (!previous) current = m_base->firstChild(); else current = nextNodeOrSibling(m_base.get(), previous, deep); for (; current; current = nextNodeOrSibling(m_base.get(), current, deep)) { if (!current->isElementNode()) continue; Element* e = static_cast<Element*>(current); switch (m_type) { case DocImages: if (e->hasLocalName(imgTag)) return e; break; case DocScripts: if (e->hasLocalName(scriptTag)) return e; break; case DocForms: if (e->hasLocalName(formTag)) return e; break; case TableTBodies: if (e->hasLocalName(tbodyTag)) return e; break; case TRCells: if (e->hasLocalName(tdTag) || e->hasLocalName(thTag)) return e; break; case TSectionRows: if (e->hasLocalName(trTag)) return e; break; case SelectOptions: if (e->hasLocalName(optionTag)) return e; break; case DataListOptions: if (e->hasLocalName(optionTag)) { HTMLOptionElement* option = static_cast<HTMLOptionElement*>(e); if (!option->disabled() && !option->value().isEmpty()) return e; } break; case MapAreas: if (e->hasLocalName(areaTag)) return e; break; case DocApplets: // all <applet> elements and <object> elements that contain Java Applets // weolar __asm int 3; // if (e->hasLocalName(appletTag)) // return e; // if (e->hasLocalName(objectTag) && static_cast<HTMLObjectElement*>(e)->containsJavaApplet()) // return e; break; case DocEmbeds: if (e->hasLocalName(embedTag)) return e; break; case DocObjects: if (e->hasLocalName(objectTag)) return e; break; case DocLinks: // all <a> and <area> elements with a value for href if ((e->hasLocalName(aTag) || e->hasLocalName(areaTag)) && e->fastHasAttribute(hrefAttr)) return e; break; case DocAnchors: // all <a> elements with a value for name if (e->hasLocalName(aTag) && e->fastHasAttribute(nameAttr)) return e; break; case DocAll: case NodeChildren: return e; case DocumentNamedItems: case OtherCollection: case WindowNamedItems: ASSERT_NOT_REACHED(); break; } } return 0; }
static v8::Handle<v8::Value> valueAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { HTMLOptionElement* imp = V8HTMLOptionElement::toNative(info.Holder()); return v8String(imp->value(), info.GetIsolate()); }
static v8::Handle<v8::Value> valueAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.HTMLOptionElement.value._get"); HTMLOptionElement* imp = V8HTMLOptionElement::toNative(info.Holder()); return v8String(imp->value()); }