Title: [209438] trunk/Source/WebCore
Revision
209438
Author
[email protected]
Date
2016-12-06 17:15:42 -0800 (Tue, 06 Dec 2016)

Log Message

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:

Modified Paths

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);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to