Title: [171308] trunk/Source
Revision
171308
Author
[email protected]
Date
2014-07-21 11:31:53 -0700 (Mon, 21 Jul 2014)

Log Message

Put position:fixed elements into layers when a WK1 view is layer-backed
https://bugs.webkit.org/show_bug.cgi?id=135075

Reviewed by Darin Adler.


Source/WebCore: 
This patch adds a new ChromeClient function called 
requiresAcceleratedCompositingForViewportConstrainedPosition(). Since a view can 
go in and out of layer backing, we need a ChromeClient method that can be 
dynamically re-evaluated rather than using the existing settings for enabling 
accelerated fixed and fixed that creates a stacking context.

Ensure that fixed elements create a stacking context when 
requiresAcceleratedCompositingForViewportConstrainedPosition is true.
* css/StyleResolver.cpp:
(WebCore::StyleResolver::adjustRenderStyle):

New ChromeClient function.
* page/ChromeClient.h:

Source/WebKit/mac: 
Returns true when the WebHTMLView has a layer.

* WebCoreSupport/WebChromeClient.h:
* WebCoreSupport/WebChromeClient.mm:
(WebChromeClient::requiresAcceleratedCompositingForViewportConstrainedPosition):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (171307 => 171308)


--- trunk/Source/WebCore/ChangeLog	2014-07-21 18:26:45 UTC (rev 171307)
+++ trunk/Source/WebCore/ChangeLog	2014-07-21 18:31:53 UTC (rev 171308)
@@ -1,3 +1,24 @@
+2014-07-21  Beth Dakin  <[email protected]>
+
+        Put position:fixed elements into layers when a WK1 view is layer-backed
+        https://bugs.webkit.org/show_bug.cgi?id=135075
+
+        Reviewed by Darin Adler.
+
+        This patch adds a new ChromeClient function called 
+        requiresAcceleratedCompositingForViewportConstrainedPosition(). Since a view can 
+        go in and out of layer backing, we need a ChromeClient method that can be 
+        dynamically re-evaluated rather than using the existing settings for enabling 
+        accelerated fixed and fixed that creates a stacking context.
+
+        Ensure that fixed elements create a stacking context when 
+        requiresAcceleratedCompositingForViewportConstrainedPosition is true.
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::adjustRenderStyle):
+
+        New ChromeClient function.
+        * page/ChromeClient.h:
+
 2014-07-21  Simon Fraser  <[email protected]>
 
         Add helper functions to dump the scrolling state tree from the debugger

Modified: trunk/Source/WebCore/css/StyleResolver.cpp (171307 => 171308)


--- trunk/Source/WebCore/css/StyleResolver.cpp	2014-07-21 18:26:45 UTC (rev 171307)
+++ trunk/Source/WebCore/css/StyleResolver.cpp	2014-07-21 18:31:53 UTC (rev 171308)
@@ -59,6 +59,8 @@
 #include "CachedSVGDocument.h"
 #include "CachedSVGDocumentReference.h"
 #include "CalculationValue.h"
+#include "Chrome.h"
+#include "ChromeClient.h"
 #include "ContentData.h"
 #include "Counter.h"
 #include "CounterContent.h"
@@ -1147,6 +1149,19 @@
 }
 #endif
 
+static inline bool fixedPositionCreatesStackingContext(Element* element)
+{
+    if (!element)
+        return false;
+
+    Page* page = element->document().page();
+    if (!page)
+        return false;
+
+    return page->settings().fixedPositionCreatesStackingContext()
+        || page->chrome().client().requiresAcceleratedCompositingForViewportConstrainedPosition();
+}
+
 void StyleResolver::adjustRenderStyle(RenderStyle& style, const RenderStyle& parentStyle, Element *e)
 {
     // Cache our original display.
@@ -1255,7 +1270,7 @@
         || style.hasBlendMode()
         || style.hasIsolation()
         || style.position() == StickyPosition
-        || (style.position() == FixedPosition && e && e->document().page() && e->document().page()->settings().fixedPositionCreatesStackingContext())
+        || (style.position() == FixedPosition && fixedPositionCreatesStackingContext(e))
         || style.hasFlowFrom()
         ))
         style.setZIndex(0);

