blob: 034baadfbdd408cdf7dd1f01382bcb1a0cb1699e [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/css/properties/longhands/variable.h"
#include "third_party/blink/renderer/core/css/css_custom_property_declaration.h"
#include "third_party/blink/renderer/core/css/property_registration.h"
#include "third_party/blink/renderer/core/css/property_registry.h"
#include "third_party/blink/renderer/core/style/computed_style.h"
namespace blink {
namespace {
void ApplyInitialValue(StyleResolverState& state,
const AtomicString& name,
const PropertyRegistration* registration) {
bool is_inherited_property = !registration || registration->Inherits();
state.Style()->RemoveVariable(name, is_inherited_property);
}
void ApplyInheritValue(StyleResolverState& state,
const AtomicString& name,
const PropertyRegistration* registration) {
bool is_inherited_property = !registration || registration->Inherits();
state.Style()->RemoveVariable(name, is_inherited_property);
CSSVariableData* parent_value =
state.ParentStyle()->GetVariable(name, is_inherited_property);
if (!parent_value)
return;
state.Style()->SetVariable(name, parent_value, is_inherited_property);
if (registration) {
const CSSValue* parent_css_value =
parent_value ? state.ParentStyle()->GetRegisteredVariable(
name, is_inherited_property)
: nullptr;
state.Style()->SetRegisteredVariable(name, parent_css_value,
is_inherited_property);
}
}
} // namespace
void Variable::ApplyValue(StyleResolverState& state,
const CSSValue& value) const {
const CSSCustomPropertyDeclaration& declaration =
ToCSSCustomPropertyDeclaration(value);
const AtomicString& name = declaration.GetName();
const PropertyRegistration* registration = nullptr;
const PropertyRegistry* registry = state.GetDocument().GetPropertyRegistry();
if (registry)
registration = registry->Registration(name);
bool is_inherited_property = !registration || registration->Inherits();
bool initial = declaration.IsInitial(is_inherited_property);
bool inherit = declaration.IsInherit(is_inherited_property);
DCHECK(!(initial && inherit));
// TODO(andruud): Use regular initial/inherit dispatch in StyleBuilder
// once custom properties are Ribbonized.
if (initial) {
ApplyInitialValue(state, name, registration);
} else if (inherit) {
ApplyInheritValue(state, name, registration);
} else {
state.Style()->SetVariable(name, declaration.Value(),
is_inherited_property);
if (registration && !declaration.Value()->NeedsVariableResolution()) {
const CSSValue* parsed_value = declaration.Value()->ParseForSyntax(
registration->Syntax(), state.GetDocument().GetSecureContextMode());
if (parsed_value) {
state.Style()->SetRegisteredVariable(name, parsed_value,
is_inherited_property);
} else if (is_inherited_property) {
ApplyInheritValue(state, name, registration);
} else {
ApplyInitialValue(state, name, registration);
}
}
}
}
} // namespace blink