Chromium Code Reviews| 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 9034a842ff08eed765667e4d3dfa4a467b18e33b..d0439217f457a1e59aab37db2b125f00e88c0413 100644 |
| --- a/third_party/WebKit/Source/core/dom/Element.cpp |
| +++ b/third_party/WebKit/Source/core/dom/Element.cpp |
| @@ -1229,10 +1229,11 @@ inline void Element::attributeChangedFromParserOrByCloning(const QualifiedName& |
| } |
| template <typename CharacterType> |
| -static inline bool classStringHasClassName(const CharacterType* characters, unsigned length) |
| +static inline bool classStringHasClassName(const CharacterType* characters, unsigned length, bool& isWhiteSpaceOnly) |
|
tkent
2015/10/08 23:20:12
We should introduce an enum, and this function sho
|
| { |
| ASSERT(length > 0); |
| + isWhiteSpaceOnly = false; |
| unsigned i = 0; |
| do { |
| if (isNotHTMLSpace<CharacterType>(characters[i])) |
| @@ -1240,10 +1241,13 @@ static inline bool classStringHasClassName(const CharacterType* characters, unsi |
| ++i; |
| } while (i < length); |
| + if (i == length) |
| + isWhiteSpaceOnly = true; |
| + |
| return i < length; |
| } |
| -static inline bool classStringHasClassName(const AtomicString& newClassString) |
| +static inline bool classStringHasClassName(const AtomicString& newClassString, bool& isWhiteSpaceOnly) |
| { |
| unsigned length = newClassString.length(); |
| @@ -1251,8 +1255,8 @@ static inline bool classStringHasClassName(const AtomicString& newClassString) |
| return false; |
| if (newClassString.is8Bit()) |
| - return classStringHasClassName(newClassString.characters8(), length); |
| - return classStringHasClassName(newClassString.characters16(), length); |
| + return classStringHasClassName(newClassString.characters8(), length, isWhiteSpaceOnly); |
| + return classStringHasClassName(newClassString.characters16(), length, isWhiteSpaceOnly); |
| } |
| void Element::classAttributeChanged(const AtomicString& newClassString) |
| @@ -1261,8 +1265,10 @@ void Element::classAttributeChanged(const AtomicString& newClassString) |
| bool testShouldInvalidateStyle = inActiveDocument() && styleResolver && styleChangeType() < SubtreeStyleChange; |
| ASSERT(elementData()); |
| - if (classStringHasClassName(newClassString)) { |
| - const bool shouldFoldCase = document().inQuirksMode(); |
| + |
| + bool isWhiteSpaceOnlyClassname; |
|
tkent
2015/10/08 23:20:12
This variable needs to be initialized, or classStr
|
| + const bool shouldFoldCase = document().inQuirksMode(); |
| + if (classStringHasClassName(newClassString, isWhiteSpaceOnlyClassname)) { |
| const SpaceSplitString oldClasses = elementData()->classNames(); |
| elementData()->setClass(newClassString, shouldFoldCase); |
| const SpaceSplitString& newClasses = elementData()->classNames(); |
| @@ -1272,7 +1278,10 @@ void Element::classAttributeChanged(const AtomicString& newClassString) |
| const SpaceSplitString& oldClasses = elementData()->classNames(); |
| if (testShouldInvalidateStyle) |
| document().styleEngine().classChangedForElement(oldClasses, *this); |
| - elementData()->clearClass(); |
| + if (isWhiteSpaceOnlyClassname) |
| + elementData()->setClass(newClassString, shouldFoldCase); |
| + else |
| + elementData()->clearClass(); |
| } |
| if (hasRareData()) |
| @@ -1297,7 +1306,8 @@ bool Element::shouldInvalidateDistributionWhenAttributeChanged(ElementShadow* el |
| if (name == HTMLNames::classAttr) { |
| const AtomicString& newClassString = newValue; |
| - if (classStringHasClassName(newClassString)) { |
| + bool isWhiteSpaceOnlyClassname; |
| + if (classStringHasClassName(newClassString, isWhiteSpaceOnlyClassname)) { |
| const SpaceSplitString& oldClasses = elementData()->classNames(); |
| const SpaceSplitString newClasses(newClassString, document().inQuirksMode() ? SpaceSplitString::ShouldFoldCase : SpaceSplitString::ShouldNotFoldCase); |
| if (featureSet.checkSelectorsForClassChange(oldClasses, newClasses)) |