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)) |