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)