Diff
Modified: trunk/Source/WebCore/ChangeLog (209437 => 209438)
--- trunk/Source/WebCore/ChangeLog 2016-12-07 01:15:20 UTC (rev 209437)
+++ trunk/Source/WebCore/ChangeLog 2016-12-07 01:15:42 UTC (rev 209438)
@@ -1,3 +1,31 @@
+2016-12-06 Zalan Bujtas <[email protected]>
+
+ Move RenderElement::rendererForRootBackground to RenderView.
+ https://bugs.webkit.org/show_bug.cgi?id=165454
+
+ Reviewed by Simon Fraser.
+
+ Currently RenderElement::rendererForRootBackground can only be called on document element's renderer.
+ This patch removes this limitation and moves the functionality from RenderElement to RenderView.
+
+ No change in functionality.
+
+ * page/FrameView.cpp:
+ (WebCore::FrameView::calculateExtendedBackgroundMode):
+ * rendering/RenderBox.cpp:
+ (WebCore::RenderBox::paintRootBoxFillLayers):
+ * rendering/RenderElement.cpp:
+ (WebCore::RenderElement::rendererForRootBackground): Deleted.
+ * rendering/RenderElement.h:
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::rendererBackgroundColor):
+ * rendering/RenderView.cpp:
+ (WebCore::RenderView::rendererForRootBackground):
+ (WebCore::rendererObscuresBackground):
+ (WebCore::RenderView::paintBoxDecorations):
+ (WebCore::RenderView::rootBackgroundIsEntirelyFixed):
+ * rendering/RenderView.h:
+
2016-12-05 Jiewen Tan <[email protected]>
[Part 1 of 2] Add support for SPKI format while doing SubtleCrypto.importKey/exportKey
Modified: trunk/Source/WebCore/page/FrameView.cpp (209437 => 209438)
--- trunk/Source/WebCore/page/FrameView.cpp 2016-12-07 01:15:20 UTC (rev 209437)
+++ trunk/Source/WebCore/page/FrameView.cpp 2016-12-07 01:15:42 UTC (rev 209438)
@@ -3180,20 +3180,20 @@
if (!document)
return ExtendedBackgroundModeNone;
- auto* documentElement = document->documentElement();
- auto* documentElementRenderer = documentElement ? documentElement->renderer() : nullptr;
- if (!documentElementRenderer)
+ if (!renderView())
return ExtendedBackgroundModeNone;
+
+ auto* rootBackgroundRenderer = renderView()->rendererForRootBackground();
+ if (!rootBackgroundRenderer)
+ return ExtendedBackgroundModeNone;
- auto& renderer = documentElementRenderer->rendererForRootBackground();
- if (!renderer.style().hasBackgroundImage())
+ if (!rootBackgroundRenderer->style().hasBackgroundImage())
return ExtendedBackgroundModeNone;
ExtendedBackgroundMode mode = ExtendedBackgroundModeNone;
-
- if (renderer.style().backgroundRepeatX() == RepeatFill)
+ if (rootBackgroundRenderer->style().backgroundRepeatX() == RepeatFill)
mode |= ExtendedBackgroundModeHorizontal;
- if (renderer.style().backgroundRepeatY() == RepeatFill)
+ if (rootBackgroundRenderer->style().backgroundRepeatY() == RepeatFill)
mode |= ExtendedBackgroundModeVertical;
return mode;
Modified: trunk/Source/WebCore/rendering/RenderBox.cpp (209437 => 209438)
--- trunk/Source/WebCore/rendering/RenderBox.cpp 2016-12-07 01:15:20 UTC (rev 209437)
+++ trunk/Source/WebCore/rendering/RenderBox.cpp 2016-12-07 01:15:42 UTC (rev 209438)
@@ -1264,15 +1264,18 @@
void RenderBox::paintRootBoxFillLayers(const PaintInfo& paintInfo)
{
+ ASSERT(isDocumentElementRenderer());
if (paintInfo.skipRootBackground())
return;
- auto& rootBackgroundRenderer = rendererForRootBackground();
-
- const FillLayer* bgLayer = rootBackgroundRenderer.style().backgroundLayers();
- Color bgColor = rootBackgroundRenderer.style().visitedDependentColor(CSSPropertyBackgroundColor);
+ auto* rootBackgroundRenderer = view().rendererForRootBackground();
+ if (!rootBackgroundRenderer)
+ return;
- paintFillLayers(paintInfo, bgColor, bgLayer, view().backgroundRect(), BackgroundBleedNone, CompositeSourceOver, &rootBackgroundRenderer);
+ const FillLayer* bgLayer = rootBackgroundRenderer->style().backgroundLayers();
+ Color bgColor = rootBackgroundRenderer->style().visitedDependentColor(CSSPropertyBackgroundColor);
+
+ paintFillLayers(paintInfo, bgColor, bgLayer, view().backgroundRect(), BackgroundBleedNone, CompositeSourceOver, rootBackgroundRenderer);
}
BackgroundBleedAvoidance RenderBox::determineBackgroundBleedAvoidance(GraphicsContext& context) const
Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (209437 => 209438)
--- trunk/Source/WebCore/rendering/RenderElement.cpp 2016-12-07 01:15:20 UTC (rev 209437)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp 2016-12-07 01:15:42 UTC (rev 209438)
@@ -1167,22 +1167,6 @@
setLayerNeedsFullRepaint();
}
-RenderElement& RenderElement::rendererForRootBackground()
-{
- ASSERT(isDocumentElementRenderer());
- if (!hasBackground() && is<HTMLHtmlElement>(element())) {
- // Locate the <body> element using the DOM. This is easier than trying
- // to crawl around a render tree with potential :before/:after content and
- // anonymous blocks created by inline <body> tags etc. We can locate the <body>
- // render object very easily via the DOM.
- if (auto* body = document().body()) {
- if (auto* renderer = body->renderer())
- return *renderer;
- }
- }
- return *this;
-}
-
RenderElement* RenderElement::hoverAncestor() const
{
// When searching for the hover ancestor and encountering a named flow thread,
Modified: trunk/Source/WebCore/rendering/RenderElement.h (209437 => 209438)
--- trunk/Source/WebCore/rendering/RenderElement.h 2016-12-07 01:15:20 UTC (rev 209437)
+++ trunk/Source/WebCore/rendering/RenderElement.h 2016-12-07 01:15:42 UTC (rev 209438)
@@ -128,9 +128,6 @@
/* This function performs a layout only if one is needed. */
void layoutIfNeeded() { if (needsLayout()) layout(); }
- // Return the renderer whose background style is used to paint the root background. Should only be called on the renderer for which isDocumentElementRenderer() is true.
- RenderElement& rendererForRootBackground();
-
// Updates only the local style ptr of the object. Does not update the state of the object,
// and so only should be called when the style is known not to have changed (or from setStyle).
void setStyleInternal(RenderStyle&& style) { m_style = WTFMove(style); }
Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (209437 => 209438)
--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp 2016-12-07 01:15:20 UTC (rev 209437)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp 2016-12-07 01:15:42 UTC (rev 209438)
@@ -1792,8 +1792,14 @@
Color RenderLayerBacking::rendererBackgroundColor() const
{
- const auto& backgroundRenderer = renderer().isDocumentElementRenderer() ? renderer().rendererForRootBackground() : renderer();
- return backgroundRenderer.style().visitedDependentColor(CSSPropertyBackgroundColor);
+ RenderElement* backgroundRenderer = nullptr;
+ if (renderer().isDocumentElementRenderer())
+ backgroundRenderer = renderer().view().rendererForRootBackground();
+
+ if (!backgroundRenderer)
+ backgroundRenderer = &renderer();
+
+ return backgroundRenderer->style().visitedDependentColor(CSSPropertyBackgroundColor);
}
void RenderLayerBacking::updateDirectlyCompositedBackgroundColor(bool isSimpleContainer, bool& didUpdateContentsRect)
Modified: trunk/Source/WebCore/rendering/RenderView.cpp (209437 => 209438)
--- trunk/Source/WebCore/rendering/RenderView.cpp 2016-12-07 01:15:20 UTC (rev 209437)
+++ trunk/Source/WebCore/rendering/RenderView.cpp 2016-12-07 01:15:42 UTC (rev 209438)
@@ -30,7 +30,9 @@
#include "FrameSelection.h"
#include "FrameView.h"
#include "GraphicsContext.h"
+#include "HTMLBodyElement.h"
#include "HTMLFrameOwnerElement.h"
+#include "HTMLHtmlElement.h"
#include "HTMLIFrameElement.h"
#include "HitTestResult.h"
#include "ImageQualityController.h"
@@ -506,24 +508,45 @@
paintObject(paintInfo, paintOffset);
}
-static inline bool rendererObscuresBackground(RenderElement* rootObject)
+RenderElement* RenderView::rendererForRootBackground() const
{
- if (!rootObject)
+ auto* firstChild = this->firstChild();
+ if (!firstChild)
+ return nullptr;
+ ASSERT(is<RenderElement>(*firstChild));
+ auto& documentRenderer = downcast<RenderElement>(*firstChild);
+
+ if (documentRenderer.hasBackground())
+ return &documentRenderer;
+
+ // We propagate the background only for HTML content.
+ if (!is<HTMLHtmlElement>(documentRenderer.element()))
+ return &documentRenderer;
+
+ if (auto* body = document().body()) {
+ if (auto* renderer = body->renderer())
+ return renderer;
+ }
+ return &documentRenderer;
+}
+
+static inline bool rendererObscuresBackground(const RenderElement& rootElement)
+{
+ auto& style = rootElement.style();
+ if (style.visibility() != VISIBLE || style.opacity() != 1 || style.hasTransform())
return false;
-
- const RenderStyle& style = rootObject->style();
- if (style.visibility() != VISIBLE
- || style.opacity() != 1
- || style.hasTransform())
+
+ if (style.hasBorderRadius())
return false;
-
- if (rootObject->isComposited())
+
+ if (rootElement.isComposited())
return false;
- if (rootObject->rendererForRootBackground().style().backgroundClip() == TextFillBox)
+ auto* rendererForBackground = rootElement.view().rendererForRootBackground();
+ if (!rendererForBackground)
return false;
- if (style.hasBorderRadius())
+ if (rendererForBackground->style().backgroundClip() == TextFillBox)
return false;
return true;
@@ -567,7 +590,7 @@
// The document element's renderer is currently forced to be a block, but may not always be.
RenderBox* rootBox = is<RenderBox>(*rootRenderer) ? downcast<RenderBox>(rootRenderer) : nullptr;
rootFillsViewport = rootBox && !rootBox->x() && !rootBox->y() && rootBox->width() >= width() && rootBox->height() >= height();
- rootObscuresBackground = rendererObscuresBackground(rootRenderer);
+ rootObscuresBackground = rendererObscuresBackground(*rootRenderer);
}
bool backgroundShouldExtendBeyondPage = frameView().frame().settings().backgroundShouldExtendBeyondPage();
@@ -1144,11 +1167,9 @@
bool RenderView::rootBackgroundIsEntirelyFixed() const
{
- RenderElement* rootObject = document().documentElement() ? document().documentElement()->renderer() : nullptr;
- if (!rootObject)
- return false;
-
- return rootObject->rendererForRootBackground().style().hasEntirelyFixedBackground();
+ if (auto* rootBackgroundRenderer = rendererForRootBackground())
+ return rootBackgroundRenderer->style().hasEntirelyFixedBackground();
+ return false;
}
LayoutRect RenderView::unextendedBackgroundRect() const
Modified: trunk/Source/WebCore/rendering/RenderView.h (209437 => 209438)
--- trunk/Source/WebCore/rendering/RenderView.h 2016-12-07 01:15:20 UTC (rev 209437)
+++ trunk/Source/WebCore/rendering/RenderView.h 2016-12-07 01:15:42 UTC (rev 209438)
@@ -82,6 +82,8 @@
void paint(PaintInfo&, const LayoutPoint&) override;
void paintBoxDecorations(PaintInfo&, const LayoutPoint&) override;
+ // Return the renderer whose background style is used to paint the root background.
+ RenderElement* rendererForRootBackground() const;
enum SelectionRepaintMode { RepaintNewXOROld, RepaintNewMinusOld, RepaintNothing };
void setSelection(RenderObject* start, std::optional<unsigned> startPos, RenderObject* endObject, std::optional<unsigned> endPos, SelectionRepaintMode = RepaintNewXOROld);