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

Unified Diff: third_party/WebKit/Source/core/dom/Element.cpp

Issue 2450093005: Support display: contents for elements, first-line and first-letter pseudos. (Closed)
Patch Set: Support display: contents for elements, first-line and first-letter pseudos. Created 4 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/dom/Element.cpp
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index 24b75742fc9986422bbe76bbeb7380fefc21829f..87984872d478602c209f900a75c6850d94ead313 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -1527,7 +1527,8 @@ const AtomicString Element::imageSourceURL() const {
}
bool Element::layoutObjectIsNeeded(const ComputedStyle& style) {
- return style.display() != EDisplay::None;
+ return style.display() != EDisplay::None &&
+ style.display() != EDisplay::Contents;
}
LayoutObject* Element::createLayoutObject(const ComputedStyle& style) {
@@ -1665,9 +1666,20 @@ void Element::attachLayoutTree(const AttachContext& context) {
data->clearComputedStyle();
}
- if (!isSlotOrActiveInsertionPoint())
- LayoutTreeBuilderForElement(*this, context.resolvedStyle)
- .createLayoutObjectIfNeeded();
+ if (!isSlotOrActiveInsertionPoint()) {
+ LayoutTreeBuilderForElement builder(*this, context.resolvedStyle);
+ builder.createLayoutObjectIfNeeded();
+
+ // Persist the resolved style if we got to the point we needed to compute
+ // the style, and it was a display: contents style, since we need it for our
+ // children.
+ if (ComputedStyle* style = builder.resolvedStyle()) {
+ if (style->display() == EDisplay::Contents) {
+ DCHECK(!layoutObject());
+ storeDisplayContentsStyle(*style);
+ }
+ }
+ }
addCallbackSelectors();
@@ -2003,7 +2015,7 @@ StyleRecalcChange Element::rebuildLayoutTree() {
// sub-trees. At this point no child should need reattaching.
DCHECK(!childNeedsReattachLayoutTree());
- if (layoutObjectWillChange || layoutObject()) {
+ if (layoutObjectWillChange || layoutObject() || displayContentsStyle()) {
// nextTextSibling is passed on to recalcStyle from recalcDescendantStyles
// we can either traverse the current subtree from this node onwards
// or store it.
@@ -3133,6 +3145,22 @@ const ComputedStyle* Element::ensureComputedStyle(
return elementStyle->addCachedPseudoStyle(result.release());
}
+const ComputedStyle* Element::displayContentsStyle() const {
+ if (layoutObject() || !hasRareData())
+ return nullptr;
+
+ ComputedStyle* style = elementRareData()->computedStyle();
+ if (!style || style->display() != EDisplay::Contents)
+ return nullptr;
+
+ return style;
+}
+
+void Element::storeDisplayContentsStyle(ComputedStyle& style) {
+ DCHECK_EQ(style.display(), EDisplay::Contents);
+ ensureElementRareData().setComputedStyle(&style);
+}
+
AtomicString Element::computeInheritedLanguage() const {
const Node* n = this;
AtomicString value;

Powered by Google App Engine
This is Rietveld 408576698