<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[201086] trunk/Source/WebCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/201086">201086</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2016-05-18 11:32:43 -0700 (Wed, 18 May 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Allow RenderStyles marked unique in matched properties cache
https://bugs.webkit.org/show_bug.cgi?id=157844
Reviewed by Andreas Kling.
Depending on content this can improve matched properties cache hit rate quite a bit and so reduce
time spent building styles.
* css/StyleBuilderCustom.h:
(WebCore::StyleBuilderCustom::applyValueContent):
Set the attr bit on render style.
* css/StyleResolver.cpp:
(WebCore::isCacheableInMatchedPropertiesCache):
Allow caching of styles marked "unique". It only means that they are not shareable by style
sharing code because there were some complex selectors in the rules used for building them. It
doesn't affect matched properties cache the cache how the properties were resolved.
We still need to test against "content: attr()" as that makes the style depend on the element
being matched. It now has a separate bit in RenderStyle.
* rendering/style/RenderStyle.cpp:
(WebCore::RenderStyle::setHasAttrContent):
Bit for "content: attr()". It also sets unique() to keep style sharing code happy.
(WebCore::requireTransformOrigin):
* rendering/style/RenderStyle.h:
(WebCore::RenderStyle::hasAttrContent):
* rendering/style/StyleRareNonInheritedData.cpp:
(WebCore::StyleRareNonInheritedData::StyleRareNonInheritedData):
(WebCore::StyleRareNonInheritedData::operator==):
* rendering/style/StyleRareNonInheritedData.h:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssStyleBuilderCustomh">trunk/Source/WebCore/css/StyleBuilderCustom.h</a></li>
<li><a href="#trunkSourceWebCorecssStyleResolvercpp">trunk/Source/WebCore/css/StyleResolver.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleRenderStylecpp">trunk/Source/WebCore/rendering/style/RenderStyle.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleRenderStyleh">trunk/Source/WebCore/rendering/style/RenderStyle.h</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleStyleRareNonInheritedDatacpp">trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleStyleRareNonInheritedDatah">trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (201085 => 201086)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-18 17:46:09 UTC (rev 201085)
+++ trunk/Source/WebCore/ChangeLog        2016-05-18 18:32:43 UTC (rev 201086)
</span><span class="lines">@@ -1,3 +1,41 @@
</span><ins>+2016-05-18 Antti Koivisto <antti@apple.com>
+
+ Allow RenderStyles marked unique in matched properties cache
+ https://bugs.webkit.org/show_bug.cgi?id=157844
+
+ Reviewed by Andreas Kling.
+
+ Depending on content this can improve matched properties cache hit rate quite a bit and so reduce
+ time spent building styles.
+
+ * css/StyleBuilderCustom.h:
+ (WebCore::StyleBuilderCustom::applyValueContent):
+
+ Set the attr bit on render style.
+
+ * css/StyleResolver.cpp:
+ (WebCore::isCacheableInMatchedPropertiesCache):
+
+ Allow caching of styles marked "unique". It only means that they are not shareable by style
+ sharing code because there were some complex selectors in the rules used for building them. It
+ doesn't affect matched properties cache the cache how the properties were resolved.
+
+ We still need to test against "content: attr()" as that makes the style depend on the element
+ being matched. It now has a separate bit in RenderStyle.
+
+ * rendering/style/RenderStyle.cpp:
+ (WebCore::RenderStyle::setHasAttrContent):
+
+ Bit for "content: attr()". It also sets unique() to keep style sharing code happy.
+
+ (WebCore::requireTransformOrigin):
+ * rendering/style/RenderStyle.h:
+ (WebCore::RenderStyle::hasAttrContent):
+ * rendering/style/StyleRareNonInheritedData.cpp:
+ (WebCore::StyleRareNonInheritedData::StyleRareNonInheritedData):
+ (WebCore::StyleRareNonInheritedData::operator==):
+ * rendering/style/StyleRareNonInheritedData.h:
+
</ins><span class="cx"> 2016-05-18 Csaba Osztrogonác <ossy@webkit.org>
</span><span class="cx">
</span><span class="cx"> Fix the allinone-build on Linux in Source/WebCore/html/HTMLElementsAllInOne.cpp
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleBuilderCustomh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleBuilderCustom.h (201085 => 201086)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleBuilderCustom.h        2016-05-18 17:46:09 UTC (rev 201085)
+++ trunk/Source/WebCore/css/StyleBuilderCustom.h        2016-05-18 18:32:43 UTC (rev 201086)
</span><span class="lines">@@ -1335,9 +1335,9 @@
</span><span class="cx"> } else if (contentValue.isAttr()) {
</span><span class="cx"> // FIXME: Can a namespace be specified for an attr(foo)?
</span><span class="cx"> if (styleResolver.style()->styleType() == NOPSEUDO)
</span><del>- styleResolver.style()->setUnique();
</del><ins>+ styleResolver.style()->setHasAttrContent();
</ins><span class="cx"> else
</span><del>- const_cast<RenderStyle*>(styleResolver.parentStyle())->setUnique();
</del><ins>+ const_cast<RenderStyle*>(styleResolver.parentStyle())->setHasAttrContent();
</ins><span class="cx"> QualifiedName attr(nullAtom, contentValue.getStringValue().impl(), nullAtom);
</span><span class="cx"> const AtomicString& value = styleResolver.element()->getAttribute(attr);
</span><span class="cx"> styleResolver.style()->setContent(value.isNull() ? emptyAtom : value.impl(), didSet);
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleResolvercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleResolver.cpp (201085 => 201086)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleResolver.cpp        2016-05-18 17:46:09 UTC (rev 201085)
+++ trunk/Source/WebCore/css/StyleResolver.cpp        2016-05-18 18:32:43 UTC (rev 201086)
</span><span class="lines">@@ -1245,7 +1245,8 @@
</span><span class="cx"> // Document::setWritingMode/DirectionSetOnDocumentElement. We can't skip the applying by caching.
</span><span class="cx"> if (&element == element.document().documentElement())
</span><span class="cx"> return false;
</span><del>- if (style->unique() || (style->styleType() != NOPSEUDO && parentStyle->unique()))
</del><ins>+ // content:attr() value depends on the element it is being applied to.
+ if (style->hasAttrContent() || (style->styleType() != NOPSEUDO && parentStyle->hasAttrContent()))
</ins><span class="cx"> return false;
</span><span class="cx"> if (style->hasAppearance())
</span><span class="cx"> return false;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleRenderStylecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/RenderStyle.cpp (201085 => 201086)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/RenderStyle.cpp        2016-05-18 17:46:09 UTC (rev 201085)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.cpp        2016-05-18 18:32:43 UTC (rev 201086)
</span><span class="lines">@@ -1073,6 +1073,12 @@
</span><span class="cx"> return rareNonInheritedData->m_altText;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void RenderStyle::setHasAttrContent()
+{
+ setUnique();
+ SET_VAR(rareNonInheritedData, m_hasAttrContent, true);
+}
+
</ins><span class="cx"> // FIXME: use affectedByTransformOrigin().
</span><span class="cx"> static inline bool requireTransformOrigin(const Vector<RefPtr<TransformOperation>>& transformOperations, RenderStyle::ApplyTransformOrigin applyOrigin)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleRenderStyleh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/RenderStyle.h (201085 => 201086)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/RenderStyle.h        2016-05-18 17:46:09 UTC (rev 201085)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.h        2016-05-18 18:32:43 UTC (rev 201086)
</span><span class="lines">@@ -1834,6 +1834,8 @@
</span><span class="cx"> void setContent(QuoteType, bool add = false);
</span><span class="cx"> void setContentAltText(const String&);
</span><span class="cx"> const String& contentAltText() const;
</span><ins>+ bool hasAttrContent() const { return rareNonInheritedData->m_hasAttrContent; }
+ void setHasAttrContent();
</ins><span class="cx">
</span><span class="cx"> const CounterDirectiveMap* counterDirectives() const;
</span><span class="cx"> CounterDirectiveMap& accessCounterDirectives();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleRareNonInheritedDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp (201085 => 201086)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp        2016-05-18 17:46:09 UTC (rev 201085)
+++ trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp        2016-05-18 18:32:43 UTC (rev 201086)
</span><span class="lines">@@ -109,6 +109,7 @@
</span><span class="cx"> , m_breakAfter(RenderStyle::initialBreakBetween())
</span><span class="cx"> , m_breakInside(RenderStyle::initialBreakInside())
</span><span class="cx"> , m_resize(RenderStyle::initialResize())
</span><ins>+ , m_hasAttrContent(false)
</ins><span class="cx"> , m_isPlaceholderStyle(false)
</span><span class="cx"> {
</span><span class="cx"> m_maskBoxImage.setMaskDefaults();
</span><span class="lines">@@ -204,6 +205,7 @@
</span><span class="cx"> , m_breakAfter(o.m_breakAfter)
</span><span class="cx"> , m_breakInside(o.m_breakInside)
</span><span class="cx"> , m_resize(o.m_resize)
</span><ins>+ , m_hasAttrContent(o.m_hasAttrContent)
</ins><span class="cx"> , m_isPlaceholderStyle(o.m_isPlaceholderStyle)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -310,6 +312,7 @@
</span><span class="cx"> && m_breakBefore == o.m_breakBefore
</span><span class="cx"> && m_breakInside == o.m_breakInside
</span><span class="cx"> && m_resize == o.m_resize
</span><ins>+ && m_hasAttrContent == o.m_hasAttrContent
</ins><span class="cx"> && m_isPlaceholderStyle == o.m_isPlaceholderStyle;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleRareNonInheritedDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.h (201085 => 201086)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.h        2016-05-18 17:46:09 UTC (rev 201085)
+++ trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.h        2016-05-18 18:32:43 UTC (rev 201086)
</span><span class="lines">@@ -227,6 +227,8 @@
</span><span class="cx"> unsigned m_breakInside : 3; // BreakInside
</span><span class="cx"> unsigned m_resize : 2; // EResize
</span><span class="cx">
</span><ins>+ unsigned m_hasAttrContent : 1;
+
</ins><span class="cx"> unsigned m_isPlaceholderStyle : 1;
</span><span class="cx">
</span><span class="cx"> private:
</span></span></pre>
</div>
</div>
</body>
</html>