Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(682)

Unified Diff: third_party/WebKit/Source/core/css/StylePropertySet.cpp

Issue 1405293012: [Variables] Enable get/setProperty and similar APIs from the CSSOM (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/css/StylePropertySet.cpp
diff --git a/third_party/WebKit/Source/core/css/StylePropertySet.cpp b/third_party/WebKit/Source/core/css/StylePropertySet.cpp
index 62200c2b375ab05ed69fe1f11569e1eacd91c292..e0eaf6b7ba7c5f72b5a65eae77c77bed7f827454 100644
--- a/third_party/WebKit/Source/core/css/StylePropertySet.cpp
+++ b/third_party/WebKit/Source/core/css/StylePropertySet.cpp
@@ -119,6 +119,21 @@ int ImmutableStylePropertySet::findPropertyIndex(CSSPropertyID propertyID) const
return -1;
}
+int ImmutableStylePropertySet::findCustomPropertyIndex(const AtomicString& propertyName) const
+{
+ // Convert here propertyID into an uint16_t to compare it with the metadata's m_propertyID to avoid
+ // the compiler converting it to an int multiple times in the loop.
+ const uint16_t variableId = static_cast<uint16_t>(CSSPropertyVariable);
+
+ for (int n = m_arraySize - 1 ; n >= 0; --n) {
+ if (metadataArray()[n].m_propertyID == variableId
+ && toCSSCustomPropertyDeclaration(valueArray()[n])->name() == propertyName)
+ return n;
+ }
+
+ return -1;
+}
+
DEFINE_TRACE_AFTER_DISPATCH(ImmutableStylePropertySet)
{
const RawPtrWillBeMember<CSSValue>* values = valueArray();
@@ -148,6 +163,12 @@ String StylePropertySet::getPropertyValue(CSSPropertyID propertyID) const
return StylePropertySerializer(*this).getPropertyValue(propertyID);
}
+String StylePropertySet::getCustomPropertyValue(const AtomicString& propertyName) const
+{
+ RefPtrWillBeRawPtr<CSSValue> value = getCustomPropertyCSSValue(propertyName);
+ return value ? value->cssText() : "";
+}
+
PassRefPtrWillBeRawPtr<CSSValue> StylePropertySet::getPropertyCSSValue(CSSPropertyID propertyID) const
{
int foundPropertyIndex = findPropertyIndex(propertyID);
@@ -156,6 +177,14 @@ PassRefPtrWillBeRawPtr<CSSValue> StylePropertySet::getPropertyCSSValue(CSSProper
return propertyAt(foundPropertyIndex).value();
}
+PassRefPtrWillBeRawPtr<CSSCustomPropertyDeclaration> StylePropertySet::getCustomPropertyCSSValue(const AtomicString& propertyName) const
+{
+ int foundPropertyIndex = findCustomPropertyIndex(propertyName);
+ if (foundPropertyIndex == -1)
+ return nullptr;
+ return toCSSCustomPropertyDeclaration(propertyAt(foundPropertyIndex).value());
+}
+
DEFINE_TRACE(StylePropertySet)
{
if (m_isMutable)
@@ -183,32 +212,43 @@ bool MutableStylePropertySet::removeShorthandProperty(CSSPropertyID propertyID)
return removePropertiesInSet(shorthand.properties(), shorthand.length());
}
-bool MutableStylePropertySet::removeProperty(CSSPropertyID propertyID, String* returnText)
+bool MutableStylePropertySet::removePropertyAtIndex(int propertyIndex, String* returnText)
{
- if (removeShorthandProperty(propertyID)) {
- // FIXME: Return an equivalent shorthand when possible.
- if (returnText)
- *returnText = "";
- return true;
- }
-
- int foundPropertyIndex = findPropertyIndex(propertyID);
- if (foundPropertyIndex == -1) {
+ if (propertyIndex == -1) {
if (returnText)
*returnText = "";
return false;
}
if (returnText)
- *returnText = propertyAt(foundPropertyIndex).value()->cssText();
+ *returnText = propertyAt(propertyIndex).value()->cssText();
// A more efficient removal strategy would involve marking entries as empty
// and sweeping them when the vector grows too big.
- m_propertyVector.remove(foundPropertyIndex);
+ m_propertyVector.remove(propertyIndex);
return true;
}
+bool MutableStylePropertySet::removeProperty(CSSPropertyID propertyID, String* returnText)
+{
+ if (removeShorthandProperty(propertyID)) {
+ // FIXME: Return an equivalent shorthand when possible.
+ if (returnText)
+ *returnText = "";
+ return true;
+ }
+
+ int foundPropertyIndex = findPropertyIndex(propertyID);
+ return removePropertyAtIndex(foundPropertyIndex, returnText);
+}
+
+bool MutableStylePropertySet::removeCustomProperty(const AtomicString& propertyName, String* returnText)
+{
+ int foundPropertyIndex = findCustomPropertyIndex(propertyName);
+ return removePropertyAtIndex(foundPropertyIndex, returnText);
+}
+
bool StylePropertySet::propertyIsImportant(CSSPropertyID propertyID) const
{
int foundPropertyIndex = findPropertyIndex(propertyID);
@@ -226,6 +266,14 @@ bool StylePropertySet::propertyIsImportant(CSSPropertyID propertyID) const
return true;
}
+bool StylePropertySet::customPropertyIsImportant(const AtomicString& propertyName) const
+{
+ int foundPropertyIndex = findCustomPropertyIndex(propertyName);
+ if (foundPropertyIndex != -1)
+ return propertyAt(foundPropertyIndex).isImportant();
+ return false;
+}
+
CSSPropertyID StylePropertySet::getPropertyShorthand(CSSPropertyID propertyID) const
{
int foundPropertyIndex = findPropertyIndex(propertyID);
@@ -254,6 +302,13 @@ bool MutableStylePropertySet::setProperty(CSSPropertyID unresolvedProperty, cons
return CSSParser::parseValue(this, unresolvedProperty, value, important, contextStyleSheet);
}
+bool MutableStylePropertySet::setCustomProperty(const AtomicString& propertyName, const String& value, bool important, StyleSheetContents* contextStyleSheet)
+{
+ if (value.isEmpty())
+ return removeCustomProperty(propertyName);
+ return CSSParser::parseValueForCustomProperty(this, propertyName, value, important, contextStyleSheet);
+}
+
void MutableStylePropertySet::setProperty(CSSPropertyID propertyID, PassRefPtrWillBeRawPtr<CSSValue> prpValue, bool important)
{
StylePropertyShorthand shorthand = shorthandForProperty(propertyID);
@@ -330,6 +385,7 @@ void MutableStylePropertySet::mergeAndOverrideOnConflict(const StylePropertySet*
unsigned size = other->propertyCount();
for (unsigned n = 0; n < size; ++n) {
PropertyReference toMerge = other->propertyAt(n);
+ // TODO(leviw): This probably doesn't work correctly with Custom Properties
CSSProperty* old = findCSSPropertyWithID(toMerge.id());
if (old)
setProperty(toMerge.toCSSProperty(), old);
@@ -386,6 +442,12 @@ bool MutableStylePropertySet::removePropertiesInSet(const CSSPropertyID* set, un
CSSProperty* MutableStylePropertySet::findCSSPropertyWithID(CSSPropertyID propertyID)
{
+ // TODO(leviw): Calling this with a custom property should probably assert, or this
+ // method should alternatively take a string used for custom properties and check it
+ // in that case.
+ if (propertyID == CSSPropertyVariable)
+ return nullptr;
+
int foundPropertyIndex = findPropertyIndex(propertyID);
if (foundPropertyIndex == -1)
return nullptr;
@@ -480,6 +542,26 @@ int MutableStylePropertySet::findPropertyIndex(CSSPropertyID propertyID) const
return (it == end) ? -1 : it - begin;
}
+int MutableStylePropertySet::findCustomPropertyIndex(const AtomicString& propertyName) const
+{
+ const CSSProperty* begin = m_propertyVector.data();
+ const CSSProperty* end = begin + m_propertyVector.size();
+ // Convert here propertyID into an uint16_t to compare it with the metadata's m_propertyID to avoid
+ // the compiler converting it to an int multiple times in the loop.
+ const uint16_t variableId = static_cast<uint16_t>(CSSPropertyVariable);
+
+ auto compare = [variableId, propertyName](const CSSProperty& property) -> bool {
+ if (property.metadata().m_propertyID == variableId) {
+ return toCSSCustomPropertyDeclaration(property.value())->name() == propertyName;
+ }
+ return false;
+ };
+
+ const CSSProperty* it = std::find_if(begin, end, compare);
+
+ return (it == end) ? -1 : it - begin;
+}
+
alancutter (OOO until 2018) 2015/11/17 07:10:42 The copy paste in this file is pretty unappealing.
leviw_travelin_and_unemployed 2015/11/17 07:23:44 If that saved us code duplication I'd agree. I'm n
alancutter (OOO until 2018) 2015/11/18 21:22:51 Explicit template specialisation isn't something I
DEFINE_TRACE_AFTER_DISPATCH(MutableStylePropertySet)
{
#if ENABLE(OILPAN)

Powered by Google App Engine
This is Rietveld 408576698