DOMCSSRegisterCustomProperty.cpp [plain text]
#include "config.h"
#include "DOMCSSRegisterCustomProperty.h"
#include "CSSCustomPropertyValue.h"
#include "CSSPropertyNames.h"
#include "CSSPropertyParser.h"
#include "CSSRegisteredCustomProperty.h"
#include "CSSTokenizer.h"
#include "DOMCSSNamespace.h"
#include "Document.h"
#include "StyleBuilderConverter.h"
#include <wtf/text/WTFString.h>
namespace WebCore {
ExceptionOr<void> DOMCSSRegisterCustomProperty::registerProperty(Document& document, const DOMCSSCustomPropertyDescriptor& descriptor)
{
if (!isCustomPropertyName(descriptor.name))
return Exception { SyntaxError, "The name of this property is not a custom property name." };
RefPtr<CSSCustomPropertyValue> initialValue;
if (!descriptor.initialValue.isEmpty()) {
CSSTokenizer tokenizer(descriptor.initialValue);
StyleResolver styleResolver(document);
styleResolver.applyPropertyToStyle(CSSPropertyInvalid, nullptr, styleResolver.defaultStyleForElement());
styleResolver.updateFont();
HashSet<CSSPropertyID> dependencies;
CSSPropertyParser::collectParsedCustomPropertyValueDependencies(descriptor.syntax, false, dependencies, tokenizer.tokenRange(), strictCSSParserContext());
if (!dependencies.isEmpty())
return Exception { SyntaxError, "The given initial value must be computationally independent." };
initialValue = CSSPropertyParser::parseTypedCustomPropertyValue(descriptor.name, descriptor.syntax, tokenizer.tokenRange(), styleResolver, strictCSSParserContext());
if (!initialValue || !initialValue->isResolved())
return Exception { SyntaxError, "The given initial value does not parse for the given syntax." };
initialValue->collectDirectComputationalDependencies(dependencies);
initialValue->collectDirectRootComputationalDependencies(dependencies);
if (!dependencies.isEmpty())
return Exception { SyntaxError, "The given initial value must be computationally independent." };
}
CSSRegisteredCustomProperty property { descriptor.name, descriptor.syntax, descriptor.inherits, WTFMove(initialValue) };
if (!document.registerCSSProperty(WTFMove(property)))
return Exception { InvalidModificationError, "This property has already been registered." };
document.styleScope().didChangeStyleSheetEnvironment();
return { };
}
DOMCSSRegisterCustomProperty* DOMCSSRegisterCustomProperty::from(DOMCSSNamespace& css)
{
auto* supplement = static_cast<DOMCSSRegisterCustomProperty*>(Supplement<DOMCSSNamespace>::from(&css, supplementName()));
if (!supplement) {
auto newSupplement = std::make_unique<DOMCSSRegisterCustomProperty>(css);
supplement = newSupplement.get();
provideTo(&css, supplementName(), WTFMove(newSupplement));
}
return supplement;
}
const char* DOMCSSRegisterCustomProperty::supplementName()
{
return "DOMCSSRegisterCustomProperty";
}
}