diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 79fc601aa454de9da0a012411e1683d093ebb4eb..a4722191fd28ab9b0c2d83d2d8c7579d8f450bf9 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,17 @@ +2013-12-02 Andreas Kling + + Avoid setting style twice for generated image content. + + + Take care of a FIXME I added in r158097 and avoid redundant work in + ImageContentData::createRenderer(). + + I changed the inheritance helper RenderImage::setPseudoStyle() into + a new createStyleInheritingFromPseudoStyle() function instead so it + can be used from both PseudoElement and ImageContentData. + + Reviewed by Antti Koivisto. + 2013-12-02 Samuel White AX: Add AXUIElementCountForSearchPredicate parameterized attribute. diff --git a/Source/WebCore/dom/PseudoElement.cpp b/Source/WebCore/dom/PseudoElement.cpp index bf37a6370634f901c36d14d1d8b5386b2f88feb8..11abb94fcc60506b038f56222dac18a516e8b1c3 100644 --- a/Source/WebCore/dom/PseudoElement.cpp +++ b/Source/WebCore/dom/PseudoElement.cpp @@ -114,7 +114,7 @@ void PseudoElement::didRecalcStyle(Style::Change) // We only manage the style for the generated content which must be images or text. if (!child->isImage()) continue; - toRenderImage(child)->setPseudoStyle(&renderer->style()); + toRenderImage(*child).setStyle(RenderImage::createStyleInheritingFromPseudoStyle(renderer->style())); } } diff --git a/Source/WebCore/rendering/RenderImage.cpp b/Source/WebCore/rendering/RenderImage.cpp index cb620e902044776d40af4f7194d8547c5bf0608e..b2ee317a58989bd59065fc56688bbb2e206c95f3 100644 --- a/Source/WebCore/rendering/RenderImage.cpp +++ b/Source/WebCore/rendering/RenderImage.cpp @@ -74,17 +74,16 @@ RenderImage::~RenderImage() m_imageResource->shutdown(); } - -void RenderImage::setPseudoStyle(PassRefPtr pseudoStyle) +PassRef RenderImage::createStyleInheritingFromPseudoStyle(const RenderStyle& pseudoStyle) { - ASSERT(pseudoStyle->styleType() == BEFORE || pseudoStyle->styleType() == AFTER); + ASSERT(pseudoStyle.styleType() == BEFORE || pseudoStyle.styleType() == AFTER); // Images are special and must inherit the pseudoStyle so the width and height of // the pseudo element doesn't change the size of the image. In all other cases we // can just share the style. auto style = RenderStyle::create(); - style.get().inheritFrom(pseudoStyle.get()); - setStyle(std::move(style)); + style.get().inheritFrom(&pseudoStyle); + return style; } void RenderImage::setImageResource(PassOwnPtr imageResource) diff --git a/Source/WebCore/rendering/RenderImage.h b/Source/WebCore/rendering/RenderImage.h index 23536783b54e4e6c1fb0bd4285cfdc066344de15..c23a2691e30f88cddd8f4c4caef5cc32d2c7b584 100644 --- a/Source/WebCore/rendering/RenderImage.h +++ b/Source/WebCore/rendering/RenderImage.h @@ -39,8 +39,8 @@ public: explicit RenderImage(Document&, PassRef); virtual ~RenderImage(); - // Set the style of the object if it's generated content. - void setPseudoStyle(PassRefPtr); + // Create a RenderStyle for generated content by inheriting from a pseudo style. + static PassRef createStyleInheritingFromPseudoStyle(const RenderStyle&); void setImageResource(PassOwnPtr); diff --git a/Source/WebCore/rendering/style/ContentData.cpp b/Source/WebCore/rendering/style/ContentData.cpp index c39438ad470bf4acdd2d6c6b2bac76fae690789a..7882369c03b33ca8cc23778ae85ec54cddf74d2d 100644 --- a/Source/WebCore/rendering/style/ContentData.cpp +++ b/Source/WebCore/rendering/style/ContentData.cpp @@ -49,9 +49,8 @@ std::unique_ptr ContentData::clone() const RenderObject* ImageContentData::createRenderer(Document& document, RenderStyle& pseudoStyle) const { - // FIXME: We should find a way to avoid setting the style twice here. - RenderImage* image = new RenderImage(document, pseudoStyle); - image->setPseudoStyle(&pseudoStyle); + RenderImage* image = new RenderImage(document, RenderImage::createStyleInheritingFromPseudoStyle(pseudoStyle)); + image->initializeStyle(); image->setAltText(altText()); if (m_image) image->setImageResource(RenderImageResourceStyleImage::create(*m_image));