Title: [195088] trunk
Revision
195088
Author
[email protected]
Date
2016-01-14 19:31:52 -0800 (Thu, 14 Jan 2016)

Log Message

Mixing Content Blocking of fonts and display:none rules causes battery drain
https://bugs.webkit.org/show_bug.cgi?id=153051
<rdar://problem/23187709>

Reviewed by Alex Christensen.

Source/WebCore:

If we have applied a rule before and we are not applying it again, don't
resolve the style again.

Test: http/tests/contentextensions/font-display-none-repeated-layout.html

* contentextensions/ContentExtensionStyleSheet.cpp:
(WebCore::ContentExtensions::ContentExtensionStyleSheet::addDisplayNoneSelector):
* contentextensions/ContentExtensionStyleSheet.h:
* dom/ExtensionStyleSheets.cpp:
(WebCore::ExtensionStyleSheets::addDisplayNoneSelector):

LayoutTests:

Make sure that layoutCount does not skyrocket.

* http/tests/contentextensions/font-display-none-repeated-layout-expected.txt: Added.
* http/tests/contentextensions/font-display-none-repeated-layout.html: Added.
* http/tests/contentextensions/font-display-none-repeated-layout.html.json: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (195087 => 195088)


--- trunk/LayoutTests/ChangeLog	2016-01-15 02:59:03 UTC (rev 195087)
+++ trunk/LayoutTests/ChangeLog	2016-01-15 03:31:52 UTC (rev 195088)
@@ -1,3 +1,17 @@
+2016-01-14  Myles C. Maxfield  <[email protected]>
+
+        Mixing Content Blocking of fonts and display:none rules causes battery drain
+        https://bugs.webkit.org/show_bug.cgi?id=153051
+        <rdar://problem/23187709>
+
+        Reviewed by Alex Christensen.
+
+        Make sure that layoutCount does not skyrocket.
+
+        * http/tests/contentextensions/font-display-none-repeated-layout-expected.txt: Added.
+        * http/tests/contentextensions/font-display-none-repeated-layout.html: Added.
+        * http/tests/contentextensions/font-display-none-repeated-layout.html.json: Added.
+
 2016-01-14  Ryosuke Niwa  <[email protected]>
 
         Add document.defineCustomElement

Added: trunk/LayoutTests/http/tests/contentextensions/font-display-none-repeated-layout-expected.txt (0 => 195088)


--- trunk/LayoutTests/http/tests/contentextensions/font-display-none-repeated-layout-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/contentextensions/font-display-none-repeated-layout-expected.txt	2016-01-15 03:31:52 UTC (rev 195088)
@@ -0,0 +1,13 @@
+CONSOLE MESSAGE: line 13: Content blocker prevented frame displaying http://127.0.0.1:8000/contentextensions/font-display-none-repeated-layout.html from loading a resource from http://127.0.0.1:8000/resources/Ahem.woff
+CONSOLE MESSAGE: Content blocker prevented frame displaying http://127.0.0.1:8000/contentextensions/font-display-none-repeated-layout.html from loading a resource from http://127.0.0.1:8000/resources/Ahem.woff
+Hello
+Make sure that a content-blocker rule which is triggered by a webfont and causes display:none on an element doesn't cause looping layouts.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS endLayoutCount - startLayoutCount < 5 is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Property changes on: trunk/LayoutTests/http/tests/contentextensions/font-display-none-repeated-layout-expected.txt
___________________________________________________________________

Added: svn:keywords

Added: svn:eol-style

Added: trunk/LayoutTests/http/tests/contentextensions/font-display-none-repeated-layout.html (0 => 195088)


--- trunk/LayoutTests/http/tests/contentextensions/font-display-none-repeated-layout.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/contentextensions/font-display-none-repeated-layout.html	2016-01-15 03:31:52 UTC (rev 195088)
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<style>
+@font-face {
+    font-family: "WebFont";
+    src: url("../resources/Ahem.woff") format("woff");
+}
+#contents {
+    font-family: "WebFont";
+}
+</style>
+</head>
+<body>
+<div id="hideme">Hello</div>
+<div id="contents">Hello</div>
+<div id="console"></div>
+<script>
+description("Make sure that a content-blocker rule which is triggered by a webfont and causes display:none on an element doesn't cause looping layouts.");
+
+window.jsTestIsAsync = true;
+
+var startLayoutCount = -1;
+var endLayoutCount = -1;
+
+if (window.internals)
+    startLayoutCount = window.internals.layoutCount;
+
+window.setTimeout(function() {
+    if (window.internals) {
+        endLayoutCount = window.internals.layoutCount;
+    }
+    shouldBeTrue("endLayoutCount - startLayoutCount < 5");
+    finishJSTest();
+}, 500);
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/http/tests/contentextensions/font-display-none-repeated-layout.html.json (0 => 195088)