Modified: trunk/Source/WebCore/page/ChromeClient.h (171307 => 171308)


--- trunk/Source/WebCore/page/ChromeClient.h	2014-07-21 18:26:45 UTC (rev 171307)
+++ trunk/Source/WebCore/page/ChromeClient.h	2014-07-21 18:31:53 UTC (rev 171308)
@@ -427,6 +427,8 @@
 
     virtual bool shouldUseTiledBackingForFrameView(const FrameView*) const { return false; }
 
+    virtual bool requiresAcceleratedCompositingForViewportConstrainedPosition() const { return false; }
+
 #if ENABLE(SUBTLE_CRYPTO)
     virtual bool wrapCryptoKey(const Vector<uint8_t>&, Vector<uint8_t>&) const { return false; }
     virtual bool unwrapCryptoKey(const Vector<uint8_t>&, Vector<uint8_t>&) const { return false; }

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (171307 => 171308)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2014-07-21 18:26:45 UTC (rev 171307)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2014-07-21 18:31:53 UTC (rev 171308)
@@ -2610,7 +2610,9 @@
 
     // FIXME: acceleratedCompositingForFixedPositionEnabled should probably be renamed acceleratedCompositingForViewportConstrainedPositionEnabled().
     const Settings& settings = m_renderView.frameView().frame().settings();
-    if (!settings.acceleratedCompositingForFixedPositionEnabled())
+    Page* page = this->page();
+    bool clientRequiresCompositing = page && page->chrome().client().requiresAcceleratedCompositingForViewportConstrainedPosition();
+    if (!(settings.acceleratedCompositingForFixedPositionEnabled() || clientRequiresCompositing))
         return false;
 
     if (isSticky)

Modified: trunk/Source/WebKit/mac/ChangeLog (171307 => 171308)


--- trunk/Source/WebKit/mac/ChangeLog	2014-07-21 18:26:45 UTC (rev 171307)
+++ trunk/Source/WebKit/mac/ChangeLog	2014-07-21 18:31:53 UTC (rev 171308)
@@ -1,3 +1,16 @@
+2014-07-21  Beth Dakin  <[email protected]>
+
+        Put position:fixed elements into layers when a WK1 view is layer-backed
+        https://bugs.webkit.org/show_bug.cgi?id=135075
+
+        Reviewed by Darin Adler.
+
+        Returns true when the WebHTMLView has a layer.
+
+        * WebCoreSupport/WebChromeClient.h:
+        * WebCoreSupport/WebChromeClient.mm:
+        (WebChromeClient::requiresAcceleratedCompositingForViewportConstrainedPosition):
+
 2014-07-18  Andy Estes  <[email protected]>
 
         [iOS] Tapping "Allow Website" on a restricted page does not bring up the keypad

Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h (171307 => 171308)


--- trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h	2014-07-21 18:26:45 UTC (rev 171307)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h	2014-07-21 18:31:53 UTC (rev 171308)
@@ -211,5 +211,7 @@
 #endif
 
 private:
+    virtual bool requiresAcceleratedCompositingForViewportConstrainedPosition() const override;
+
     WebView *m_webView;
 };

Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm (171307 => 171308)


--- trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm	2014-07-21 18:26:45 UTC (rev 171307)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm	2014-07-21 18:31:53 UTC (rev 171308)
@@ -1009,6 +1009,12 @@
 
 #endif // ENABLE(FULLSCREEN_API)
 
+bool WebChromeClient::requiresAcceleratedCompositingForViewportConstrainedPosition() const
+{
+    NSView<WebDocumentView> *documentView = [[[m_webView _selectedOrMainFrame] frameView] documentView];
+    return [documentView isKindOfClass:[WebHTMLView class]] && documentView.layer;
+}
+
 #if ENABLE(SUBTLE_CRYPTO)
 bool WebChromeClient::wrapCryptoKey(const Vector<uint8_t>& key, Vector<uint8_t>& wrappedKey) const
 {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to