| Index: third_party/WebKit/Source/core/dom/Element.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
|
| index 5df9aaf9e128cb47183ba5b3551f39f941983704..3f1fd6a009e002ddc3cb6695e804e16763ff7086 100644
|
| --- a/third_party/WebKit/Source/core/dom/Element.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/Element.cpp
|
| @@ -4,7 +4,8 @@
|
| * (C) 2001 Peter Kelly (pmk@post.com)
|
| * (C) 2001 Dirk Mueller (mueller@kde.org)
|
| * (C) 2007 David Smith (catfish.man@gmail.com)
|
| - * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved.
|
| + * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc.
|
| + * All rights reserved.
|
| * (C) 2007 Eric Seidel (eric@webkit.org)
|
| *
|
| * This library is free software; you can redistribute it and/or
|
| @@ -229,8 +230,8 @@ short Element::tabIndex() const {
|
| }
|
|
|
| bool Element::layoutObjectIsFocusable() const {
|
| - // Elements in canvas fallback content are not rendered, but they are allowed to be
|
| - // focusable as long as their canvas is displayed and visible.
|
| + // Elements in canvas fallback content are not rendered, but they are allowed
|
| + // to be focusable as long as their canvas is displayed and visible.
|
| if (isInCanvasSubtree()) {
|
| const HTMLCanvasElement* canvas =
|
| Traversal<HTMLCanvasElement>::firstAncestorOrSelf(*this);
|
| @@ -241,7 +242,8 @@ bool Element::layoutObjectIsFocusable() const {
|
| }
|
|
|
| // FIXME: Even if we are not visible, we might have a child that is visible.
|
| - // Hyatt wants to fix that some day with a "has visible content" flag or the like.
|
| + // Hyatt wants to fix that some day with a "has visible content" flag or the
|
| + // like.
|
| return layoutObject() &&
|
| layoutObject()->style()->visibility() == EVisibility::Visible;
|
| }
|
| @@ -258,8 +260,8 @@ Element* Element::cloneElementWithChildren() {
|
|
|
| Element* Element::cloneElementWithoutChildren() {
|
| Element* clone = cloneElementWithoutAttributesAndChildren();
|
| - // This will catch HTML elements in the wrong namespace that are not correctly copied.
|
| - // This is a sanity check as HTML overloads some of the DOM methods.
|
| + // This will catch HTML elements in the wrong namespace that are not correctly
|
| + // copied. This is a sanity check as HTML overloads some of the DOM methods.
|
| DCHECK_EQ(isHTMLElement(), clone->isHTMLElement());
|
|
|
| clone->cloneDataFromElement(*this);
|
| @@ -383,8 +385,8 @@ inline void Element::synchronizeAttribute(const QualifiedName& name) const {
|
| }
|
|
|
| void Element::synchronizeAttribute(const AtomicString& localName) const {
|
| - // This version of synchronizeAttribute() is streamlined for the case where you don't have a full QualifiedName,
|
| - // e.g when called from DOM API.
|
| + // This version of synchronizeAttribute() is streamlined for the case where
|
| + // you don't have a full QualifiedName, e.g when called from DOM API.
|
| if (!elementData())
|
| return;
|
| if (elementData()->m_styleAttributeIsDirty &&
|
| @@ -395,7 +397,8 @@ void Element::synchronizeAttribute(const AtomicString& localName) const {
|
| return;
|
| }
|
| if (elementData()->m_animatedSVGAttributesAreDirty) {
|
| - // We're not passing a namespace argument on purpose. SVGNames::*Attr are defined w/o namespaces as well.
|
| + // We're not passing a namespace argument on purpose. SVGNames::*Attr are
|
| + // defined w/o namespaces as well.
|
|
|
| // FIXME: this code is called regardless of whether name is an
|
| // animated SVG Attribute. It would seem we should only call this method
|
| @@ -558,7 +561,8 @@ void Element::nativeApplyScroll(ScrollState& scrollState) {
|
| if (delta.isZero())
|
| return;
|
|
|
| - // TODO(esprehn): This should use updateStyleAndLayoutIgnorePendingStylesheetsForNode.
|
| + // TODO(esprehn): This should use
|
| + // updateStyleAndLayoutIgnorePendingStylesheetsForNode.
|
| document().updateStyleAndLayoutIgnorePendingStylesheets();
|
|
|
| LayoutBox* boxToScroll = nullptr;
|
| @@ -700,8 +704,10 @@ int Element::clientTop() {
|
| }
|
|
|
| int Element::clientWidth() {
|
| - // When in strict mode, clientWidth for the document element should return the width of the containing frame.
|
| - // When in quirks mode, clientWidth for the body element should return the width of the containing frame.
|
| + // When in strict mode, clientWidth for the document element should return the
|
| + // width of the containing frame.
|
| + // When in quirks mode, clientWidth for the body element should return the
|
| + // width of the containing frame.
|
| bool inQuirksMode = document().inQuirksMode();
|
| if ((!inQuirksMode && document().documentElement() == this) ||
|
| (inQuirksMode && isHTMLElement() && document().body() == this)) {
|
| @@ -733,8 +739,10 @@ int Element::clientWidth() {
|
| }
|
|
|
| int Element::clientHeight() {
|
| - // When in strict mode, clientHeight for the document element should return the height of the containing frame.
|
| - // When in quirks mode, clientHeight for the body element should return the height of the containing frame.
|
| + // When in strict mode, clientHeight for the document element should return
|
| + // the height of the containing frame.
|
| + // When in quirks mode, clientHeight for the body element should return the
|
| + // height of the containing frame.
|
| bool inQuirksMode = document().inQuirksMode();
|
|
|
| if ((!inQuirksMode && document().documentElement() == this) ||
|
| @@ -1294,7 +1302,8 @@ void Element::attributeChanged(const QualifiedName& name,
|
|
|
| invalidateNodeListCachesInAncestors(&name, this);
|
|
|
| - // If there is currently no StyleResolver, we can't be sure that this attribute change won't affect style.
|
| + // If there is currently no StyleResolver, we can't be sure that this
|
| + // attribute change won't affect style.
|
| if (!document().styleResolver())
|
| setNeedsStyleRecalc(SubtreeStyleChange,
|
| StyleChangeReasonForTracing::fromAttribute(name));
|
| @@ -1477,7 +1486,8 @@ void Element::parserSetAttributes(const Vector<Attribute>& attributeVector) {
|
|
|
| parserDidSetAttributes();
|
|
|
| - // Use attributeVector instead of m_elementData because attributeChanged might modify m_elementData.
|
| + // Use attributeVector instead of m_elementData because attributeChanged might
|
| + // modify m_elementData.
|
| for (const auto& attribute : attributeVector)
|
| attributeChangedFromParserOrByCloning(attribute.name(), attribute.value(),
|
| ModifiedDirectly);
|
| @@ -1701,17 +1711,20 @@ void Element::detachLayoutTree(const AttachContext& context) {
|
| ElementRareData* data = elementRareData();
|
| data->clearPseudoElements();
|
|
|
| - // attachLayoutTree() will clear the computed style for us when inside recalcStyle.
|
| + // attachLayoutTree() will clear the computed style for us when inside
|
| + // recalcStyle.
|
| if (!document().inStyleRecalc())
|
| data->clearComputedStyle();
|
|
|
| if (ElementAnimations* elementAnimations = data->elementAnimations()) {
|
| if (context.performingReattach) {
|
| - // FIXME: We call detach from within style recalc, so compositingState is not up to date.
|
| + // FIXME: We call detach from within style recalc, so compositingState
|
| + // is not up to date.
|
| // https://code.google.com/p/chromium/issues/detail?id=339847
|
| DisableCompositingQueryAsserts disabler;
|
|
|
| - // FIXME: restart compositor animations rather than pull back to the main thread
|
| + // FIXME: restart compositor animations rather than pull back to the
|
| + // main thread
|
| elementAnimations->restartAnimationOnCompositor();
|
| } else {
|
| elementAnimations->cssAnimations().cancel();
|
| @@ -1790,8 +1803,9 @@ PassRefPtr<ComputedStyle> Element::styleForLayoutObject() {
|
|
|
| RefPtr<ComputedStyle> style;
|
|
|
| - // FIXME: Instead of clearing updates that may have been added from calls to styleForElement
|
| - // outside recalcStyle, we should just never set them if we're not inside recalcStyle.
|
| + // FIXME: Instead of clearing updates that may have been added from calls to
|
| + // styleForElement outside recalcStyle, we should just never set them if we're
|
| + // not inside recalcStyle.
|
| if (ElementAnimations* elementAnimations = this->elementAnimations())
|
| elementAnimations->cssAnimations().clearPendingUpdate();
|
|
|
| @@ -1849,7 +1863,8 @@ void Element::recalcStyle(StyleRecalcChange change, Text* nextTextSibling) {
|
| clearNeedsStyleRecalc();
|
| }
|
|
|
| - // If we reattached we don't need to recalc the style of our descendants anymore.
|
| + // If we reattached we don't need to recalc the style of our descendants
|
| + // anymore.
|
| if ((change >= UpdatePseudoElements && change < Reattach) ||
|
| childNeedsStyleRecalc()) {
|
| SelectorFilterParentScope filterScope(*this);
|
| @@ -1931,9 +1946,9 @@ StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) {
|
| }
|
|
|
| if (localChange == Reattach) {
|
| - // TODO(nainar): Remove the style parameter being passed into buildLayoutTree().
|
| - // ComputedStyle will now be stored on Node and accessed in buildLayoutTree()
|
| - // using mutableComputedStyle().
|
| + // TODO(nainar): Remove the style parameter being passed into
|
| + // buildLayoutTree(). ComputedStyle will now be stored on Node and accessed
|
| + // in buildLayoutTree() using mutableComputedStyle().
|
| return buildLayoutTree(*newStyle);
|
| }
|
|
|
| @@ -1948,8 +1963,9 @@ StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) {
|
| svgFilterNeedsLayerUpdate()) {
|
| layoutObject->setStyle(newStyle.get());
|
| } else {
|
| - // Although no change occurred, we use the new style so that the cousin style sharing code won't get
|
| - // fooled into believing this style is the same.
|
| + // Although no change occurred, we use the new style so that the cousin
|
| + // style sharing code won't get fooled into believing this style is the
|
| + // same.
|
| // FIXME: We may be able to remove this hack, see discussion in
|
| // https://codereview.chromium.org/30453002/
|
| layoutObject->setStyleInternal(newStyle.get());
|
| @@ -2323,8 +2339,9 @@ Attr* Element::setAttributeNode(Attr* attrNode,
|
| if (oldAttrNode == attrNode)
|
| return attrNode; // This Attr is already attached to the element.
|
|
|
| - // InUseAttributeError: Raised if node is an Attr that is already an attribute of another Element object.
|
| - // The DOM user must explicitly clone Attr nodes to re-use them in other elements.
|
| + // InUseAttributeError: Raised if node is an Attr that is already an attribute
|
| + // of another Element object. The DOM user must explicitly clone Attr nodes
|
| + // to re-use them in other elements.
|
| if (attrNode->ownerElement()) {
|
| exceptionState.throwDOMException(
|
| InUseAttributeError,
|
| @@ -2613,15 +2630,17 @@ void Element::updateFocusAppearance(
|
| if (!frame)
|
| return;
|
|
|
| - // When focusing an editable element in an iframe, don't reset the selection if it already contains a selection.
|
| + // When focusing an editable element in an iframe, don't reset the selection
|
| + // if it already contains a selection.
|
| if (this == frame->selection().rootEditableElement())
|
| return;
|
|
|
| // FIXME: We should restore the previous selection if there is one.
|
| VisibleSelection newSelection = createVisibleSelectionDeprecated(
|
| firstPositionInOrBeforeNode(this), TextAffinity::Downstream);
|
| - // Passing DoNotSetFocus as this function is called after FocusController::setFocusedElement()
|
| - // and we don't want to change the focus to a new Element.
|
| + // Passing DoNotSetFocus as this function is called after
|
| + // FocusController::setFocusedElement() and we don't want to change the
|
| + // focus to a new Element.
|
| frame->selection().setSelection(newSelection,
|
| FrameSelection::CloseTyping |
|
| FrameSelection::ClearTypingStyle |
|
| @@ -2650,7 +2669,8 @@ void Element::blur() {
|
|
|
| bool Element::supportsFocus() const {
|
| // FIXME: supportsFocus() can be called when layout is not up to date.
|
| - // Logic that deals with the layoutObject should be moved to layoutObjectIsFocusable().
|
| + // Logic that deals with the layoutObject should be moved to
|
| + // layoutObjectIsFocusable().
|
| // But supportsFocus must return true when the element is editable, or else
|
| // it won't be focusable. Furthermore, supportsFocus cannot just return true
|
| // always or else tabIndex() will change for all HTML elements.
|
| @@ -2666,7 +2686,8 @@ bool Element::supportsSpatialNavigationFocus() const {
|
| // for the element to be focusable, introduced by spatial navigation feature,
|
| // i.e. checks if click or keyboard event handler is specified.
|
| // This is the way to make it possible to navigate to (focus) elements
|
| - // which web designer meant for being active (made them respond to click events).
|
| + // which web designer meant for being active (made them respond to click
|
| + // events).
|
| if (!isSpatialNavigationEnabled(document().frame()) ||
|
| spatialNavigationIgnoresEventHandlers(document().frame()))
|
| return false;
|
| @@ -2960,7 +2981,8 @@ bool Element::hasProcessedPointerCapture(int pointerId) const {
|
| }
|
|
|
| String Element::innerText() {
|
| - // We need to update layout, since plainText uses line boxes in the layout tree.
|
| + // We need to update layout, since plainText uses line boxes in the layout
|
| + // tree.
|
| document().updateStyleAndLayoutIgnorePendingStylesheetsForNode(this);
|
|
|
| if (!layoutObject())
|
| @@ -3064,13 +3086,15 @@ const ComputedStyle* Element::ensureComputedStyle(
|
| return element->ensureComputedStyle();
|
|
|
| if (!inActiveDocument()) {
|
| - // FIXME: Try to do better than this. Ensure that styleForElement() works for elements that are not in the
|
| - // document tree and figure out when to destroy the computed style for such elements.
|
| + // FIXME: Try to do better than this. Ensure that styleForElement() works
|
| + // for elements that are not in the document tree and figure out when to
|
| + // destroy the computed style for such elements.
|
| return nullptr;
|
| }
|
|
|
| - // FIXME: Find and use the layoutObject from the pseudo element instead of the actual element so that the 'length'
|
| - // properties, which are only known by the layoutObject because it did the layout, will be correct and so that the
|
| + // FIXME: Find and use the layoutObject from the pseudo element instead of the
|
| + // actual element so that the 'length' properties, which are only known by the
|
| + // layoutObject because it did the layout, will be correct and so that the
|
| // values returned for the ":selection" pseudo-element will be correct.
|
| ComputedStyle* elementStyle = mutableComputedStyle();
|
| if (!elementStyle) {
|
| @@ -3100,7 +3124,8 @@ const ComputedStyle* Element::ensureComputedStyle(
|
| AtomicString Element::computeInheritedLanguage() const {
|
| const Node* n = this;
|
| AtomicString value;
|
| - // The language property is inherited, so we iterate over the parents to find the first language.
|
| + // The language property is inherited, so we iterate over the parents to find
|
| + // the first language.
|
| do {
|
| if (n->isElementNode()) {
|
| if (const ElementData* elementData = toElement(n)->elementData()) {
|
| @@ -3146,14 +3171,15 @@ void Element::updatePseudoElement(PseudoId pseudoId, StyleRecalcChange change) {
|
| if (element->needsStyleRecalc())
|
| layoutObject()->mutableStyle()->removeCachedPseudoStyle(pseudoId);
|
|
|
| - // PseudoElement styles hang off their parent element's style so if we needed
|
| - // a style recalc we should Force one on the pseudo.
|
| - // FIXME: We should figure out the right text sibling to pass.
|
| + // PseudoElement styles hang off their parent element's style so if we
|
| + // needed a style recalc we should Force one on the pseudo. FIXME: We
|
| + // should figure out the right text sibling to pass.
|
| element->recalcStyle(change == UpdatePseudoElements ? Force : change);
|
|
|
| - // Wait until our parent is not displayed or pseudoElementLayoutObjectIsNeeded
|
| - // is false, otherwise we could continuously create and destroy PseudoElements
|
| - // when LayoutObject::isChildAllowed on our parent returns false for the
|
| + // Wait until our parent is not displayed or
|
| + // pseudoElementLayoutObjectIsNeeded is false, otherwise we could
|
| + // continuously create and destroy PseudoElements when
|
| + // LayoutObject::isChildAllowed on our parent returns false for the
|
| // PseudoElement's layoutObject for each style recalc.
|
| if (!layoutObject() ||
|
| !pseudoElementLayoutObjectIsNeeded(
|
| @@ -3162,10 +3188,10 @@ void Element::updatePseudoElement(PseudoId pseudoId, StyleRecalcChange change) {
|
| } else if (pseudoId == PseudoIdFirstLetter && element &&
|
| change >= UpdatePseudoElements &&
|
| !FirstLetterPseudoElement::firstLetterTextLayoutObject(*element)) {
|
| - // This can happen if we change to a float, for example. We need to cleanup the
|
| - // first-letter pseudoElement and then fix the text of the original remaining
|
| - // text layoutObject.
|
| - // This can be seen in Test 7 of fast/css/first-letter-removed-added.html
|
| + // This can happen if we change to a float, for example. We need to cleanup
|
| + // the first-letter pseudoElement and then fix the text of the original
|
| + // remaining text layoutObject. This can be seen in Test 7 of
|
| + // fast/css/first-letter-removed-added.html
|
| elementRareData()->setPseudoElement(pseudoId, nullptr);
|
| } else if (change >= UpdatePseudoElements) {
|
| createPseudoElementIfNeeded(pseudoId);
|
| @@ -3198,7 +3224,8 @@ void Element::createPseudoElementIfNeeded(PseudoId pseudoId) {
|
| if (isPseudoElement())
|
| return;
|
|
|
| - // Document::ensureStyleResolver is not inlined and shows up on profiles, avoid it here.
|
| + // Document::ensureStyleResolver is not inlined and shows up on profiles,
|
| + // avoid it here.
|
| PseudoElement* element =
|
| document().styleEngine().ensureResolver().createPseudoElementIfNeeded(
|
| *this, pseudoId);
|
| @@ -3257,8 +3284,8 @@ DOMStringMap& Element::dataset() {
|
| }
|
|
|
| KURL Element::hrefURL() const {
|
| - // FIXME: These all have href() or url(), but no common super class. Why doesn't
|
| - // <link> implement URLUtils?
|
| + // FIXME: These all have href() or url(), but no common super class. Why
|
| + // doesn't <link> implement URLUtils?
|
| if (isHTMLAnchorElement(*this) || isHTMLAreaElement(*this) ||
|
| isHTMLLinkElement(*this))
|
| return getURLAttribute(hrefAttr);
|
| @@ -3359,8 +3386,9 @@ void Element::setIsInTopLayer(bool inTopLayer) {
|
| return;
|
| setElementFlag(IsInTopLayer, inTopLayer);
|
|
|
| - // We must ensure a reattach occurs so the layoutObject is inserted in the correct sibling order under LayoutView according to its
|
| - // top layer position, or in its usual place if not in the top layer.
|
| + // We must ensure a reattach occurs so the layoutObject is inserted in the
|
| + // correct sibling order under LayoutView according to its top layer position,
|
| + // or in its usual place if not in the top layer.
|
| lazyReattachIfAttached();
|
| }
|
|
|
| @@ -3522,7 +3550,8 @@ static bool needsURLResolutionForInlineStyle(const Element& element,
|
| if (!style)
|
| return false;
|
| for (unsigned i = 0; i < style->propertyCount(); ++i) {
|
| - // FIXME: Should handle all URL-based properties: CSSImageSetValue, CSSCursorImageValue, etc.
|
| + // FIXME: Should handle all URL-based properties: CSSImageSetValue,
|
| + // CSSCursorImageValue, etc.
|
| if (style->propertyAt(i).value().isImageValue())
|
| return true;
|
| }
|
| @@ -3533,7 +3562,8 @@ static void reResolveURLsInInlineStyle(const Document& document,
|
| MutableStylePropertySet& style) {
|
| for (unsigned i = 0; i < style.propertyCount(); ++i) {
|
| StylePropertySet::PropertyReference property = style.propertyAt(i);
|
| - // FIXME: Should handle all URL-based properties: CSSImageSetValue, CSSCursorImageValue, etc.
|
| + // FIXME: Should handle all URL-based properties: CSSImageSetValue,
|
| + // CSSCursorImageValue, etc.
|
| if (property.value().isImageValue())
|
| toCSSImageValue(property.value()).reResolveURL(document);
|
| }
|
| @@ -3679,15 +3709,18 @@ void Element::cloneAttributesFromElement(const Element& other) {
|
| if (!oldName.isNull() || !newName.isNull())
|
| updateName(oldName, newName);
|
|
|
| - // Quirks mode makes class and id not case sensitive. We can't share the ElementData
|
| - // if the idForStyleResolution and the className need different casing.
|
| + // Quirks mode makes class and id not case sensitive. We can't share the
|
| + // ElementData if the idForStyleResolution and the className need different
|
| + // casing.
|
| bool ownerDocumentsHaveDifferentCaseSensitivity = false;
|
| if (other.hasClass() || other.hasID())
|
| ownerDocumentsHaveDifferentCaseSensitivity =
|
| other.document().inQuirksMode() != document().inQuirksMode();
|
|
|
| - // If 'other' has a mutable ElementData, convert it to an immutable one so we can share it between both elements.
|
| - // We can only do this if there are no presentation attributes and sharing the data won't result in different case sensitivity of class or id.
|
| + // If 'other' has a mutable ElementData, convert it to an immutable one so we
|
| + // can share it between both elements.
|
| + // We can only do this if there are no presentation attributes and sharing the
|
| + // data won't result in different case sensitivity of class or id.
|
| if (other.m_elementData->isUnique() &&
|
| !ownerDocumentsHaveDifferentCaseSensitivity &&
|
| !other.m_elementData->presentationAttributeStyle())
|
| @@ -3769,12 +3802,13 @@ inline void Element::setInlineStyleFromString(
|
| DCHECK(isStyledElement());
|
| Member<StylePropertySet>& inlineStyle = elementData()->m_inlineStyle;
|
|
|
| - // Avoid redundant work if we're using shared attribute data with already parsed inline style.
|
| + // Avoid redundant work if we're using shared attribute data with already
|
| + // parsed inline style.
|
| if (inlineStyle && !elementData()->isUnique())
|
| return;
|
|
|
| - // We reconstruct the property set instead of mutating if there is no CSSOM wrapper.
|
| - // This makes wrapperless property sets immutable and so cacheable.
|
| + // We reconstruct the property set instead of mutating if there is no CSSOM
|
| + // wrapper. This makes wrapperless property sets immutable and so cacheable.
|
| if (inlineStyle && !inlineStyle->isMutable())
|
| inlineStyle.clear();
|
|
|
| @@ -3894,7 +3928,8 @@ void Element::removeAllInlineStyleProperties() {
|
|
|
| void Element::updatePresentationAttributeStyle() {
|
| synchronizeAllAttributes();
|
| - // ShareableElementData doesn't store presentation attribute style, so make sure we have a UniqueElementData.
|
| + // ShareableElementData doesn't store presentation attribute style, so make
|
| + // sure we have a UniqueElementData.
|
| UniqueElementData& elementData = ensureUniqueElementData();
|
| elementData.m_presentationAttributeStyleIsDirty = false;
|
| elementData.m_presentationAttributeStyle =
|
|
|