| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * Copyright (C) 2004-2008, 2013, 2014 Apple Inc. All rights reserved. | 4 * Copyright (C) 2004-2008, 2013, 2014 Apple Inc. All rights reserved. |
| 5 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 5 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
| 6 * Copyright (C) 2011 Motorola Mobility. All rights reserved. | 6 * Copyright (C) 2011 Motorola Mobility. All rights reserved. |
| 7 * | 7 * |
| 8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
| 9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
| 10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
| (...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 } | 704 } |
| 705 | 705 |
| 706 bool HTMLElement::hasDirectionAuto() const | 706 bool HTMLElement::hasDirectionAuto() const |
| 707 { | 707 { |
| 708 // <bdi> defaults to dir="auto" | 708 // <bdi> defaults to dir="auto" |
| 709 // https://html.spec.whatwg.org/multipage/semantics.html#the-bdi-element | 709 // https://html.spec.whatwg.org/multipage/semantics.html#the-bdi-element |
| 710 const AtomicString& direction = fastGetAttribute(dirAttr); | 710 const AtomicString& direction = fastGetAttribute(dirAttr); |
| 711 return (isHTMLBDIElement(*this) && direction == nullAtom) || equalIgnoringCa
se(direction, "auto"); | 711 return (isHTMLBDIElement(*this) && direction == nullAtom) || equalIgnoringCa
se(direction, "auto"); |
| 712 } | 712 } |
| 713 | 713 |
| 714 TextDirection HTMLElement::directionalityIfhasDirAutoAttribute(bool& isAuto) con
st | 714 TextDirection HTMLElement::computeDirectionality(Node** strongDirectionalityText
Node) const |
| 715 { | |
| 716 isAuto = hasDirectionAuto(); | |
| 717 if (!isAuto) | |
| 718 return LTR; | |
| 719 return directionality(); | |
| 720 } | |
| 721 | |
| 722 TextDirection HTMLElement::directionality(Node** strongDirectionalityTextNode) c
onst | |
| 723 { | 715 { |
| 724 if (isHTMLInputElement(*this)) { | 716 if (isHTMLInputElement(*this)) { |
| 725 HTMLInputElement* inputElement = toHTMLInputElement(const_cast<HTMLEleme
nt*>(this)); | 717 HTMLInputElement* inputElement = toHTMLInputElement(const_cast<HTMLEleme
nt*>(this)); |
| 726 bool hasStrongDirectionality; | 718 bool hasStrongDirectionality; |
| 727 TextDirection textDirection = determineDirectionality(inputElement->valu
e(), &hasStrongDirectionality); | 719 TextDirection textDirection = determineDirectionality(inputElement->valu
e(), &hasStrongDirectionality); |
| 728 if (strongDirectionalityTextNode) | 720 if (strongDirectionalityTextNode) |
| 729 *strongDirectionalityTextNode = hasStrongDirectionality ? inputEleme
nt : 0; | 721 *strongDirectionalityTextNode = hasStrongDirectionality ? inputEleme
nt : 0; |
| 730 return textDirection; | 722 return textDirection; |
| 731 } | 723 } |
| 732 | 724 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 return layoutObject() && layoutObject()->style() && layoutObject()->style()-
>selfOrAncestorHasDirAutoAttribute(); | 761 return layoutObject() && layoutObject()->style() && layoutObject()->style()-
>selfOrAncestorHasDirAutoAttribute(); |
| 770 } | 762 } |
| 771 | 763 |
| 772 void HTMLElement::dirAttributeChanged(const AtomicString& value) | 764 void HTMLElement::dirAttributeChanged(const AtomicString& value) |
| 773 { | 765 { |
| 774 // If an ancestor has dir=auto, and this node has the first character, | 766 // If an ancestor has dir=auto, and this node has the first character, |
| 775 // changes to dir attribute may affect the ancestor. | 767 // changes to dir attribute may affect the ancestor. |
| 776 updateDistribution(); | 768 updateDistribution(); |
| 777 Element* parent = FlatTreeTraversal::parentElement(*this); | 769 Element* parent = FlatTreeTraversal::parentElement(*this); |
| 778 if (parent && parent->isHTMLElement() && toHTMLElement(parent)->selfOrAncest
orHasDirAutoAttribute()) | 770 if (parent && parent->isHTMLElement() && toHTMLElement(parent)->selfOrAncest
orHasDirAutoAttribute()) |
| 779 toHTMLElement(parent)->adjustDirectionalityIfNeededAfterChildAttributeCh
anged(this); | 771 toHTMLElement(parent)->updateSelfOrAncestorForDirAuto(); |
| 780 | 772 |
| 781 if (equalIgnoringCase(value, "auto")) | 773 if (equalIgnoringCase(value, "auto")) { |
| 782 calculateAndAdjustDirectionality(); | 774 updateForDirAuto(); |
| 783 } | 775 } else if (elementData() && elementData()->directionality() != CachedTextDir
ection::NotAutoOrNotCached) { |
| 784 | 776 DCHECK(elementData()->isUnique()); |
| 785 void HTMLElement::adjustDirectionalityIfNeededAfterChildAttributeChanged(Element
* child) | 777 const_cast<ElementData*>(elementData())->setDirectionality(CachedTextDir
ection::NotAutoOrNotCached); |
| 786 { | |
| 787 ASSERT(selfOrAncestorHasDirAutoAttribute()); | |
| 788 TextDirection textDirection = directionality(); | |
| 789 if (layoutObject() && layoutObject()->style() && layoutObject()->style()->di
rection() != textDirection) { | |
| 790 Element* elementToAdjust = this; | |
| 791 for (; elementToAdjust; elementToAdjust = FlatTreeTraversal::parentEleme
nt(*elementToAdjust)) { | |
| 792 if (elementAffectsDirectionality(elementToAdjust)) { | |
| 793 elementToAdjust->setNeedsStyleRecalc(LocalStyleChange, StyleChan
geReasonForTracing::create(StyleChangeReason::WritingModeChange)); | |
| 794 return; | |
| 795 } | |
| 796 } | |
| 797 } | 778 } |
| 798 } | 779 } |
| 799 | 780 |
| 800 void HTMLElement::calculateAndAdjustDirectionality() | 781 void HTMLElement::updateSelfOrAncestorForDirAuto() |
| 801 { | 782 { |
| 802 TextDirection textDirection = directionality(); | 783 ASSERT(selfOrAncestorHasDirAutoAttribute()); |
| 803 if (layoutObject() && layoutObject()->style() && layoutObject()->style()->di
rection() != textDirection) | 784 //XXX add test that this would code would fail |
| 804 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::creat
e(StyleChangeReason::WritingModeChange)); | 785 //TextDirection textDirection = computeDirectionality(); |
| 786 //if (layoutObject() && layoutObject()->style() && layoutObject()->style()->
direction() != textDirection) { |
| 787 Element* elementToAdjust = this; |
| 788 while (!elementAffectsDirectionality(elementToAdjust)) |
| 789 elementToAdjust = FlatTreeTraversal::parentElement(*elementToAdjust); |
| 790 toHTMLElement(elementToAdjust)->updateForDirAuto(); |
| 791 } |
| 792 |
| 793 void HTMLElement::updateForDirAuto() |
| 794 { |
| 795 if (!hasDirectionAuto()) |
| 796 return; |
| 797 ensureUniqueElementData().setDirectionality(CachedTextDirection::NotAutoOrNo
tCached); |
| 798 pseudoStateChanged(CSSSelector::PseudoDir); |
| 799 setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create(St
yleChangeReason::WritingModeChange)); |
| 800 } |
| 801 |
| 802 void HTMLElement::cacheDirectionalityForDirAuto() const |
| 803 { |
| 804 DCHECK(hasDirectionAuto()); |
| 805 DCHECK(elementData() && elementData()->isUnique()); |
| 806 DCHECK(elementData()->directionality() == CachedTextDirection::NotAutoOrNotC
ached); |
| 807 if (computeDirectionality() == LTR) |
| 808 elementData()->setDirectionality(CachedTextDirection::AutoLTR); |
| 809 else |
| 810 elementData()->setDirectionality(CachedTextDirection::AutoRTL); |
| 805 } | 811 } |
| 806 | 812 |
| 807 void HTMLElement::adjustDirectionalityIfNeededAfterChildrenChanged(const Childre
nChange& change) | 813 void HTMLElement::adjustDirectionalityIfNeededAfterChildrenChanged(const Childre
nChange& change) |
| 808 { | 814 { |
| 809 if (!selfOrAncestorHasDirAutoAttribute()) | 815 if (!selfOrAncestorHasDirAutoAttribute()) |
| 810 return; | 816 return; |
| 811 | 817 |
| 812 updateDistribution(); | 818 updateDistribution(); |
| 813 | 819 updateSelfOrAncestorForDirAuto(); |
| 814 for (Element* elementToAdjust = this; elementToAdjust; elementToAdjust = Fla
tTreeTraversal::parentElement(*elementToAdjust)) { | |
| 815 if (elementAffectsDirectionality(elementToAdjust)) { | |
| 816 toHTMLElement(elementToAdjust)->calculateAndAdjustDirectionality(); | |
| 817 return; | |
| 818 } | |
| 819 } | |
| 820 } | 820 } |
| 821 | 821 |
| 822 void HTMLElement::addHTMLLengthToStyle(MutableStylePropertySet* style, CSSProper
tyID propertyID, const String& value) | 822 void HTMLElement::addHTMLLengthToStyle(MutableStylePropertySet* style, CSSProper
tyID propertyID, const String& value) |
| 823 { | 823 { |
| 824 // FIXME: This function should not spin up the CSS parser, but should instea
d just figure out the correct | 824 // FIXME: This function should not spin up the CSS parser, but should instea
d just figure out the correct |
| 825 // length unit and make the appropriate parsed value. | 825 // length unit and make the appropriate parsed value. |
| 826 | 826 |
| 827 // strip attribute garbage.. | 827 // strip attribute garbage.. |
| 828 StringImpl* v = value.impl(); | 828 StringImpl* v = value.impl(); |
| 829 if (v) { | 829 if (v) { |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1037 #ifndef NDEBUG | 1037 #ifndef NDEBUG |
| 1038 | 1038 |
| 1039 // For use in the debugger | 1039 // For use in the debugger |
| 1040 void dumpInnerHTML(blink::HTMLElement*); | 1040 void dumpInnerHTML(blink::HTMLElement*); |
| 1041 | 1041 |
| 1042 void dumpInnerHTML(blink::HTMLElement* element) | 1042 void dumpInnerHTML(blink::HTMLElement* element) |
| 1043 { | 1043 { |
| 1044 printf("%s\n", element->innerHTML().ascii().data()); | 1044 printf("%s\n", element->innerHTML().ascii().data()); |
| 1045 } | 1045 } |
| 1046 #endif | 1046 #endif |
| OLD | NEW |