Diff
Modified: trunk/Source/WebCore/ChangeLog (223499 => 223500)
--- trunk/Source/WebCore/ChangeLog 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/ChangeLog 2017-10-17 09:21:05 UTC (rev 223500)
@@ -1,3 +1,63 @@
+2017-10-17 Antti Koivisto <[email protected]>
+
+ Resolve ::before and ::after pseudo elements during style resolution
+ https://bugs.webkit.org/show_bug.cgi?id=178339
+
+ Reviewed by Ryosuke Niwa.
+
+ They are currently resolved during render tree building which creates problems with display:contents and animations.
+
+ * dom/PseudoElement.cpp:
+ (WebCore::PseudoElement::PseudoElement):
+
+ Call InspectorInstrumentation from constructor.
+
+ * style/RenderTreeUpdater.cpp:
+ (WebCore::RenderTreeUpdater::Parent::Parent):
+ (WebCore::RenderTreeUpdater::updateRenderTree):
+ (WebCore::RenderTreeUpdater::pushParent):
+
+ Push the full update to the parent stack.
+
+ (WebCore::RenderTreeUpdater::popParent):
+ (WebCore::RenderTreeUpdater::updateBeforeDescendants):
+ (WebCore::RenderTreeUpdater::updateAfterDescendants):
+ (WebCore::RenderTreeUpdater::invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded):
+ * style/RenderTreeUpdater.h:
+ * style/RenderTreeUpdaterGeneratedContent.cpp:
+ (WebCore::RenderTreeUpdater::GeneratedContent::updatePseudoElement):
+
+ No need to resolve pseudo style, we have it already.
+
+ (WebCore::RenderTreeUpdater::GeneratedContent::needsPseudoElement):
+ (WebCore::RenderTreeUpdater::GeneratedContent::updateBeforePseudoElement): Deleted.
+ (WebCore::RenderTreeUpdater::GeneratedContent::updateAfterPseudoElement): Deleted.
+ * style/RenderTreeUpdaterGeneratedContent.h:
+ * style/StyleTreeResolver.cpp:
+ (WebCore::Style::TreeResolver::resolveElement):
+ (WebCore::Style::TreeResolver::resolvePseudoStyle):
+
+ Resolve pseudos.
+
+ (WebCore::Style::TreeResolver::createAnimatedElementUpdate):
+
+ Make a private member function.
+
+ (WebCore::Style::TreeResolver::resolveComposedTree):
+ * style/StyleTreeResolver.h:
+ * style/StyleUpdate.cpp:
+ (WebCore::Style::Update::elementUpdates const):
+ (WebCore::Style::Update::elementUpdates):
+
+ Bundle the style update for an element and the associated before/after pseudos.
+
+ (WebCore::Style::Update::elementStyle const):
+ (WebCore::Style::Update::elementStyle):
+ (WebCore::Style::Update::addElement):
+ (WebCore::Style::Update::elementUpdate const): Deleted.
+ (WebCore::Style::Update::elementUpdate): Deleted.
+ * style/StyleUpdate.h:
+
2017-10-17 Keith Miller <[email protected]>
Change WebCore sources to work with unified source builds
Modified: trunk/Source/WebCore/dom/PseudoElement.cpp (223499 => 223500)
--- trunk/Source/WebCore/dom/PseudoElement.cpp 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/dom/PseudoElement.cpp 2017-10-17 09:21:05 UTC (rev 223500)
@@ -28,6 +28,7 @@
#include "config.h"
#include "PseudoElement.h"
+#include "CSSAnimationController.h"
#include "ContentData.h"
#include "InspectorInstrumentation.h"
#include "RenderElement.h"
@@ -71,10 +72,22 @@
ASSERT(!m_hostElement);
}
+Ref<PseudoElement> PseudoElement::create(Element& host, PseudoId pseudoId)
+{
+ auto pseudoElement = adoptRef(*new PseudoElement(host, pseudoId));
+
+ InspectorInstrumentation::pseudoElementCreated(host.document().page(), pseudoElement.get());
+
+ return pseudoElement;
+}
+
void PseudoElement::clearHostElement()
{
InspectorInstrumentation::pseudoElementDestroyed(document().page(), *this);
+ if (auto* frame = document().frame())
+ frame->animation().cancelAnimations(*this);
+
m_hostElement = nullptr;
}
Modified: trunk/Source/WebCore/dom/PseudoElement.h (223499 => 223500)
--- trunk/Source/WebCore/dom/PseudoElement.h 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/dom/PseudoElement.h 2017-10-17 09:21:05 UTC (rev 223500)
@@ -33,10 +33,7 @@
class PseudoElement final : public Element {
public:
- static Ref<PseudoElement> create(Element& host, PseudoId pseudoId)
- {
- return adoptRef(*new PseudoElement(host, pseudoId));
- }
+ static Ref<PseudoElement> create(Element& host, PseudoId);
virtual ~PseudoElement();
Element* hostElement() const { return m_hostElement; }
Modified: trunk/Source/WebCore/style/RenderTreeUpdater.cpp (223499 => 223500)
--- trunk/Source/WebCore/style/RenderTreeUpdater.cpp 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/style/RenderTreeUpdater.cpp 2017-10-17 09:21:05 UTC (rev 223500)
@@ -74,9 +74,9 @@
{
}
-RenderTreeUpdater::Parent::Parent(Element& element, Style::Change styleChange)
+RenderTreeUpdater::Parent::Parent(Element& element, const Style::ElementUpdates* updates)
: element(&element)
- , styleChange(styleChange)
+ , updates(updates)
, renderTreePosition(element.renderer() ? std::make_optional(RenderTreePosition(*element.renderer())) : std::nullopt)
{
}
@@ -175,7 +175,7 @@
if (is<Text>(node)) {
auto& text = downcast<Text>(node);
auto* textUpdate = m_styleUpdate->textUpdate(text);
- if (parent().styleChange == Style::Detach || textUpdate || m_invalidatedWhitespaceOnlyTextSiblings.contains(&text))
+ if ((parent().updates && parent().updates->update.change == Style::Detach) || textUpdate || m_invalidatedWhitespaceOnlyTextSiblings.contains(&text))
updateTextRenderer(text, textUpdate);
it.traverseNextSkippingChildren();
@@ -184,17 +184,17 @@
auto& element = downcast<Element>(node);
- auto* elementUpdate = m_styleUpdate->elementUpdate(element);
+ auto* elementUpdates = m_styleUpdate->elementUpdates(element);
// We hop through display: contents elements in findRenderingRoot, so
// there may be other updates down the tree.
- if (!elementUpdate && !element.hasDisplayContents()) {
+ if (!elementUpdates && !element.hasDisplayContents()) {
it.traverseNextSkippingChildren();
continue;
}
- if (elementUpdate)
- updateElementRenderer(element, *elementUpdate);
+ if (elementUpdates)
+ updateElementRenderer(element, elementUpdates->update);
bool mayHaveRenderedDescendants = element.renderer() || (element.hasDisplayContents() && shouldCreateRenderer(element, renderTreePosition().parent()));
if (!mayHaveRenderedDescendants) {
@@ -202,7 +202,7 @@
continue;
}
- pushParent(element, elementUpdate ? elementUpdate->change : Style::NoChange);
+ pushParent(element, elementUpdates);
it.traverseNext();
}
@@ -222,11 +222,11 @@
return *m_parentStack.last().renderTreePosition;
}
-void RenderTreeUpdater::pushParent(Element& element, Style::Change changeType)
+void RenderTreeUpdater::pushParent(Element& element, const Style::ElementUpdates* updates)
{
- m_parentStack.append(Parent(element, changeType));
+ m_parentStack.append(Parent(element, updates));
- updateBeforeDescendants(element);
+ updateBeforeDescendants(element, updates);
}
void RenderTreeUpdater::popParent()
@@ -233,7 +233,7 @@
{
auto& parent = m_parentStack.last();
if (parent.element)
- updateAfterDescendants(*parent.element, parent.styleChange);
+ updateAfterDescendants(*parent.element, parent.updates);
m_parentStack.removeLast();
}
@@ -246,14 +246,16 @@
popParent();
}
-void RenderTreeUpdater::updateBeforeDescendants(Element& element)
+void RenderTreeUpdater::updateBeforeDescendants(Element& element, const Style::ElementUpdates* updates)
{
- generatedContent().updateBeforePseudoElement(element);
+ if (updates)
+ generatedContent().updatePseudoElement(element, updates->beforePseudoElementUpdate, BEFORE);
}
-void RenderTreeUpdater::updateAfterDescendants(Element& element, Style::Change styleChange)
+void RenderTreeUpdater::updateAfterDescendants(Element& element, const Style::ElementUpdates* updates)
{
- generatedContent().updateAfterPseudoElement(element);
+ if (updates)
+ generatedContent().updatePseudoElement(element, updates->afterPseudoElementUpdate, AFTER);
auto* renderer = element.renderer();
if (!renderer)
@@ -267,7 +269,7 @@
if (is<RenderBlockFlow>(*renderer))
MultiColumn::update(downcast<RenderBlockFlow>(*renderer));
- if (element.hasCustomStyleResolveCallbacks() && styleChange == Style::Detach)
+ if (element.hasCustomStyleResolveCallbacks() && updates && updates->update.change == Style::Detach)
element.didAttachRenderers();
}
@@ -470,7 +472,7 @@
// the current node gaining or losing the renderer. This can only affect white space text nodes.
for (Node* sibling = current.nextSibling(); sibling; sibling = sibling->nextSibling()) {
if (is<Element>(*sibling)) {
- if (m_styleUpdate->elementUpdate(downcast<Element>(*sibling)))
+ if (m_styleUpdate->elementUpdates(downcast<Element>(*sibling)))
return;
// Text renderers beyond rendered elements can't be affected.
if (sibling->renderer())
Modified: trunk/Source/WebCore/style/RenderTreeUpdater.h (223499 => 223500)
--- trunk/Source/WebCore/style/RenderTreeUpdater.h 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/style/RenderTreeUpdater.h 2017-10-17 09:21:05 UTC (rev 223500)
@@ -62,16 +62,16 @@
void updateElementRenderer(Element&, const Style::ElementUpdate&);
void createRenderer(Element&, RenderStyle&&);
void invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(Node&);
- void updateBeforeDescendants(Element&);
- void updateAfterDescendants(Element&, Style::Change);
+ void updateBeforeDescendants(Element&, const Style::ElementUpdates*);
+ void updateAfterDescendants(Element&, const Style::ElementUpdates*);
struct Parent {
Element* element { nullptr };
- Style::Change styleChange { Style::NoChange };
+ const Style::ElementUpdates* updates { nullptr };
std::optional<RenderTreePosition> renderTreePosition;
Parent(ContainerNode& root);
- Parent(Element&, Style::Change);
+ Parent(Element&, const Style::ElementUpdates*);
};
Parent& parent() { return m_parentStack.last(); }
RenderTreePosition& renderTreePosition();
@@ -78,7 +78,7 @@
GeneratedContent& generatedContent() { return *m_generatedContent; }
- void pushParent(Element&, Style::Change);
+ void pushParent(Element&, const Style::ElementUpdates*);
void popParent();
void popParentsToDepth(unsigned depth);
Modified: trunk/Source/WebCore/style/RenderTreeUpdaterGeneratedContent.cpp (223499 => 223500)
--- trunk/Source/WebCore/style/RenderTreeUpdaterGeneratedContent.cpp 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/style/RenderTreeUpdaterGeneratedContent.cpp 2017-10-17 09:21:05 UTC (rev 223500)
@@ -44,16 +44,6 @@
{
}
-void RenderTreeUpdater::GeneratedContent::updateBeforePseudoElement(Element& element)
-{
- updatePseudoElement(element, BEFORE);
-}
-
-void RenderTreeUpdater::GeneratedContent::updateAfterPseudoElement(Element& element)
-{
- updatePseudoElement(element, AFTER);
-}
-
void RenderTreeUpdater::GeneratedContent::updateRemainingQuotes()
{
if (!m_updater.renderView().hasQuotesNeedingUpdate())
@@ -102,7 +92,7 @@
}
}
-void RenderTreeUpdater::GeneratedContent::updatePseudoElement(Element& current, PseudoId pseudoId)
+void RenderTreeUpdater::GeneratedContent::updatePseudoElement(Element& current, const std::optional<Style::ElementUpdate>& update, PseudoId pseudoId)
{
PseudoElement* pseudoElement = pseudoId == BEFORE ? current.beforePseudoElement() : current.afterPseudoElement();
@@ -109,7 +99,7 @@
if (auto* renderer = pseudoElement ? pseudoElement->renderer() : nullptr)
m_updater.renderTreePosition().invalidateNextSibling(*renderer);
- if (!needsPseudoElement(current, pseudoId)) {
+ if (!needsPseudoElement(current, update)) {
if (pseudoElement) {
if (pseudoId == BEFORE)
current.clearBeforePseudoElement();
@@ -125,15 +115,10 @@
pseudoElement = newPseudoElement.get();
}
- auto newStyle = RenderStyle::clonePtr(*current.renderer()->getCachedPseudoStyle(pseudoId, ¤t.renderer()->style()));
-
- auto elementUpdate = Style::TreeResolver::createAnimatedElementUpdate(WTFMove(newStyle), *pseudoElement, Style::NoChange);
-
- if (elementUpdate.change == Style::NoChange)
+ if (update->change == Style::NoChange)
return;
if (newPseudoElement) {
- InspectorInstrumentation::pseudoElementCreated(m_updater.m_document.page(), *newPseudoElement);
if (pseudoId == BEFORE)
current.setBeforePseudoElement(newPseudoElement.releaseNonNull());
else
@@ -140,13 +125,13 @@
current.setAfterPseudoElement(newPseudoElement.releaseNonNull());
}
- m_updater.updateElementRenderer(*pseudoElement, elementUpdate);
+ m_updater.updateElementRenderer(*pseudoElement, *update);
auto* pseudoRenderer = pseudoElement->renderer();
if (!pseudoRenderer)
return;
- if (elementUpdate.change == Style::Detach)
+ if (update->change == Style::Detach)
createContentRenderers(*pseudoRenderer);
else
updateStyleForContentRenderers(*pseudoRenderer);
@@ -159,14 +144,15 @@
ListItem::updateMarker(downcast<RenderListItem>(*pseudoRenderer));
}
-bool RenderTreeUpdater::GeneratedContent::needsPseudoElement(Element& current, PseudoId pseudoId)
+bool RenderTreeUpdater::GeneratedContent::needsPseudoElement(Element& current, const std::optional<Style::ElementUpdate>& update)
{
+ ASSERT(!current.isPseudoElement());
+ if (!update)
+ return false;
if (!current.renderer() || !current.renderer()->canHaveGeneratedChildren())
return false;
- if (current.isPseudoElement())
+ if (!pseudoElementRendererIsNeeded(update->style.get()))
return false;
- if (!pseudoElementRendererIsNeeded(current.renderer()->getCachedPseudoStyle(pseudoId)))
- return false;
return true;
}
Modified: trunk/Source/WebCore/style/RenderTreeUpdaterGeneratedContent.h (223499 => 223500)
--- trunk/Source/WebCore/style/RenderTreeUpdaterGeneratedContent.h 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/style/RenderTreeUpdaterGeneratedContent.h 2017-10-17 09:21:05 UTC (rev 223500)
@@ -37,15 +37,13 @@
public:
GeneratedContent(RenderTreeUpdater&);
- void updateBeforePseudoElement(Element&);
- void updateAfterPseudoElement(Element&);
+ void updatePseudoElement(Element&, const std::optional<Style::ElementUpdate>&, PseudoId);
void updateRemainingQuotes();
private:
- void updatePseudoElement(Element&, PseudoId);
void updateQuotesUpTo(RenderQuote*);
- static bool needsPseudoElement(Element&, PseudoId);
+ static bool needsPseudoElement(Element&, const std::optional<Style::ElementUpdate>&);
RenderTreeUpdater& m_updater;
RenderQuote* m_previousUpdatedQuote { nullptr };
Modified: trunk/Source/WebCore/style/StyleTreeResolver.cpp (223499 => 223500)
--- trunk/Source/WebCore/style/StyleTreeResolver.cpp 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/style/StyleTreeResolver.cpp 2017-10-17 09:21:05 UTC (rev 223500)
@@ -174,7 +174,7 @@
return nullptr;
}
-ElementUpdate TreeResolver::resolveElement(Element& element)
+ElementUpdates TreeResolver::resolveElement(Element& element)
{
if (m_didSeePendingStylesheet && !element.renderer() && !m_document.isIgnoringPendingStylesheets()) {
m_document.setHasNodesWithMissingStyle();
@@ -218,9 +218,31 @@
update.change = Detach;
}
- return update;
+ auto beforeUpdate = resolvePseudoStyle(element, update, BEFORE);
+ auto afterUpdate = resolvePseudoStyle(element, update, AFTER);
+
+ return { WTFMove(update), WTFMove(beforeUpdate), WTFMove(afterUpdate) };
}
+ElementUpdate TreeResolver::resolvePseudoStyle(Element& element, const ElementUpdate& elementUpdate, PseudoId pseudoId)
+{
+ if (!elementUpdate.style->hasPseudoStyle(pseudoId))
+ return { };
+ auto pseudoStyle = scope().styleResolver.pseudoStyleForElement(element, { pseudoId }, *elementUpdate.style);
+
+ PseudoElement* pseudoElement = pseudoId == BEFORE ? element.beforePseudoElement() : element.afterPseudoElement();
+ if (!pseudoElement) {
+ auto newPseudoElement = PseudoElement::create(element, pseudoId);
+ pseudoElement = newPseudoElement.ptr();
+ if (pseudoId == BEFORE)
+ element.setBeforePseudoElement(WTFMove(newPseudoElement));
+ else
+ element.setAfterPseudoElement(WTFMove(newPseudoElement));
+ }
+
+ return createAnimatedElementUpdate(WTFMove(pseudoStyle), *pseudoElement, elementUpdate.change);
+}
+
const RenderStyle* TreeResolver::parentBoxStyle() const
{
// 'display: contents' doesn't generate boxes.
@@ -237,7 +259,7 @@
ElementUpdate TreeResolver::createAnimatedElementUpdate(std::unique_ptr<RenderStyle> newStyle, Element& element, Change parentChange)
{
- auto& animationController = element.document().frame()->animation();
+ auto& animationController = m_document.frame()->animation();
auto* oldStyle = renderOrDisplayContentsStyle(element);
auto animationUpdate = animationController.updateAnimations(element, *newStyle, oldStyle);
@@ -408,19 +430,19 @@
if (element.hasCustomStyleResolveCallbacks())
element.willRecalcStyle(parent.change);
- auto elementUpdate = resolveElement(element);
+ auto elementUpdates = resolveElement(element);
if (element.hasCustomStyleResolveCallbacks())
- element.didRecalcStyle(elementUpdate.change);
+ element.didRecalcStyle(elementUpdates.update.change);
- style = elementUpdate.style.get();
- change = elementUpdate.change;
+ style = elementUpdates.update.style.get();
+ change = elementUpdates.update.change;
if (affectedByPreviousSibling && change != Detach)
change = Force;
- if (elementUpdate.style)
- m_update->addElement(element, parent.element, WTFMove(elementUpdate));
+ if (elementUpdates.update.style)
+ m_update->addElement(element, parent.element, WTFMove(elementUpdates));
clearNeedsStyleResolution(element);
}
Modified: trunk/Source/WebCore/style/StyleTreeResolver.h (223499 => 223500)
--- trunk/Source/WebCore/style/StyleTreeResolver.h 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/style/StyleTreeResolver.h 2017-10-17 09:21:05 UTC (rev 223500)
@@ -51,13 +51,13 @@
std::unique_ptr<Update> resolve();
- static ElementUpdate createAnimatedElementUpdate(std::unique_ptr<RenderStyle>, Element&, Change parentChange);
-
private:
std::unique_ptr<RenderStyle> styleForElement(Element&, const RenderStyle& inheritedStyle);
void resolveComposedTree();
- ElementUpdate resolveElement(Element&);
+ ElementUpdates resolveElement(Element&);
+ ElementUpdate createAnimatedElementUpdate(std::unique_ptr<RenderStyle>, Element&, Change parentChange);
+ ElementUpdate resolvePseudoStyle(Element&, const ElementUpdate&, PseudoId);
struct Scope : RefCounted<Scope> {
StyleResolver& styleResolver;
Modified: trunk/Source/WebCore/style/StyleUpdate.cpp (223499 => 223500)
--- trunk/Source/WebCore/style/StyleUpdate.cpp 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/style/StyleUpdate.cpp 2017-10-17 09:21:05 UTC (rev 223500)
@@ -41,7 +41,7 @@
{
}
-const ElementUpdate* Update::elementUpdate(const Element& element) const
+const ElementUpdates* Update::elementUpdates(const Element& element) const
{
auto it = m_elements.find(&element);
if (it == m_elements.end())
@@ -49,7 +49,7 @@
return &it->value;
}
-ElementUpdate* Update::elementUpdate(const Element& element)
+ElementUpdates* Update::elementUpdates(const Element& element)
{
auto it = m_elements.find(&element);
if (it == m_elements.end())
@@ -67,8 +67,8 @@
const RenderStyle* Update::elementStyle(const Element& element) const
{
- if (auto* update = elementUpdate(element))
- return update->style.get();
+ if (auto* updates = elementUpdates(element))
+ return updates->update.style.get();
auto* renderer = element.renderer();
if (!renderer)
return nullptr;
@@ -77,8 +77,8 @@
RenderStyle* Update::elementStyle(const Element& element)
{
- if (auto* update = elementUpdate(element))
- return update->style.get();
+ if (auto* updates = elementUpdates(element))
+ return updates->update.style.get();
auto* renderer = element.renderer();
if (!renderer)
return nullptr;
@@ -85,13 +85,13 @@
return &renderer->mutableStyle();
}
-void Update::addElement(Element& element, Element* parent, ElementUpdate&& elementUpdate)
+void Update::addElement(Element& element, Element* parent, ElementUpdates&& elementUpdates)
{
ASSERT(!m_elements.contains(&element));
ASSERT(composedTreeAncestors(element).first() == parent);
addPossibleRoot(parent);
- m_elements.add(&element, WTFMove(elementUpdate));
+ m_elements.add(&element, WTFMove(elementUpdates));
}
void Update::addText(Text& text, Element* parent, TextUpdate&& textUpdate)
Modified: trunk/Source/WebCore/style/StyleUpdate.h (223499 => 223500)
--- trunk/Source/WebCore/style/StyleUpdate.h 2017-10-17 08:36:12 UTC (rev 223499)
+++ trunk/Source/WebCore/style/StyleUpdate.h 2017-10-17 09:21:05 UTC (rev 223500)
@@ -57,6 +57,21 @@
bool recompositeLayer { false };
};
+struct ElementUpdates {
+#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
+ ElementUpdates() = default;
+ ElementUpdates(ElementUpdate update, std::optional<ElementUpdate> beforePseudoElementUpdate, std::optional<ElementUpdate> afterPseudoElementUpdate)
+ : update { WTFMove(update) }
+ , beforePseudoElementUpdate { WTFMove(beforePseudoElementUpdate) }
+ , afterPseudoElementUpdate { WTFMove(afterPseudoElementUpdate) }
+ {
+ }
+#endif
+ ElementUpdate update;
+ std::optional<ElementUpdate> beforePseudoElementUpdate;
+ std::optional<ElementUpdate> afterPseudoElementUpdate;
+};
+
struct TextUpdate {
#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
TextUpdate() = default;
@@ -78,8 +93,8 @@
const ListHashSet<ContainerNode*>& roots() const { return m_roots; }
- const ElementUpdate* elementUpdate(const Element&) const;
- ElementUpdate* elementUpdate(const Element&);
+ const ElementUpdates* elementUpdates(const Element&) const;
+ ElementUpdates* elementUpdates(const Element&);
const TextUpdate* textUpdate(const Text&) const;
@@ -90,7 +105,7 @@
unsigned size() const { return m_elements.size() + m_texts.size(); }
- void addElement(Element&, Element* parent, ElementUpdate&&);
+ void addElement(Element&, Element* parent, ElementUpdates&&);
void addText(Text&, Element* parent, TextUpdate&&);
void addText(Text&, TextUpdate&&);
@@ -99,7 +114,7 @@
Document& m_document;
ListHashSet<ContainerNode*> m_roots;
- HashMap<const Element*, ElementUpdate> m_elements;
+ HashMap<const Element*, ElementUpdates> m_elements;
HashMap<const Text*, TextUpdate> m_texts;
};