Skip to content

Commit

Permalink
Fix stylesheet ordering + Background implicit transparent
Browse files Browse the repository at this point in the history
JasonTheKitten committed Dec 4, 2024
1 parent 5a30a36 commit 6173276
Showing 10 changed files with 75 additions and 68 deletions.
Original file line number Diff line number Diff line change
@@ -23,8 +23,8 @@
import com.github.webicitybrowser.spec.css.parser.tokens.WhitespaceToken;
import com.github.webicitybrowser.spec.css.selectors.ComplexSelector;
import com.github.webicitybrowser.spec.css.selectors.ComplexSelectorPart;
import com.github.webicitybrowser.spec.css.selectors.SelectorOrderingTag;
import com.github.webicitybrowser.spec.css.selectors.SelectorSpecificity;
import com.github.webicitybrowser.spec.css.selectors.SelectorSpecificity.Source;

public class ComplexSelectorParser {

@@ -36,14 +36,14 @@ public class ComplexSelectorParser {

private final CombinatorParser combinatorParser = new CombinatorParser();

public ComplexSelector[] parseMany(TokenLike[] prelude, int order, Source source) {
public ComplexSelector[] parseMany(TokenLike[] prelude, int order, SelectorOrderingTag orderingTag) {
TokenStream stream = new TokenStreamImp(prelude);
List<ComplexSelector> selectors = new ArrayList<>();

while (!(stream.peek() instanceof EOFToken)) {
ComplexSelector complexSelector;
try {
complexSelector = consumeComplexSelector(stream, order, source);
complexSelector = consumeComplexSelector(stream, order, orderingTag);
if (complexSelector != null) {
selectors.add(complexSelector);
} else {
@@ -57,7 +57,7 @@ public ComplexSelector[] parseMany(TokenLike[] prelude, int order, Source source
return selectors.toArray(ComplexSelector[]::new);
}

private ComplexSelector consumeComplexSelector(TokenStream stream, int order, Source source) throws ParseFormatException {
private ComplexSelector consumeComplexSelector(TokenStream stream, int order, SelectorOrderingTag orderingTag) throws ParseFormatException {
List<ComplexSelectorPart> selectorParts = new ArrayList<>();

consumeWhitespace(stream);
@@ -77,7 +77,7 @@ private ComplexSelector consumeComplexSelector(TokenStream stream, int order, So

stream.read();

return createComplexSelectorFromParts(selectorParts, order, source);
return createComplexSelectorFromParts(selectorParts, order, orderingTag);
}

private void consumeSimpleSelectors(TokenStream stream, List<ComplexSelectorPart> selectorParts) throws ParseFormatException {
@@ -129,21 +129,11 @@ private void throwOutBadRule(TokenStream stream) {
while (!isSeperatingToken(stream.read()));
}

private ComplexSelector createComplexSelectorFromParts(List<ComplexSelectorPart> selectorParts, int order, Source source) {
private ComplexSelector createComplexSelectorFromParts(List<ComplexSelectorPart> selectorParts, int order, SelectorOrderingTag orderingTag) {
ComplexSelectorPart[] parts = selectorParts.toArray(ComplexSelectorPart[]::new);
SelectorSpecificity selectorSpecificity = SelectorSpecificityCalculator.calculateSpecificity(parts, order, source);
SelectorSpecificity selectorSpecificity = SelectorSpecificityCalculator.calculateSpecificity(parts, order, orderingTag);

return new ComplexSelector() {
@Override
public SelectorSpecificity getSpecificity() {
return selectorSpecificity;
}

@Override
public ComplexSelectorPart[] getParts() {
return parts;
}
};
return new ComplexSelector(parts, selectorSpecificity);
}

}
Original file line number Diff line number Diff line change
@@ -3,8 +3,8 @@
import java.util.function.Function;

import com.github.webicitybrowser.spec.css.selectors.ComplexSelectorPart;
import com.github.webicitybrowser.spec.css.selectors.SelectorOrderingTag;
import com.github.webicitybrowser.spec.css.selectors.SelectorSpecificity;
import com.github.webicitybrowser.spec.css.selectors.SelectorSpecificity.Source;
import com.github.webicitybrowser.spec.css.selectors.selector.AttributeSelector;
import com.github.webicitybrowser.spec.css.selectors.selector.IDSelector;
import com.github.webicitybrowser.spec.css.selectors.selector.TypeSelector;
@@ -13,12 +13,12 @@ public final class SelectorSpecificityCalculator {

private SelectorSpecificityCalculator() {}

public static SelectorSpecificity calculateSpecificity(ComplexSelectorPart[] parts, int order, Source source) {
public static SelectorSpecificity calculateSpecificity(ComplexSelectorPart[] parts, int order, SelectorOrderingTag orderingTag) {
int idCount = countSelectors(parts, selector -> selector instanceof IDSelector);
int attributeCount = countSelectors(parts, selector -> selector instanceof AttributeSelector);
int typeCount = countSelectors(parts, selector -> selector instanceof TypeSelector);

return new SelectorSpecificity(source, idCount, attributeCount, typeCount, order);
return new SelectorSpecificity(orderingTag.source(), idCount, attributeCount, typeCount, orderingTag.documentOrder(), order);
}

private static int countSelectors(ComplexSelectorPart[] parts, Function<ComplexSelectorPart, Boolean> filter) {
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package com.github.webicitybrowser.spec.css.selectors;

public interface ComplexSelector extends ComplexSelectorPart {

ComplexSelectorPart[] getParts();

SelectorSpecificity getSpecificity();
public record ComplexSelector(ComplexSelectorPart[] parts, SelectorSpecificity specificity) implements ComplexSelectorPart {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.github.webicitybrowser.spec.css.selectors;

import com.github.webicitybrowser.spec.css.selectors.SelectorSpecificity.Source;

// TODO: How will imported resources be handled?
public record SelectorOrderingTag(Source source, int documentOrder) {

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.github.webicitybrowser.spec.css.selectors;

public record SelectorSpecificity(Source source, int idSelectors, int attributeSelectors, int typeSelectors, int order) implements Comparable<SelectorSpecificity> {
public record SelectorSpecificity(Source source, int idSelectors, int attributeSelectors, int typeSelectors, int documentOrder, int order) implements Comparable<SelectorSpecificity> {

@Override
public int compareTo(SelectorSpecificity specificity) {
@@ -12,6 +12,8 @@ public int compareTo(SelectorSpecificity specificity) {
return attributeSelectors > specificity.attributeSelectors() ? 1 : -1;
} else if (typeSelectors != specificity.typeSelectors()) {
return typeSelectors > specificity.typeSelectors() ? 1 : -1;
} else if (documentOrder != specificity.documentOrder()) {
return documentOrder > specificity.documentOrder() ? 1 : -1;
} else if (order != specificity.order()) {
return order > specificity.order() ? 1 : -1;
} else {
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@
import com.github.webicitybrowser.spec.css.parser.tokens.WhitespaceToken;
import com.github.webicitybrowser.spec.css.selectors.ComplexSelector;
import com.github.webicitybrowser.spec.css.selectors.ComplexSelectorPart;
import com.github.webicitybrowser.spec.css.selectors.SelectorOrderingTag;
import com.github.webicitybrowser.spec.css.selectors.SelectorSpecificity.Source;
import com.github.webicitybrowser.spec.css.selectors.combinator.ChildCombinator;
import com.github.webicitybrowser.spec.css.selectors.combinator.DescendantCombinator;
@@ -27,6 +28,8 @@

public class ComplexSelectorParserTest {

private static final SelectorOrderingTag DEFAULT_ORDERING_TAG = new SelectorOrderingTag(Source.UA, 0);

private ComplexSelectorParser complexSelectorParser;

@BeforeEach
@@ -38,7 +41,7 @@ public void beforeEach() {
@DisplayName("Empty input returns no complex selectors")
public void emptyInputReturnsNoComplexSelectors() {
TokenLike[] tokens = new TokenLike[0];
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertArrayEquals(new ComplexSelector[0], selectors);
}

@@ -48,9 +51,9 @@ public void identTokenCreatesTypeSelector() {
TokenLike[] tokens = new TokenLike[] {
new IdentToken("hi")
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(1, selectors.length);
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(1, parts.length);
Assertions.assertInstanceOf(TypeSelector.class, parts[0]);
TypeSelector selector = (TypeSelector) parts[0];
@@ -63,7 +66,7 @@ public void twoSubsequentIdentTokensDiscarded() {
TokenLike[] tokens = new TokenLike[] {
new IdentToken("hi"), new IdentToken("hi")
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(0, selectors.length);
}

@@ -73,16 +76,16 @@ public void twoCommaDelimitedIdentTokensCreateTypeSelectors() {
TokenLike[] tokens = new TokenLike[] {
new IdentToken("hi"), new CommaToken(), new IdentToken("bye")
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(2, selectors.length);
{
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(1, parts.length);
Assertions.assertInstanceOf(TypeSelector.class, parts[0]);
TypeSelector selector = (TypeSelector) parts[0];
Assertions.assertEquals("hi", selector.getQualifiedName().getName());
} {
ComplexSelectorPart[] parts = selectors[1].getParts();
ComplexSelectorPart[] parts = selectors[1].parts();
Assertions.assertEquals(1, parts.length);
Assertions.assertInstanceOf(TypeSelector.class, parts[0]);
TypeSelector selector = (TypeSelector) parts[0];
@@ -96,9 +99,9 @@ public void identTokenWithWhitespaceCreatesTypeSelector() {
TokenLike[] tokens = new TokenLike[] {
new WhitespaceToken(), new IdentToken("hi"), new WhitespaceToken()
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(1, selectors.length);
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(1, parts.length);
Assertions.assertInstanceOf(TypeSelector.class, parts[0]);
TypeSelector selector = (TypeSelector) parts[0];
@@ -111,9 +114,9 @@ public void dotDelimTokenCreatesClassSelector() {
TokenLike[] tokens = new TokenLike[] {
new DelimToken('.'), new IdentToken("hi")
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(1, selectors.length);
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(1, parts.length);
Assertions.assertInstanceOf(AttributeSelector.class, parts[0]);
AttributeSelector selector = (AttributeSelector) parts[0];
@@ -126,9 +129,9 @@ public void poundDelimTokenCreatesIDSelector() {
TokenLike[] tokens = new TokenLike[] {
new HashToken("hi", HashTypeFlag.ID)
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(1, selectors.length);
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(1, parts.length);
Assertions.assertInstanceOf(IDSelector.class, parts[0]);
IDSelector selector = (IDSelector) parts[0];
@@ -141,9 +144,9 @@ public void colonCreatesPsuedoSelector() {
TokenLike[] tokens = new TokenLike[] {
new ColonToken(), new IdentToken("root")
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(1, selectors.length);
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(1, parts.length);
Assertions.assertInstanceOf(RootSelector.class, parts[0]);
}
@@ -154,9 +157,9 @@ public void leftSquareBracketTokenCreatesAttributeSelector() {
TokenLike[] tokens = new TokenLike[] {
new LSBracketToken(), new IdentToken("hi"), new RSBracketToken()
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(1, selectors.length);
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(1, parts.length);
Assertions.assertInstanceOf(AttributeSelector.class, parts[0]);
AttributeSelector selector = (AttributeSelector) parts[0];
@@ -169,9 +172,9 @@ public void twoSubsequentDotDelimTokensCreatesMultiClassSelector() {
TokenLike[] tokens = new TokenLike[] {
new DelimToken('.'), new IdentToken("hi"), new DelimToken('.'), new IdentToken("bye")
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(1, selectors.length);
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(2, parts.length);

Assertions.assertInstanceOf(AttributeSelector.class, parts[0]);
@@ -190,9 +193,9 @@ public void twoSubsequentLeftSquareBracketTokensCreatesMultiAttributeSelector()
new LSBracketToken(), new IdentToken("hi"), new RSBracketToken(),
new LSBracketToken(), new IdentToken("bye"), new RSBracketToken()
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(1, selectors.length);
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(2, parts.length);

Assertions.assertInstanceOf(AttributeSelector.class, parts[0]);
@@ -210,9 +213,9 @@ public void canParseComplexSelectorWithBasicCombinators() {
TokenLike[] tokens = new TokenLike[] {
new IdentToken("hi"), new DelimToken('>'), new IdentToken("bye")
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(1, selectors.length);
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(3, parts.length);

Assertions.assertInstanceOf(TypeSelector.class, parts[0]);
@@ -232,9 +235,9 @@ public void canParseComplexSelectorWithDescendantCombinator() {
TokenLike[] tokens = new TokenLike[] {
new IdentToken("hi"), new WhitespaceToken(), new IdentToken("bye")
};
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, Source.UA);
ComplexSelector[] selectors = complexSelectorParser.parseMany(tokens, 0, DEFAULT_ORDERING_TAG);
Assertions.assertEquals(1, selectors.length);
ComplexSelectorPart[] parts = selectors[0].getParts();
ComplexSelectorPart[] parts = selectors[0].parts();
Assertions.assertEquals(3, parts.length);

Assertions.assertInstanceOf(TypeSelector.class, parts[0]);
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.github.webicitybrowser.webicity.renderer.backend.html.cssom;

import com.github.webicitybrowser.spec.css.rule.CSSRuleList;
import com.github.webicitybrowser.spec.css.selectors.SelectorSpecificity.Source;
import com.github.webicitybrowser.spec.css.selectors.SelectorOrderingTag;
import com.github.webicitybrowser.webicity.renderer.backend.html.cssom.imp.CSSOMTreeGeneratorImp;

/**
@@ -15,7 +15,7 @@ public interface CSSOMTreeGenerator<T> {
* @param ruleList the {@link CSSRuleList} to create the {@link CSSOMTree} from
* @return the created {@link CSSOMTree}
*/
CSSOMTree<T, CSSRuleList> createCSSOMFor(CSSRuleList ruleList, Source source);
CSSOMTree<T, CSSRuleList> createCSSOMFor(CSSRuleList ruleList, SelectorOrderingTag orderingTag);

/**
* Creates a {@link CSSOMTreeGenerator} using the given {@link CSSOMFilterCreator}
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@
import com.github.webicitybrowser.spec.css.rule.QualifiedRule;
import com.github.webicitybrowser.spec.css.selectors.ComplexSelector;
import com.github.webicitybrowser.spec.css.selectors.ComplexSelectorPart;
import com.github.webicitybrowser.spec.css.selectors.SelectorSpecificity.Source;
import com.github.webicitybrowser.spec.css.selectors.SelectorOrderingTag;
import com.github.webicitybrowser.webicity.renderer.backend.html.cssom.CSSOMFilter;
import com.github.webicitybrowser.webicity.renderer.backend.html.cssom.CSSOMFilterCreator;
import com.github.webicitybrowser.webicity.renderer.backend.html.cssom.CSSOMNode;
@@ -28,29 +28,29 @@ public CSSOMTreeGeneratorImp(CSSOMFilterCreator<T> filterCreator) {
}

@Override
public CSSOMTree<T, CSSRuleList> createCSSOMFor(CSSRuleList ruleList, Source source) {
public CSSOMTree<T, CSSRuleList> createCSSOMFor(CSSRuleList ruleList, SelectorOrderingTag orderingTag) {
CSSOMNode<T, CSSRuleList> rootNode = CSSOMNode.create(null, null);
addRuleListToCSSOMNode(rootNode, ruleList, source);
addRuleListToCSSOMNode(rootNode, ruleList, orderingTag);

return CSSOMTree.create(rootNode);
}

private void addRuleListToCSSOMNode(CSSOMNode<T, CSSRuleList> rootNode, CSSRuleList ruleList, Source source) {
private void addRuleListToCSSOMNode(CSSOMNode<T, CSSRuleList> rootNode, CSSRuleList ruleList, SelectorOrderingTag orderingTag) {
for (int i = 0; i < ruleList.getLength(); i++) {
CSSRule rule = ruleList.getItem(i);
addCSSRuleToCSSOMNode(rootNode, rule, i, source);
addCSSRuleToCSSOMNode(rootNode, rule, i, orderingTag);
}
}

private void addCSSRuleToCSSOMNode(CSSOMNode<T, CSSRuleList> rootNode, CSSRule rule, int order, Source source) {
private void addCSSRuleToCSSOMNode(CSSOMNode<T, CSSRuleList> rootNode, CSSRule rule, int order, SelectorOrderingTag orderingTag) {
if (rule instanceof QualifiedRule qualifiedRule) {
addQualifiedRuleToCSSOMNode(rootNode, qualifiedRule, order, source);
addQualifiedRuleToCSSOMNode(rootNode, qualifiedRule, order, orderingTag);
}
}

private void addQualifiedRuleToCSSOMNode(CSSOMNode<T, CSSRuleList> rootNode, QualifiedRule rule, int order, Source source) {
private void addQualifiedRuleToCSSOMNode(CSSOMNode<T, CSSRuleList> rootNode, QualifiedRule rule, int order, SelectorOrderingTag orderingTag) {
TokenLike[] prelude = rule.prelude().toArray(TokenLike[]::new);
ComplexSelector[] selectors = new ComplexSelectorParser().parseMany(prelude, order, source);
ComplexSelector[] selectors = new ComplexSelectorParser().parseMany(prelude, order, orderingTag);
for (ComplexSelector selector: selectors) {
CSSOMNode<T, CSSRuleList> targetNode = getSelectedCSSOMNode(rootNode, selector);
CSSRuleList properties = createCSSRuleList(rule.value());
@@ -62,11 +62,11 @@ private CSSOMNode<T, CSSRuleList> getSelectedCSSOMNode(
CSSOMNode<T, CSSRuleList> rootNode, ComplexSelector selector
) {
CSSOMNode<T, CSSRuleList> current = rootNode;
for (ComplexSelectorPart complexSelectorPart: selector.getParts()) {
for (ComplexSelectorPart complexSelectorPart: selector.parts()) {
CSSOMFilter<T, CSSRuleList> filter = filterCreator.createFilterFor(complexSelectorPart);
current = current.createChild(filter, 0);
}
current.setSpecificity(selector.getSpecificity());
current.setSpecificity(selector.specificity());

return current;
}
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
import com.github.webicitybrowser.spec.css.parser.tokens.Token;
import com.github.webicitybrowser.spec.css.rule.CSSRule;
import com.github.webicitybrowser.spec.css.rule.CSSRuleList;
import com.github.webicitybrowser.spec.css.selectors.SelectorOrderingTag;
import com.github.webicitybrowser.spec.html.node.HTMLDocument;
import com.github.webicitybrowser.thready.drawing.core.text.CommonFontWeights;
import com.github.webicitybrowser.thready.drawing.core.text.FontDecoration;
@@ -102,8 +103,11 @@ private CSSRuleList loadUAStylesheet() {
private CSSOMTree<DocumentStyleGenerator, CSSRuleList>[] createCSSOMTrees(DocumentStyleSheetSet styleSheetSet) {
List<CSSOMTree<DocumentStyleGenerator, CSSRuleList>> cssomTrees = new ArrayList<>();
CSSOMTreeGenerator<DocumentStyleGenerator> binder = CSSOMTreeGenerator.create(CSSOMFilterCreator.create(node -> node.getDOMNode()));
for (CSSRuleListEntry ruleEntry: styleSheetSet.getRuleLists()) {
cssomTrees.add(binder.createCSSOMFor(ruleEntry.ruleList(), ruleEntry.source()));
List<CSSRuleListEntry> ruleLists = styleSheetSet.getRuleLists();
for (int i = 0; i < ruleLists.size(); i++) {
CSSRuleListEntry ruleEntry = ruleLists.get(i);
SelectorOrderingTag tag = new SelectorOrderingTag(ruleEntry.source(), i);
cssomTrees.add(binder.createCSSOMFor(ruleEntry.ruleList(), tag));
}

return cssomTrees.toArray(new CSSOMTree[0]);
Original file line number Diff line number Diff line change
@@ -8,6 +8,7 @@
import com.github.webicitybrowser.spec.css.property.background.BackgroundValue;
import com.github.webicitybrowser.spec.css.property.background.BackgroundValue.BackgroundLayer;
import com.github.webicitybrowser.spec.css.property.color.ColorValue;
import com.github.webicitybrowser.thready.color.Colors;
import com.github.webicitybrowser.thready.color.colors.RGBA8Color;
import com.github.webicitybrowser.thready.color.format.ColorFormat;
import com.github.webicitybrowser.thready.gui.directive.core.Directive;
@@ -28,11 +29,14 @@ public Directive[] translatePropertyValue(BackgroundValue value) {
List<Directive> directives = new ArrayList<>();

BackgroundLayer lastLayer = value.layer().get(value.layer().size() - 1);

if (lastLayer.color() != null) {
directives.add(BackgroundColorDirective.of(createColorFrom(lastLayer.color())));
} else {
directives.add(BackgroundColorDirective.of(Colors.TRANSPARENT));
}

return directives.toArray(new Directive[0]);
return directives.toArray(Directive[]::new);
}

@Override

0 comments on commit 6173276

Please sign in to comment.