void HTMLElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style) { if (name == alignAttr) { if (equalIgnoringCase(value, "middle")) addPropertyToPresentationAttributeStyle(style, CSSPropertyTextAlign, CSSValueCenter); else addPropertyToPresentationAttributeStyle(style, CSSPropertyTextAlign, value); } else if (name == contenteditableAttr) { if (value.isEmpty() || equalIgnoringCase(value, "true")) { addPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitUserModify, CSSValueReadWrite); addPropertyToPresentationAttributeStyle(style, CSSPropertyWordWrap, CSSValueBreakWord); addPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitLineBreak, CSSValueAfterWhiteSpace); UseCounter::count(document(), UseCounter::ContentEditableTrue); if (hasTagName(htmlTag)) UseCounter::count(document(), UseCounter::ContentEditableTrueOnHTML); } else if (equalIgnoringCase(value, "plaintext-only")) { addPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitUserModify, CSSValueReadWritePlaintextOnly); addPropertyToPresentationAttributeStyle(style, CSSPropertyWordWrap, CSSValueBreakWord); addPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitLineBreak, CSSValueAfterWhiteSpace); UseCounter::count(document(), UseCounter::ContentEditablePlainTextOnly); } else if (equalIgnoringCase(value, "false")) { addPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitUserModify, CSSValueReadOnly); } } else if (name == hiddenAttr) { addPropertyToPresentationAttributeStyle(style, CSSPropertyDisplay, CSSValueNone); } else if (name == draggableAttr) { if (equalIgnoringCase(value, "true")) { addPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitUserDrag, CSSValueElement); addPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitUserSelect, CSSValueNone); } else if (equalIgnoringCase(value, "false")) { addPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitUserDrag, CSSValueNone); } } else if (name == dirAttr) { if (equalIgnoringCase(value, "auto")) { addPropertyToPresentationAttributeStyle(style, CSSPropertyUnicodeBidi, unicodeBidiAttributeForDirAuto(this)); } else { if (isValidDirAttribute(value)) addPropertyToPresentationAttributeStyle(style, CSSPropertyDirection, value); else addPropertyToPresentationAttributeStyle(style, CSSPropertyDirection, "ltr"); if (!hasTagName(bdiTag) && !hasTagName(bdoTag) && !hasTagName(outputTag)) addPropertyToPresentationAttributeStyle(style, CSSPropertyUnicodeBidi, CSSValueIsolate); } } else if (name.matches(XMLNames::langAttr)) { mapLanguageAttributeToLocale(value, style); } else if (name == langAttr) { // xml:lang has a higher priority than lang. if (!fastHasAttribute(XMLNames::langAttr)) mapLanguageAttributeToLocale(value, style); } else { Element::collectStyleForPresentationAttribute(name, value, style); } }
TextDirection HTMLElement::directionality(Node** strongDirectionalityTextNode) const { if (isHTMLInputElement(*this)) { HTMLInputElement* inputElement = toHTMLInputElement(const_cast<HTMLElement*>(this)); bool hasStrongDirectionality; TextDirection textDirection = determineDirectionality(inputElement->value(), &hasStrongDirectionality); if (strongDirectionalityTextNode) *strongDirectionalityTextNode = hasStrongDirectionality ? inputElement : 0; return textDirection; } Node* node = ComposedTreeTraversal::firstChild(*this); while (node) { // Skip bdi, script, style and text form controls. if (equalIgnoringCase(node->nodeName(), "bdi") || isHTMLScriptElement(*node) || isHTMLStyleElement(*node) || (node->isElementNode() && toElement(node)->isTextFormControl())) { node = ComposedTreeTraversal::nextSkippingChildren(*node, this); continue; } // Skip elements with valid dir attribute if (node->isElementNode()) { AtomicString dirAttributeValue = toElement(node)->fastGetAttribute(dirAttr); if (isValidDirAttribute(dirAttributeValue)) { node = ComposedTreeTraversal::nextSkippingChildren(*node, this); continue; } } if (node->isTextNode()) { bool hasStrongDirectionality; TextDirection textDirection = determineDirectionality(node->textContent(true), &hasStrongDirectionality); if (hasStrongDirectionality) { if (strongDirectionalityTextNode) *strongDirectionalityTextNode = node; return textDirection; } } node = ComposedTreeTraversal::next(*node, this); } if (strongDirectionalityTextNode) *strongDirectionalityTextNode = 0; return LTR; }