Diff
Modified: trunk/Source/WebCore/ChangeLog (153815 => 153816)
--- trunk/Source/WebCore/ChangeLog 2013-08-08 07:16:51 UTC (rev 153815)
+++ trunk/Source/WebCore/ChangeLog 2013-08-08 07:18:36 UTC (rev 153816)
@@ -1,3 +1,46 @@
+2013-08-08 Antti Koivisto <an...@apple.com>
+
+ Move more style recalc code to StyleResolveTree.cpp
+ https://bugs.webkit.org/show_bug.cgi?id=119553
+
+ Reviewed by Andreas Kling.
+
+ * css/StyleResolver.cpp:
+ * css/StyleResolver.h:
+
+ Remove now unused StyleResolver::styleForText.
+
+ * dom/ElementShadow.cpp:
+ * dom/ElementShadow.h:
+
+ Remove ElementShadow::recalcStyle.
+
+ * dom/ShadowRoot.cpp:
+ (WebCore::ShadowRoot::setResetStyleInheritance):
+
+ Use Style::resolveTree instead of ElementShadow::recalcStyle.
+
+ * dom/ShadowRoot.h:
+
+ Remove ShadowRoot::recalcStyle.
+
+ * dom/Text.cpp:
+ * dom/Text.h:
+
+ Remove Text::recalcTextStyle.
+
+ * style/StyleResolveTree.cpp:
+ (WebCore::Style::updateTextStyle):
+
+ Moved from Text::recalcTextStyle. Speed up by just setting the parent style on common case.
+
+ (WebCore::Style::resolveShadowTree):
+
+ Moved from ShadowRoot::recalcStyle.
+ Simplified to cover only cases that can occur with the current shadow DOM support.
+
+ (WebCore::Style::resolveTree):
+
2013-08-08 Andreas Kling <akl...@apple.com>
REGRESSION(r139282): Old caret sometimes gets "stuck" (not repainted) in contenteditable elements.
Modified: trunk/Source/WebCore/css/StyleResolver.cpp (153815 => 153816)
--- trunk/Source/WebCore/css/StyleResolver.cpp 2013-08-08 07:16:51 UTC (rev 153815)
+++ trunk/Source/WebCore/css/StyleResolver.cpp 2013-08-08 07:18:36 UTC (rev 153816)
@@ -1221,16 +1221,6 @@
return m_state.takeStyle();
}
-PassRefPtr<RenderStyle> StyleResolver::styleForText(Text* textNode)
-{
- ASSERT(textNode);
-
- NodeRenderingContext context(textNode);
- Node* parentNode = context.parentNodeForRenderingAndStyle();
- return context.resetStyleInheritance() || !parentNode || !parentNode->renderStyle() ?
- defaultStyleForElement() : parentNode->renderStyle();
-}
-
static void addIntrinsicMargins(RenderStyle* style)
{
// Intrinsic margin value.
Modified: trunk/Source/WebCore/css/StyleResolver.h (153815 => 153816)
--- trunk/Source/WebCore/css/StyleResolver.h 2013-08-08 07:16:51 UTC (rev 153815)
+++ trunk/Source/WebCore/css/StyleResolver.h 2013-08-08 07:18:36 UTC (rev 153816)
@@ -189,7 +189,6 @@
PassRefPtr<RenderStyle> styleForPage(int pageIndex);
PassRefPtr<RenderStyle> defaultStyleForElement();
- PassRefPtr<RenderStyle> styleForText(Text*);
static PassRefPtr<RenderStyle> styleForDocument(Document*, CSSFontSelector* = 0);
Modified: trunk/Source/WebCore/dom/ElementShadow.cpp (153815 => 153816)
--- trunk/Source/WebCore/dom/ElementShadow.cpp 2013-08-08 07:16:51 UTC (rev 153815)
+++ trunk/Source/WebCore/dom/ElementShadow.cpp 2013-08-08 07:18:36 UTC (rev 153816)
@@ -113,12 +113,6 @@
return shadowRoot()->needsStyleRecalc();
}
-void ElementShadow::recalcStyle(Style::Change change)
-{
- if (ShadowRoot* root = shadowRoot())
- root->recalcStyle(change);
-}
-
void ElementShadow::removeAllEventListeners()
{
if (ShadowRoot* root = shadowRoot()) {
Modified: trunk/Source/WebCore/dom/ElementShadow.h (153815 => 153816)
--- trunk/Source/WebCore/dom/ElementShadow.h 2013-08-08 07:16:51 UTC (rev 153815)
+++ trunk/Source/WebCore/dom/ElementShadow.h 2013-08-08 07:18:36 UTC (rev 153816)
@@ -61,7 +61,6 @@
bool childNeedsStyleRecalc() const;
bool needsStyleRecalc() const;
- void recalcStyle(Style::Change);
void removeAllEventListeners();
void invalidateDistribution() { m_distributor.invalidateDistribution(host()); }
Modified: trunk/Source/WebCore/dom/ShadowRoot.cpp (153815 => 153816)
--- trunk/Source/WebCore/dom/ShadowRoot.cpp 2013-08-08 07:16:51 UTC (rev 153815)
+++ trunk/Source/WebCore/dom/ShadowRoot.cpp 2013-08-08 07:18:36 UTC (rev 153816)
@@ -122,26 +122,6 @@
}
}
-void ShadowRoot::recalcStyle(Style::Change change)
-{
- // ShadowRoot doesn't support custom callbacks.
- ASSERT(!hasCustomStyleCallbacks());
-
- StyleResolver* styleResolver = document()->ensureStyleResolver();
- styleResolver->pushParentShadowRoot(this);
-
- for (Node* child = firstChild(); child; child = child->nextSibling()) {
- if (child->isElementNode())
- Style::resolveTree(toElement(child), change);
- else if (child->isTextNode())
- toText(child)->recalcTextStyle(change);
- }
-
- styleResolver->popParentShadowRoot(this);
- clearNeedsStyleRecalc();
- clearChildNeedsStyleRecalc();
-}
-
void ShadowRoot::setApplyAuthorStyles(bool value)
{
if (isOrphan())
@@ -160,8 +140,8 @@
if (value != m_resetStyleInheritance) {
m_resetStyleInheritance = value;
- if (attached() && owner())
- owner()->recalcStyle(Style::Force);
+ if (attached() && host())
+ Style::resolveTree(host(), Style::Force);
}
}
Modified: trunk/Source/WebCore/dom/ShadowRoot.h (153815 => 153816)
--- trunk/Source/WebCore/dom/ShadowRoot.h 2013-08-08 07:16:51 UTC (rev 153815)
+++ trunk/Source/WebCore/dom/ShadowRoot.h 2013-08-08 07:18:36 UTC (rev 153816)
@@ -56,8 +56,6 @@
virtual ~ShadowRoot();
- void recalcStyle(Style::Change);
-
virtual bool applyAuthorStyles() const OVERRIDE { return m_applyAuthorStyles; }
void setApplyAuthorStyles(bool);
virtual bool resetStyleInheritance() const OVERRIDE { return m_resetStyleInheritance; }
Modified: trunk/Source/WebCore/dom/Text.cpp (153815 => 153816)
--- trunk/Source/WebCore/dom/Text.cpp 2013-08-08 07:16:51 UTC (rev 153815)
+++ trunk/Source/WebCore/dom/Text.cpp 2013-08-08 07:18:36 UTC (rev 153816)
@@ -282,22 +282,6 @@
CharacterData::attach(context);
}
-void Text::recalcTextStyle(Style::Change change)
-{
- RenderText* renderer = toRenderText(this->renderer());
-
- if (change != Style::NoChange && renderer)
- renderer->setStyle(document()->ensureStyleResolver()->styleForText(this));
-
- if (needsStyleRecalc()) {
- if (renderer)
- renderer->setText(dataImpl());
- else
- reattach();
- }
- clearNeedsStyleRecalc();
-}
-
void Text::updateTextRenderer(unsigned offsetOfReplacedData, unsigned lengthOfReplacedData)
{
if (!attached())
Modified: trunk/Source/WebCore/dom/Text.h (153815 => 153816)
--- trunk/Source/WebCore/dom/Text.h 2013-08-08 07:16:51 UTC (rev 153815)
+++ trunk/Source/WebCore/dom/Text.h 2013-08-08 07:18:36 UTC (rev 153816)
@@ -45,7 +45,6 @@
String wholeText() const;
PassRefPtr<Text> replaceWholeText(const String&, ExceptionCode&);
- void recalcTextStyle(Style::Change);
void createTextRendererIfNeeded();
bool textRendererIsNeeded(const NodeRenderingContext&);
RenderText* createTextRenderer(RenderArena*, RenderStyle*);
Modified: trunk/Source/WebCore/style/StyleResolveTree.cpp (153815 => 153816)
--- trunk/Source/WebCore/style/StyleResolveTree.cpp 2013-08-08 07:16:51 UTC (rev 153815)
+++ trunk/Source/WebCore/style/StyleResolveTree.cpp 2013-08-08 07:18:36 UTC (rev 153816)
@@ -31,6 +31,7 @@
#include "NodeRenderStyle.h"
#include "NodeTraversal.h"
#include "RenderObject.h"
+#include "RenderText.h"
#include "Settings.h"
#include "ShadowRoot.h"
#include "StyleResolver.h"
@@ -176,6 +177,43 @@
return localChange;
}
+static void updateTextStyle(Text* text, RenderStyle* parentElementStyle, Style::Change change)
+{
+ RenderText* renderer = toRenderText(text->renderer());
+
+ if (change != Style::NoChange && renderer)
+ renderer->setStyle(parentElementStyle);
+
+ if (!text->needsStyleRecalc())
+ return;
+ if (renderer)
+ renderer->setText(text->dataImpl());
+ else
+ text->reattach();
+ text->clearNeedsStyleRecalc();
+}
+
+static void resolveShadowTree(ShadowRoot* shadowRoot, RenderStyle* parentElementStyle, Style::Change change)
+{
+ if (!shadowRoot)
+ return;
+ StyleResolver* styleResolver = shadowRoot->document()->ensureStyleResolver();
+ styleResolver->pushParentShadowRoot(shadowRoot);
+
+ for (Node* child = shadowRoot->firstChild(); child; child = child->nextSibling()) {
+ if (child->isTextNode()) {
+ // Current user agent ShadowRoots don't have immediate text children so this branch is never actually taken.
+ updateTextStyle(toText(child), parentElementStyle, change);
+ continue;
+ }
+ resolveTree(toElement(child), change);
+ }
+
+ styleResolver->popParentShadowRoot(shadowRoot);
+ shadowRoot->clearNeedsStyleRecalc();
+ shadowRoot->clearChildNeedsStyleRecalc();
+}
+
void resolveTree(Element* current, Change change)
{
ASSERT(change != Detach);
@@ -198,10 +236,12 @@
if (change != Detach) {
StyleResolverParentPusher parentPusher(current);
+ RenderStyle* currentStyle = current->renderStyle();
+
if (ElementShadow* shadow = current->shadow()) {
if (change >= Inherit || shadow->childNeedsStyleRecalc() || shadow->needsStyleRecalc()) {
parentPusher.push();
- shadow->recalcStyle(change);
+ resolveShadowTree(shadow->shadowRoot(), currentStyle, change);
}
}
@@ -214,7 +254,7 @@
bool forceCheckOfAnyElementSibling = false;
for (Node* child = current->firstChild(); child; child = child->nextSibling()) {
if (child->isTextNode()) {
- toText(child)->recalcTextStyle(change);
+ updateTextStyle(toText(child), currentStyle, change);
continue;
}
if (!child->isElementNode())