--- trunk/LayoutTests/http/tests/contentextensions/font-display-none-repeated-layout.html.json	                        (rev 0)
+++ trunk/LayoutTests/http/tests/contentextensions/font-display-none-repeated-layout.html.json	2016-01-15 03:31:52 UTC (rev 195088)
@@ -0,0 +1,54 @@
+[
+    {
+        "action": {
+            "type": "css-display-none",
+            "selector": "#hideme"
+        },
+        "trigger": {
+            "url-filter": ".*",
+            "resource-type": [
+                "font"
+            ]
+        }
+    },
+    {
+        "action": {
+            "type": "block"
+        },
+        "trigger": {
+            "url-filter": ".*",
+            "resource-type": [
+                "font"
+            ]
+        }
+    },
+    {
+        "action": {
+            "type": "css-display-none",
+            "selector": "#hideme"
+        },
+        "trigger": {
+            "url-filter": ".*",
+            "resource-type": [
+                "font"
+            ],
+            "load-type": [
+                "third-party"
+            ]
+        }
+    },
+    {
+        "action": {
+            "type": "block"
+        },
+        "trigger": {
+            "url-filter": ".*",
+            "resource-type": [
+                "font"
+            ],
+            "load-type": [
+                "third-party"
+            ]
+        }
+    }
+]

Modified: trunk/Source/WebCore/ChangeLog (195087 => 195088)


--- trunk/Source/WebCore/ChangeLog	2016-01-15 02:59:03 UTC (rev 195087)
+++ trunk/Source/WebCore/ChangeLog	2016-01-15 03:31:52 UTC (rev 195088)
@@ -1,3 +1,22 @@
+2016-01-14  Myles C. Maxfield  <[email protected]>
+
+        Mixing Content Blocking of fonts and display:none rules causes battery drain
+        https://bugs.webkit.org/show_bug.cgi?id=153051
+        <rdar://problem/23187709>
+
+        Reviewed by Alex Christensen.
+
+        If we have applied a rule before and we are not applying it again, don't
+        resolve the style again.
+
+        Test: http/tests/contentextensions/font-display-none-repeated-layout.html
+
+        * contentextensions/ContentExtensionStyleSheet.cpp:
+        (WebCore::ContentExtensions::ContentExtensionStyleSheet::addDisplayNoneSelector):
+        * contentextensions/ContentExtensionStyleSheet.h:
+        * dom/ExtensionStyleSheets.cpp:
+        (WebCore::ExtensionStyleSheets::addDisplayNoneSelector):
+
 2016-01-14  Ryosuke Niwa  <[email protected]>
 
         Add document.defineCustomElement

Modified: trunk/Source/WebCore/contentextensions/ContentExtensionStyleSheet.cpp (195087 => 195088)


--- trunk/Source/WebCore/contentextensions/ContentExtensionStyleSheet.cpp	2016-01-15 02:59:03 UTC (rev 195087)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionStyleSheet.cpp	2016-01-15 03:31:52 UTC (rev 195088)
@@ -43,12 +43,12 @@
     m_styleSheet->contents().setIsUserStyleSheet(true);
 }
 
-void ContentExtensionStyleSheet::addDisplayNoneSelector(const String& selector, uint32_t selectorID)
+bool ContentExtensionStyleSheet::addDisplayNoneSelector(const String& selector, uint32_t selectorID)
 {
     ASSERT(selectorID != std::numeric_limits<uint32_t>::max());
 
     if (!m_addedSelectorIDs.add(selectorID).isNewEntry)
-        return;
+        return false;
 
     StringBuilder css;
     css.append(selector);
@@ -56,6 +56,7 @@
     css.append(ContentExtensionsBackend::displayNoneCSSRule());
     css.append('}');
     m_styleSheet->contents().parseString(css.toString());
+    return true;
 }
 
 } // namespace ContentExtensions

Modified: trunk/Source/WebCore/contentextensions/ContentExtensionStyleSheet.h (195087 => 195088)


--- trunk/Source/WebCore/contentextensions/ContentExtensionStyleSheet.h	2016-01-15 02:59:03 UTC (rev 195087)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionStyleSheet.h	2016-01-15 03:31:52 UTC (rev 195088)
@@ -46,7 +46,7 @@
         return adoptRef(*new ContentExtensionStyleSheet(document));
     }
 
-    void addDisplayNoneSelector(const String& selector, uint32_t selectorID);
+    bool addDisplayNoneSelector(const String& selector, uint32_t selectorID);
 
     CSSStyleSheet& styleSheet() { return m_styleSheet.get(); }
 

Modified: trunk/Source/WebCore/dom/ExtensionStyleSheets.cpp (195087 => 195088)


--- trunk/Source/WebCore/dom/ExtensionStyleSheets.cpp	2016-01-15 02:59:03 UTC (rev 195087)
+++ trunk/Source/WebCore/dom/ExtensionStyleSheets.cpp	2016-01-15 03:31:52 UTC (rev 195088)
@@ -179,8 +179,8 @@
         m_userStyleSheets.append(&result.iterator->value->styleSheet());
     }
 
-    result.iterator->value->addDisplayNoneSelector(selector, selectorID);
-    m_styleResolverChangedTimer.startOneShot(0);
+    if (result.iterator->value->addDisplayNoneSelector(selector, selectorID))
+        m_styleResolverChangedTimer.startOneShot(0);
 }
 
 void ExtensionStyleSheets::maybeAddContentExtensionSheet(const String& identifier, StyleSheetContents& sheet)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to