<!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>[210215] 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/210215">210215</a></dd>
<dt>Author</dt> <dd>darin@apple.com</dd>
<dt>Date</dt> <dd>2016-12-31 01:17:36 -0800 (Sat, 31 Dec 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Remove PassRefPtr use from the "css" directory, related cleanup
https://bugs.webkit.org/show_bug.cgi?id=166628
Reviewed by Alex Christensen.
* css/CSSCalculationValue.cpp:
(WebCore::CSSCalcBinaryOperation::create): Take RefPtr&& instead of PassRefPtr.
Also added some checks for null. Code here is really inconsistent about null;
probably should change from RefPtr to Ref at some point.
(WebCore::CSSCalcBinaryOperation::createSimplified): Ditto.
(WebCore::CSSCalcBinaryOperation::CSSCalcBinaryOperation): Take Ref&& instead
of PassRefPtr.
* css/CSSCrossfadeValue.cpp:
(WebCore::subimageKnownToBeOpaque): Take a reference instead of a pointer.
(WebCore::CSSCrossfadeValue::SubimageObserver::SubimageObserver): Moved here
from the header, and renamed.
(WebCore::CSSCrossfadeValue::SubimageObserver::imageChanged): Ditto.
(WebCore::CSSCrossfadeValue::CSSCrossfadeValue): Moved here from the header.
(WebCore::CSSCrossfadeValue::create): Ditto.
(WebCore::CSSCrossfadeValue::~CSSCrossfadeValue): Updated for data member name change.
(WebCore::CSSCrossfadeValue::fixedSize): Take a reference. Also rewrote size math to
take advantage of FloatSize multiplication and addition operators.
(WebCore::CSSCrossfadeValue::knownToBeOpaque): Take a reference.
(WebCore::CSSCrossfadeValue::loadSubimages): Set m_subimagesAreReady rather than
calling setReady on the subimage observer.
(WebCore::CSSCrossfadeValue::image): Return a raw pointer rather than a RefPtr.
Take a reference instead of a pointer.
(WebCore::CSSCrossfadeValue::crossfadeChanged): Removed unused rect argument.
Rewrote to use modern for loop.
* css/CSSCrossfadeValue.h: Updated for above changes.
* css/CSSGradientValue.cpp:
(WebCore::createGradient): Added. Helper so the function below can use Ref rather
than RefPtr, and it's also nice to factor out this "poor man's virtual function".
(WebCore::CSSGradientValue::image): Take a reference rather than a pointer.
(WebCore::clone): Added. Helper like createGradient above.
(WebCore::CSSGradientValue::gradientWithStylesResolved): Take a reference rather
than a pointer. Simplified by using the helper above.
(WebCore::CSSGradientValue::knownToBeOpaque): Removed unused argument. Rewrote to
use a modern for loop.
* css/CSSGradientValue.h: Updated for above changes.
* css/CSSImageGeneratorValue.cpp: Moved the CachedGeneratedImage class in here
from the header. Also changed it to use const and Ref.
(WebCore::CSSImageGeneratorValue::addClient): Take a reference rather than a pointer.
(WebCore::CSSImageGeneratorValue::removeClient): Ditto.
(WebCore::CSSImageGeneratorValue::cachedImageForSize): Updated since image now returns
a reference rather than a pointer.
(WebCore::CSSImageGeneratorValue::saveCachedImageForSize): Take a reference rather
than PassRefPtr.
(WebCore::CSSImageGeneratorValue::image): Take a reference rather than a pointer.
(WebCore::CSSImageGeneratorValue::fixedSize): Ditto.
(WebCore::CSSImageGeneratorValue::knownToBeOpaque): Ditto.
* css/CSSImageGeneratorValue.h: Updated for above changes.
* css/CSSValuePool.cpp:
(WebCore::CSSValuePool::createFontFaceValue): Return a RefPtr rather than PassRefPtr.
* css/CSSValuePool.h: Updated for the above.
* css/StyleBuilderConverter.h: Change convertStyleImage and convertShapeValue to
return RefPtr instead of PassRefPtr.
* css/StyleBuilderCustom.h:
(WebCore::StyleBuilderCustom::applyValueContent): Since gradientWithStylesResolved
returns a Ref now, no need to dereference it any more. This also removes reference
count churn since we are now passing a Ref temporary to a Ref&&.
* css/StyleResolver.cpp:
(WebCore::StyleResolver::styleImage): Ditto.
* platform/graphics/GradientImage.cpp:
(WebCore::GradientImage::GradientImage): Pass generator as a reference rather than
as a PassRefPtr.
(WebCore::GradientImage::draw): Updated since m_gradient is now a Ref rather than
a RefPtr.
(WebCore::GradientImage::drawPattern): Ditto.
* platform/graphics/GradientImage.h: Updated for the above changes. Make things
private rather than protected since this class is final.
* rendering/style/StyleGeneratedImage.cpp:
(WebCore::StyleGeneratedImage::imageSize): Pass renderer as a reference. Later, we
should change the interface to this function, too.
(WebCore::StyleGeneratedImage::addClient): Ditto.
(WebCore::StyleGeneratedImage::removeClient): Ditto.
(WebCore::StyleGeneratedImage::image): Ditto.
(WebCore::StyleGeneratedImage::knownToBeOpaque): Ditto.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSCalculationValuecpp">trunk/Source/WebCore/css/CSSCalculationValue.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSCrossfadeValuecpp">trunk/Source/WebCore/css/CSSCrossfadeValue.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSCrossfadeValueh">trunk/Source/WebCore/css/CSSCrossfadeValue.h</a></li>
<li><a href="#trunkSourceWebCorecssCSSGradientValuecpp">trunk/Source/WebCore/css/CSSGradientValue.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSGradientValueh">trunk/Source/WebCore/css/CSSGradientValue.h</a></li>
<li><a href="#trunkSourceWebCorecssCSSImageGeneratorValuecpp">trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSImageGeneratorValueh">trunk/Source/WebCore/css/CSSImageGeneratorValue.h</a></li>
<li><a href="#trunkSourceWebCorecssCSSValuePoolcpp">trunk/Source/WebCore/css/CSSValuePool.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSValuePoolh">trunk/Source/WebCore/css/CSSValuePool.h</a></li>
<li><a href="#trunkSourceWebCorecssStyleBuilderConverterh">trunk/Source/WebCore/css/StyleBuilderConverter.h</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="#trunkSourceWebCoreplatformgraphicsGradientImagecpp">trunk/Source/WebCore/platform/graphics/GradientImage.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGradientImageh">trunk/Source/WebCore/platform/graphics/GradientImage.h</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleStyleGeneratedImagecpp">trunk/Source/WebCore/rendering/style/StyleGeneratedImage.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/ChangeLog        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -1,3 +1,92 @@
</span><ins>+2016-12-30 Darin Adler <darin@apple.com>
+
+ Remove PassRefPtr use from the "css" directory, related cleanup
+ https://bugs.webkit.org/show_bug.cgi?id=166628
+
+ Reviewed by Alex Christensen.
+
+ * css/CSSCalculationValue.cpp:
+ (WebCore::CSSCalcBinaryOperation::create): Take RefPtr&& instead of PassRefPtr.
+ Also added some checks for null. Code here is really inconsistent about null;
+ probably should change from RefPtr to Ref at some point.
+ (WebCore::CSSCalcBinaryOperation::createSimplified): Ditto.
+ (WebCore::CSSCalcBinaryOperation::CSSCalcBinaryOperation): Take Ref&& instead
+ of PassRefPtr.
+
+ * css/CSSCrossfadeValue.cpp:
+ (WebCore::subimageKnownToBeOpaque): Take a reference instead of a pointer.
+ (WebCore::CSSCrossfadeValue::SubimageObserver::SubimageObserver): Moved here
+ from the header, and renamed.
+ (WebCore::CSSCrossfadeValue::SubimageObserver::imageChanged): Ditto.
+ (WebCore::CSSCrossfadeValue::CSSCrossfadeValue): Moved here from the header.
+ (WebCore::CSSCrossfadeValue::create): Ditto.
+ (WebCore::CSSCrossfadeValue::~CSSCrossfadeValue): Updated for data member name change.
+ (WebCore::CSSCrossfadeValue::fixedSize): Take a reference. Also rewrote size math to
+ take advantage of FloatSize multiplication and addition operators.
+ (WebCore::CSSCrossfadeValue::knownToBeOpaque): Take a reference.
+ (WebCore::CSSCrossfadeValue::loadSubimages): Set m_subimagesAreReady rather than
+ calling setReady on the subimage observer.
+ (WebCore::CSSCrossfadeValue::image): Return a raw pointer rather than a RefPtr.
+ Take a reference instead of a pointer.
+ (WebCore::CSSCrossfadeValue::crossfadeChanged): Removed unused rect argument.
+ Rewrote to use modern for loop.
+ * css/CSSCrossfadeValue.h: Updated for above changes.
+
+ * css/CSSGradientValue.cpp:
+ (WebCore::createGradient): Added. Helper so the function below can use Ref rather
+ than RefPtr, and it's also nice to factor out this "poor man's virtual function".
+ (WebCore::CSSGradientValue::image): Take a reference rather than a pointer.
+ (WebCore::clone): Added. Helper like createGradient above.
+ (WebCore::CSSGradientValue::gradientWithStylesResolved): Take a reference rather
+ than a pointer. Simplified by using the helper above.
+ (WebCore::CSSGradientValue::knownToBeOpaque): Removed unused argument. Rewrote to
+ use a modern for loop.
+ * css/CSSGradientValue.h: Updated for above changes.
+
+ * css/CSSImageGeneratorValue.cpp: Moved the CachedGeneratedImage class in here
+ from the header. Also changed it to use const and Ref.
+ (WebCore::CSSImageGeneratorValue::addClient): Take a reference rather than a pointer.
+ (WebCore::CSSImageGeneratorValue::removeClient): Ditto.
+ (WebCore::CSSImageGeneratorValue::cachedImageForSize): Updated since image now returns
+ a reference rather than a pointer.
+ (WebCore::CSSImageGeneratorValue::saveCachedImageForSize): Take a reference rather
+ than PassRefPtr.
+ (WebCore::CSSImageGeneratorValue::image): Take a reference rather than a pointer.
+ (WebCore::CSSImageGeneratorValue::fixedSize): Ditto.
+ (WebCore::CSSImageGeneratorValue::knownToBeOpaque): Ditto.
+ * css/CSSImageGeneratorValue.h: Updated for above changes.
+
+ * css/CSSValuePool.cpp:
+ (WebCore::CSSValuePool::createFontFaceValue): Return a RefPtr rather than PassRefPtr.
+ * css/CSSValuePool.h: Updated for the above.
+
+ * css/StyleBuilderConverter.h: Change convertStyleImage and convertShapeValue to
+ return RefPtr instead of PassRefPtr.
+
+ * css/StyleBuilderCustom.h:
+ (WebCore::StyleBuilderCustom::applyValueContent): Since gradientWithStylesResolved
+ returns a Ref now, no need to dereference it any more. This also removes reference
+ count churn since we are now passing a Ref temporary to a Ref&&.
+ * css/StyleResolver.cpp:
+ (WebCore::StyleResolver::styleImage): Ditto.
+
+ * platform/graphics/GradientImage.cpp:
+ (WebCore::GradientImage::GradientImage): Pass generator as a reference rather than
+ as a PassRefPtr.
+ (WebCore::GradientImage::draw): Updated since m_gradient is now a Ref rather than
+ a RefPtr.
+ (WebCore::GradientImage::drawPattern): Ditto.
+ * platform/graphics/GradientImage.h: Updated for the above changes. Make things
+ private rather than protected since this class is final.
+
+ * rendering/style/StyleGeneratedImage.cpp:
+ (WebCore::StyleGeneratedImage::imageSize): Pass renderer as a reference. Later, we
+ should change the interface to this function, too.
+ (WebCore::StyleGeneratedImage::addClient): Ditto.
+ (WebCore::StyleGeneratedImage::removeClient): Ditto.
+ (WebCore::StyleGeneratedImage::image): Ditto.
+ (WebCore::StyleGeneratedImage::knownToBeOpaque): Ditto.
+
</ins><span class="cx"> 2016-12-30 Olivier Blin <olivier.blin@softathome.com>
</span><span class="cx">
</span><span class="cx"> [EFL] fix buffer over-read in RenderThemeEfl::mediaControlsStyleSheet()
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSCalculationValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSCalculationValue.cpp (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSCalculationValue.cpp        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/CSSCalculationValue.cpp        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -200,7 +200,7 @@
</span><span class="cx">
</span><span class="cx"> static RefPtr<CSSCalcPrimitiveValue> create(double value, CSSPrimitiveValue::UnitType type, bool isInteger)
</span><span class="cx"> {
</span><del>- if (std::isnan(value) || std::isinf(value))
</del><ins>+ if (!std::isfinite(value))
</ins><span class="cx"> return nullptr;
</span><span class="cx"> return adoptRef(new CSSCalcPrimitiveValue(CSSPrimitiveValue::create(value, type), isInteger));
</span><span class="cx"> }
</span><span class="lines">@@ -341,23 +341,27 @@
</span><span class="cx"> class CSSCalcBinaryOperation final : public CSSCalcExpressionNode {
</span><span class="cx"> WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><del>- static RefPtr<CSSCalcBinaryOperation> create(CalcOperator op, PassRefPtr<CSSCalcExpressionNode> leftSide, PassRefPtr<CSSCalcExpressionNode> rightSide)
</del><ins>+ static RefPtr<CSSCalcBinaryOperation> create(CalcOperator op, RefPtr<CSSCalcExpressionNode>&& leftSide, RefPtr<CSSCalcExpressionNode>&& rightSide)
</ins><span class="cx"> {
</span><ins>+ if (!leftSide || !rightSide)
+ return nullptr;
+
</ins><span class="cx"> ASSERT(leftSide->category() < CalcOther);
</span><span class="cx"> ASSERT(rightSide->category() < CalcOther);
</span><span class="cx">
</span><del>- CalculationCategory newCategory = determineCategory(*leftSide, *rightSide, op);
-
</del><ins>+ auto newCategory = determineCategory(*leftSide, *rightSide, op);
</ins><span class="cx"> if (newCategory == CalcOther)
</span><span class="cx"> return nullptr;
</span><del>-
- return adoptRef(new CSSCalcBinaryOperation(newCategory, op, leftSide, rightSide));
</del><ins>+ return adoptRef(new CSSCalcBinaryOperation(newCategory, op, leftSide.releaseNonNull(), rightSide.releaseNonNull()));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- static RefPtr<CSSCalcExpressionNode> createSimplified(CalcOperator op, PassRefPtr<CSSCalcExpressionNode> leftSide, PassRefPtr<CSSCalcExpressionNode> rightSide)
</del><ins>+ static RefPtr<CSSCalcExpressionNode> createSimplified(CalcOperator op, RefPtr<CSSCalcExpressionNode>&& leftSide, RefPtr<CSSCalcExpressionNode>&& rightSide)
</ins><span class="cx"> {
</span><del>- CalculationCategory leftCategory = leftSide->category();
- CalculationCategory rightCategory = rightSide->category();
</del><ins>+ if (!leftSide || !rightSide)
+ return nullptr;
+
+ auto leftCategory = leftSide->category();
+ auto rightCategory = rightSide->category();
</ins><span class="cx"> ASSERT(leftCategory < CalcOther);
</span><span class="cx"> ASSERT(rightCategory < CalcOther);
</span><span class="cx">
</span><span class="lines">@@ -391,25 +395,25 @@
</span><span class="cx"> } else {
</span><span class="cx"> // Simplify multiplying or dividing by a number for simplifiable types.
</span><span class="cx"> ASSERT(op == CalcMultiply || op == CalcDivide);
</span><del>- CSSCalcExpressionNode* numberSide = getNumberSide(*leftSide, *rightSide);
</del><ins>+ auto* numberSide = getNumberSide(*leftSide, *rightSide);
</ins><span class="cx"> if (!numberSide)
</span><del>- return create(op, leftSide, rightSide);
</del><ins>+ return create(op, leftSide.releaseNonNull(), rightSide.releaseNonNull());
</ins><span class="cx"> if (numberSide == leftSide && op == CalcDivide)
</span><span class="cx"> return nullptr;
</span><del>- CSSCalcExpressionNode* otherSide = leftSide == numberSide ? rightSide.get() : leftSide.get();
</del><ins>+ auto& otherSide = leftSide == numberSide ? *rightSide : *leftSide;
</ins><span class="cx">
</span><span class="cx"> double number = numberSide->doubleValue();
</span><del>- if (std::isnan(number) || std::isinf(number))
</del><ins>+ if (!std::isfinite(number))
</ins><span class="cx"> return nullptr;
</span><span class="cx"> if (op == CalcDivide && !number)
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><del>- CSSPrimitiveValue::UnitType otherType = otherSide->primitiveType();
</del><ins>+ auto otherType = otherSide.primitiveType();
</ins><span class="cx"> if (hasDoubleValue(otherType))
</span><del>- return CSSCalcPrimitiveValue::create(evaluateOperator(op, otherSide->doubleValue(), number), otherType, isInteger);
</del><ins>+ return CSSCalcPrimitiveValue::create(evaluateOperator(op, otherSide.doubleValue(), number), otherType, isInteger);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- return create(op, leftSide, rightSide);
</del><ins>+ return create(op, leftSide.releaseNonNull(), rightSide.releaseNonNull());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> private:
</span><span class="lines">@@ -420,10 +424,10 @@
</span><span class="cx">
</span><span class="cx"> std::unique_ptr<CalcExpressionNode> createCalcExpression(const CSSToLengthConversionData& conversionData) const final
</span><span class="cx"> {
</span><del>- std::unique_ptr<CalcExpressionNode> left(m_leftSide->createCalcExpression(conversionData));
</del><ins>+ auto left = m_leftSide->createCalcExpression(conversionData);
</ins><span class="cx"> if (!left)
</span><span class="cx"> return nullptr;
</span><del>- std::unique_ptr<CalcExpressionNode> right(m_rightSide->createCalcExpression(conversionData));
</del><ins>+ auto right = m_rightSide->createCalcExpression(conversionData);
</ins><span class="cx"> if (!right)
</span><span class="cx"> return nullptr;
</span><span class="cx"> return std::make_unique<CalcExpressionBinaryOperation>(WTFMove(left), WTFMove(right), m_operator);
</span><span class="lines">@@ -505,10 +509,10 @@
</span><span class="cx"> return CSSPrimitiveValue::CSS_UNKNOWN;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- CSSCalcBinaryOperation(CalculationCategory category, CalcOperator op, PassRefPtr<CSSCalcExpressionNode> leftSide, PassRefPtr<CSSCalcExpressionNode> rightSide)
- : CSSCalcExpressionNode(category, isIntegerResult(op, *leftSide, *rightSide))
- , m_leftSide(leftSide)
- , m_rightSide(rightSide)
</del><ins>+ CSSCalcBinaryOperation(CalculationCategory category, CalcOperator op, Ref<CSSCalcExpressionNode>&& leftSide, Ref<CSSCalcExpressionNode>&& rightSide)
+ : CSSCalcExpressionNode(category, isIntegerResult(op, leftSide.get(), rightSide.get()))
+ , m_leftSide(WTFMove(leftSide))
+ , m_rightSide(WTFMove(rightSide))
</ins><span class="cx"> , m_operator(op)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -632,7 +636,7 @@
</span><span class="cx"> if (!parseValueTerm(tokens, depth, &rhs))
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- result->value = CSSCalcBinaryOperation::createSimplified(static_cast<CalcOperator>(operatorCharacter), result->value, rhs.value);
</del><ins>+ result->value = CSSCalcBinaryOperation::createSimplified(static_cast<CalcOperator>(operatorCharacter), WTFMove(result->value), WTFMove(rhs.value));
</ins><span class="cx">
</span><span class="cx"> if (!result->value)
</span><span class="cx"> return false;
</span><span class="lines">@@ -664,7 +668,7 @@
</span><span class="cx"> if (!parseValueMultiplicativeExpression(tokens, depth, &rhs))
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- result->value = CSSCalcBinaryOperation::createSimplified(static_cast<CalcOperator>(operatorCharacter), result->value, rhs.value);
</del><ins>+ result->value = CSSCalcBinaryOperation::createSimplified(static_cast<CalcOperator>(operatorCharacter), WTFMove(result->value), WTFMove(rhs.value));
</ins><span class="cx"> if (!result->value)
</span><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="lines">@@ -689,7 +693,7 @@
</span><span class="cx"> switch (node.type()) {
</span><span class="cx"> case CalcExpressionNodeNumber: {
</span><span class="cx"> float value = toCalcExpressionNumber(node).value();
</span><del>- return CSSCalcPrimitiveValue::create(CSSPrimitiveValue::create(value, CSSPrimitiveValue::CSS_NUMBER), value == truncf(value));
</del><ins>+ return CSSCalcPrimitiveValue::create(CSSPrimitiveValue::create(value, CSSPrimitiveValue::CSS_NUMBER), value == std::trunc(value));
</ins><span class="cx"> }
</span><span class="cx"> case CalcExpressionNodeLength:
</span><span class="cx"> return createCSS(toCalcExpressionLength(node).length(), style);
</span><span class="lines">@@ -705,9 +709,7 @@
</span><span class="cx"> }
</span><span class="cx"> case CalcExpressionNodeUndefined:
</span><span class="cx"> ASSERT_NOT_REACHED();
</span><del>- return nullptr;
</del><span class="cx"> }
</span><del>- ASSERT_NOT_REACHED();
</del><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -729,9 +731,7 @@
</span><span class="cx"> case Relative:
</span><span class="cx"> case Undefined:
</span><span class="cx"> ASSERT_NOT_REACHED();
</span><del>- return nullptr;
</del><span class="cx"> }
</span><del>- ASSERT_NOT_REACHED();
</del><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -738,14 +738,15 @@
</span><span class="cx"> RefPtr<CSSCalcValue> CSSCalcValue::create(const CSSParserTokenRange& tokens, ValueRange range)
</span><span class="cx"> {
</span><span class="cx"> CSSCalcExpressionNodeParser parser;
</span><del>- RefPtr<CSSCalcExpressionNode> expression = parser.parseCalc(tokens);
- return expression ? adoptRef(new CSSCalcValue(expression.releaseNonNull(), range != ValueRangeAll)) : nullptr;
-
</del><ins>+ auto expression = parser.parseCalc(tokens);
+ if (!expression)
+ return nullptr;
+ return adoptRef(new CSSCalcValue(expression.releaseNonNull(), range != ValueRangeAll));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<CSSCalcValue> CSSCalcValue::create(const CalculationValue& value, const RenderStyle& style)
</span><span class="cx"> {
</span><del>- RefPtr<CSSCalcExpressionNode> expression = createCSS(value.expression(), style);
</del><ins>+ auto expression = createCSS(value.expression(), style);
</ins><span class="cx"> if (!expression)
</span><span class="cx"> return nullptr;
</span><span class="cx"> return adoptRef(new CSSCalcValue(expression.releaseNonNull(), value.shouldClampToNonNegative()));
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSCrossfadeValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSCrossfadeValue.cpp (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSCrossfadeValue.cpp        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/CSSCrossfadeValue.cpp        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -45,10 +45,10 @@
</span><span class="cx"> return blend(from, to, progress);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static bool subimageKnownToBeOpaque(const CSSValue& value, const RenderElement* renderer)
</del><ins>+static bool subimageKnownToBeOpaque(const CSSValue& value, const RenderElement& renderer)
</ins><span class="cx"> {
</span><span class="cx"> if (is<CSSImageValue>(value))
</span><del>- return downcast<CSSImageValue>(value).knownToBeOpaque(renderer);
</del><ins>+ return downcast<CSSImageValue>(value).knownToBeOpaque(&renderer);
</ins><span class="cx">
</span><span class="cx"> if (is<CSSImageGeneratorValue>(value))
</span><span class="cx"> return downcast<CSSImageGeneratorValue>(value).knownToBeOpaque(renderer);
</span><span class="lines">@@ -58,12 +58,37 @@
</span><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+inline CSSCrossfadeValue::SubimageObserver::SubimageObserver(CSSCrossfadeValue& owner)
+ : m_owner(owner)
+{
+}
+
+void CSSCrossfadeValue::SubimageObserver::imageChanged(CachedImage*, const IntRect*)
+{
+ m_owner.crossfadeChanged();
+}
+
+inline CSSCrossfadeValue::CSSCrossfadeValue(Ref<CSSValue>&& fromValue, Ref<CSSValue>&& toValue, Ref<CSSPrimitiveValue>&& percentageValue, bool prefixed)
+ : CSSImageGeneratorValue(CrossfadeClass)
+ , m_fromValue(WTFMove(fromValue))
+ , m_toValue(WTFMove(toValue))
+ , m_percentageValue(WTFMove(percentageValue))
+ , m_subimageObserver(*this)
+ , m_isPrefixed(prefixed)
+{
+}
+
+Ref<CSSCrossfadeValue> CSSCrossfadeValue::create(Ref<CSSValue>&& fromValue, Ref<CSSValue>&& toValue, Ref<CSSPrimitiveValue>&& percentageValue, bool prefixed)
+{
+ return adoptRef(*new CSSCrossfadeValue(WTFMove(fromValue), WTFMove(toValue), WTFMove(percentageValue), prefixed));
+}
+
</ins><span class="cx"> CSSCrossfadeValue::~CSSCrossfadeValue()
</span><span class="cx"> {
</span><span class="cx"> if (m_cachedFromImage)
</span><del>- m_cachedFromImage->removeClient(m_crossfadeSubimageObserver);
</del><ins>+ m_cachedFromImage->removeClient(m_subimageObserver);
</ins><span class="cx"> if (m_cachedToImage)
</span><del>- m_cachedToImage->removeClient(m_crossfadeSubimageObserver);
</del><ins>+ m_cachedToImage->removeClient(m_subimageObserver);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> String CSSCrossfadeValue::customCSSText() const
</span><span class="lines">@@ -82,7 +107,7 @@
</span><span class="cx"> return result.toString();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-FloatSize CSSCrossfadeValue::fixedSize(const RenderElement* renderer)
</del><ins>+FloatSize CSSCrossfadeValue::fixedSize(const RenderElement& renderer)
</ins><span class="cx"> {
</span><span class="cx"> float percentage = m_percentageValue->floatValue();
</span><span class="cx"> float inversePercentage = 1 - percentage;
</span><span class="lines">@@ -89,17 +114,17 @@
</span><span class="cx">
</span><span class="cx"> // FIXME: Skip Content Security Policy check when cross fade is applied to an element in a user agent shadow tree.
</span><span class="cx"> // See <https://bugs.webkit.org/show_bug.cgi?id=146663>.
</span><del>- ResourceLoaderOptions options = CachedResourceLoader::defaultCachedResourceOptions();
</del><ins>+ auto options = CachedResourceLoader::defaultCachedResourceOptions();
</ins><span class="cx">
</span><del>- CachedResourceLoader& cachedResourceLoader = renderer->document().cachedResourceLoader();
- CachedImage* cachedFromImage = cachedImageForCSSValue(m_fromValue, cachedResourceLoader, options);
- CachedImage* cachedToImage = cachedImageForCSSValue(m_toValue, cachedResourceLoader, options);
</del><ins>+ auto& cachedResourceLoader = renderer.document().cachedResourceLoader();
+ auto* cachedFromImage = cachedImageForCSSValue(m_fromValue, cachedResourceLoader, options);
+ auto* cachedToImage = cachedImageForCSSValue(m_toValue, cachedResourceLoader, options);
</ins><span class="cx">
</span><span class="cx"> if (!cachedFromImage || !cachedToImage)
</span><span class="cx"> return FloatSize();
</span><span class="cx">
</span><del>- FloatSize fromImageSize = cachedFromImage->imageForRenderer(renderer)->size();
- FloatSize toImageSize = cachedToImage->imageForRenderer(renderer)->size();
</del><ins>+ FloatSize fromImageSize = cachedFromImage->imageForRenderer(&renderer)->size();
+ FloatSize toImageSize = cachedToImage->imageForRenderer(&renderer)->size();
</ins><span class="cx">
</span><span class="cx"> // Rounding issues can cause transitions between images of equal size to return
</span><span class="cx"> // a different fixed size; avoid performing the interpolation if the images are the same size.
</span><span class="lines">@@ -106,8 +131,7 @@
</span><span class="cx"> if (fromImageSize == toImageSize)
</span><span class="cx"> return fromImageSize;
</span><span class="cx">
</span><del>- return FloatSize(fromImageSize.width() * inversePercentage + toImageSize.width() * percentage,
- fromImageSize.height() * inversePercentage + toImageSize.height() * percentage);
</del><ins>+ return fromImageSize * inversePercentage + toImageSize * percentage;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool CSSCrossfadeValue::isPending() const
</span><span class="lines">@@ -116,15 +140,16 @@
</span><span class="cx"> || CSSImageGeneratorValue::subimageIsPending(m_toValue);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool CSSCrossfadeValue::knownToBeOpaque(const RenderElement* renderer) const
</del><ins>+bool CSSCrossfadeValue::knownToBeOpaque(const RenderElement& renderer) const
</ins><span class="cx"> {
</span><del>- return subimageKnownToBeOpaque(m_fromValue, renderer) && subimageKnownToBeOpaque(m_toValue, renderer);
</del><ins>+ return subimageKnownToBeOpaque(m_fromValue, renderer)
+ && subimageKnownToBeOpaque(m_toValue, renderer);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void CSSCrossfadeValue::loadSubimages(CachedResourceLoader& cachedResourceLoader, const ResourceLoaderOptions& options)
</span><span class="cx"> {
</span><del>- CachedResourceHandle<CachedImage> oldCachedFromImage = m_cachedFromImage;
- CachedResourceHandle<CachedImage> oldCachedToImage = m_cachedToImage;
</del><ins>+ auto oldCachedFromImage = m_cachedFromImage;
+ auto oldCachedToImage = m_cachedToImage;
</ins><span class="cx">
</span><span class="cx"> m_cachedFromImage = CSSImageGeneratorValue::cachedImageForCSSValue(m_fromValue, cachedResourceLoader, options);
</span><span class="cx"> m_cachedToImage = CSSImageGeneratorValue::cachedImageForCSSValue(m_toValue, cachedResourceLoader, options);
</span><span class="lines">@@ -131,22 +156,23 @@
</span><span class="cx">
</span><span class="cx"> if (m_cachedFromImage != oldCachedFromImage) {
</span><span class="cx"> if (oldCachedFromImage)
</span><del>- oldCachedFromImage->removeClient(m_crossfadeSubimageObserver);
</del><ins>+ oldCachedFromImage->removeClient(m_subimageObserver);
</ins><span class="cx"> if (m_cachedFromImage)
</span><del>- m_cachedFromImage->addClient(m_crossfadeSubimageObserver);
</del><ins>+ m_cachedFromImage->addClient(m_subimageObserver);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (m_cachedToImage != oldCachedToImage) {
</span><span class="cx"> if (oldCachedToImage)
</span><del>- oldCachedToImage->removeClient(m_crossfadeSubimageObserver);
</del><ins>+ oldCachedToImage->removeClient(m_subimageObserver);
</ins><span class="cx"> if (m_cachedToImage)
</span><del>- m_cachedToImage->addClient(m_crossfadeSubimageObserver);
</del><ins>+ m_cachedToImage->addClient(m_subimageObserver);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- m_crossfadeSubimageObserver.setReady(true);
</del><ins>+ // FIXME: Unclear why this boolean adds any value; for now keeping it around to avoid changing semantics.
+ m_subimagesAreReady = true;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<Image> CSSCrossfadeValue::image(RenderElement* renderer, const FloatSize& size)
</del><ins>+Image* CSSCrossfadeValue::image(RenderElement& renderer, const FloatSize& size)
</ins><span class="cx"> {
</span><span class="cx"> if (size.isEmpty())
</span><span class="cx"> return nullptr;
</span><span class="lines">@@ -153,38 +179,33 @@
</span><span class="cx">
</span><span class="cx"> // FIXME: Skip Content Security Policy check when cross fade is applied to an element in a user agent shadow tree.
</span><span class="cx"> // See <https://bugs.webkit.org/show_bug.cgi?id=146663>.
</span><del>- ResourceLoaderOptions options = CachedResourceLoader::defaultCachedResourceOptions();
</del><ins>+ auto options = CachedResourceLoader::defaultCachedResourceOptions();
</ins><span class="cx">
</span><del>- CachedResourceLoader& cachedResourceLoader = renderer->document().cachedResourceLoader();
- CachedImage* cachedFromImage = cachedImageForCSSValue(m_fromValue, cachedResourceLoader, options);
- CachedImage* cachedToImage = cachedImageForCSSValue(m_toValue, cachedResourceLoader, options);
</del><ins>+ auto& cachedResourceLoader = renderer.document().cachedResourceLoader();
+ auto* cachedFromImage = cachedImageForCSSValue(m_fromValue, cachedResourceLoader, options);
+ auto* cachedToImage = cachedImageForCSSValue(m_toValue, cachedResourceLoader, options);
</ins><span class="cx">
</span><span class="cx"> if (!cachedFromImage || !cachedToImage)
</span><span class="cx"> return Image::nullImage();
</span><span class="cx">
</span><del>- Image* fromImage = cachedFromImage->imageForRenderer(renderer);
- Image* toImage = cachedToImage->imageForRenderer(renderer);
</del><ins>+ auto* fromImage = cachedFromImage->imageForRenderer(&renderer);
+ auto* toImage = cachedToImage->imageForRenderer(&renderer);
</ins><span class="cx">
</span><span class="cx"> if (!fromImage || !toImage)
</span><span class="cx"> return Image::nullImage();
</span><span class="cx">
</span><span class="cx"> m_generatedImage = CrossfadeGeneratedImage::create(*fromImage, *toImage, m_percentageValue->floatValue(), fixedSize(renderer), size);
</span><del>-
- return m_generatedImage;
</del><ins>+ return m_generatedImage.get();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void CSSCrossfadeValue::crossfadeChanged(const IntRect&)
</del><ins>+inline void CSSCrossfadeValue::crossfadeChanged()
</ins><span class="cx"> {
</span><del>- for (auto it = clients().begin(), end = clients().end(); it != end; ++it)
- it->key->imageChanged(static_cast<WrappedImagePtr>(this));
</del><ins>+ if (!m_subimagesAreReady)
+ return;
+ for (auto& client : clients())
+ client.key->imageChanged(this);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void CSSCrossfadeValue::CrossfadeSubimageObserverProxy::imageChanged(CachedImage*, const IntRect* rect)
-{
- if (m_ready)
- m_ownerValue->crossfadeChanged(*rect);
-}
-
</del><span class="cx"> bool CSSCrossfadeValue::traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const
</span><span class="cx"> {
</span><span class="cx"> if (m_cachedFromImage && handler(*m_cachedFromImage))
</span><span class="lines">@@ -197,8 +218,10 @@
</span><span class="cx"> RefPtr<CSSCrossfadeValue> CSSCrossfadeValue::blend(const CSSCrossfadeValue& from, double progress) const
</span><span class="cx"> {
</span><span class="cx"> ASSERT(equalInputImages(from));
</span><ins>+
</ins><span class="cx"> if (!m_cachedToImage || !m_cachedFromImage)
</span><span class="cx"> return nullptr;
</span><ins>+
</ins><span class="cx"> auto fromImageValue = CSSImageValue::create(*m_cachedFromImage);
</span><span class="cx"> auto toImageValue = CSSImageValue::create(*m_cachedToImage);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSCrossfadeValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSCrossfadeValue.h (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSCrossfadeValue.h        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/CSSCrossfadeValue.h        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -28,36 +28,26 @@
</span><span class="cx"> #include "CachedImageClient.h"
</span><span class="cx"> #include "CachedResourceHandle.h"
</span><span class="cx"> #include "CSSImageGeneratorValue.h"
</span><del>-#include "CSSPrimitiveValue.h"
-#include "Image.h"
-#include "ImageObserver.h"
</del><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-class CachedImage;
-class CrossfadeSubimageObserverProxy;
-class RenderElement;
-class Document;
</del><ins>+class CSSPrimitiveValue;
</ins><span class="cx">
</span><span class="cx"> class CSSCrossfadeValue final : public CSSImageGeneratorValue {
</span><del>- friend class CrossfadeSubimageObserverProxy;
</del><span class="cx"> public:
</span><del>- static Ref<CSSCrossfadeValue> create(Ref<CSSValue>&& fromValue, Ref<CSSValue>&& toValue, Ref<CSSPrimitiveValue>&& percentageValue, bool prefixed = false)
- {
- return adoptRef(*new CSSCrossfadeValue(WTFMove(fromValue), WTFMove(toValue), WTFMove(percentageValue), prefixed));
- }
</del><ins>+ static Ref<CSSCrossfadeValue> create(Ref<CSSValue>&& fromValue, Ref<CSSValue>&& toValue, Ref<CSSPrimitiveValue>&& percentageValue, bool prefixed = false);
</ins><span class="cx">
</span><span class="cx"> ~CSSCrossfadeValue();
</span><span class="cx">
</span><span class="cx"> String customCSSText() const;
</span><span class="cx">
</span><del>- RefPtr<Image> image(RenderElement*, const FloatSize&);
</del><ins>+ Image* image(RenderElement&, const FloatSize&);
</ins><span class="cx"> bool isFixedSize() const { return true; }
</span><del>- FloatSize fixedSize(const RenderElement*);
</del><ins>+ FloatSize fixedSize(const RenderElement&);
</ins><span class="cx">
</span><span class="cx"> bool isPrefixed() const { return m_isPrefixed; }
</span><span class="cx"> bool isPending() const;
</span><del>- bool knownToBeOpaque(const RenderElement*) const;
</del><ins>+ bool knownToBeOpaque(const RenderElement&) const;
</ins><span class="cx">
</span><span class="cx"> void loadSubimages(CachedResourceLoader&, const ResourceLoaderOptions&);
</span><span class="cx">
</span><span class="lines">@@ -66,37 +56,20 @@
</span><span class="cx"> RefPtr<CSSCrossfadeValue> blend(const CSSCrossfadeValue&, double) const;
</span><span class="cx">
</span><span class="cx"> bool equals(const CSSCrossfadeValue&) const;
</span><del>-
</del><span class="cx"> bool equalInputImages(const CSSCrossfadeValue&) const;
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- CSSCrossfadeValue(Ref<CSSValue>&& fromValue, Ref<CSSValue>&& toValue, Ref<CSSPrimitiveValue>&& percentageValue, bool prefixed)
- : CSSImageGeneratorValue(CrossfadeClass)
- , m_fromValue(WTFMove(fromValue))
- , m_toValue(WTFMove(toValue))
- , m_percentageValue(WTFMove(percentageValue))
- , m_crossfadeSubimageObserver(this)
- , m_isPrefixed(prefixed)
- {
- }
</del><ins>+ CSSCrossfadeValue(Ref<CSSValue>&& fromValue, Ref<CSSValue>&& toValue, Ref<CSSPrimitiveValue>&& percentageValue, bool prefixed);
</ins><span class="cx">
</span><del>- class CrossfadeSubimageObserverProxy final : public CachedImageClient {
</del><ins>+ class SubimageObserver final : public CachedImageClient {
</ins><span class="cx"> public:
</span><del>- CrossfadeSubimageObserverProxy(CSSCrossfadeValue* ownerValue)
- : m_ownerValue(ownerValue)
- , m_ready(false)
- {
- }
-
- virtual ~CrossfadeSubimageObserverProxy() { }
- void imageChanged(CachedImage*, const IntRect* = nullptr) final;
- void setReady(bool ready) { m_ready = ready; }
</del><ins>+ SubimageObserver(CSSCrossfadeValue&);
</ins><span class="cx"> private:
</span><del>- CSSCrossfadeValue* m_ownerValue;
- bool m_ready;
</del><ins>+ void imageChanged(CachedImage*, const IntRect*) final;
+ CSSCrossfadeValue& m_owner;
</ins><span class="cx"> };
</span><span class="cx">
</span><del>- void crossfadeChanged(const IntRect&);
</del><ins>+ void crossfadeChanged();
</ins><span class="cx">
</span><span class="cx"> Ref<CSSValue> m_fromValue;
</span><span class="cx"> Ref<CSSValue> m_toValue;
</span><span class="lines">@@ -107,8 +80,9 @@
</span><span class="cx">
</span><span class="cx"> RefPtr<Image> m_generatedImage;
</span><span class="cx">
</span><del>- CrossfadeSubimageObserverProxy m_crossfadeSubimageObserver;
</del><ins>+ SubimageObserver m_subimageObserver;
</ins><span class="cx"> bool m_isPrefixed { false };
</span><ins>+ bool m_subimagesAreReady { false };
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSGradientValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSGradientValue.cpp (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSGradientValue.cpp        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/CSSGradientValue.cpp        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -30,10 +30,8 @@
</span><span class="cx"> #include "CSSToLengthConversionData.h"
</span><span class="cx"> #include "CSSValueKeywords.h"
</span><span class="cx"> #include "FloatSize.h"
</span><del>-#include "FloatSizeHash.h"
</del><span class="cx"> #include "Gradient.h"
</span><span class="cx"> #include "GradientImage.h"
</span><del>-#include "Image.h"
</del><span class="cx"> #include "NodeRenderStyle.h"
</span><span class="cx"> #include "Pair.h"
</span><span class="cx"> #include "RenderElement.h"
</span><span class="lines">@@ -40,37 +38,31 @@
</span><span class="cx"> #include "RenderView.h"
</span><span class="cx"> #include "StyleResolver.h"
</span><span class="cx"> #include <wtf/text/StringBuilder.h>
</span><del>-#include <wtf/text/WTFString.h>
</del><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-RefPtr<Image> CSSGradientValue::image(RenderElement* renderer, const FloatSize& size)
</del><ins>+static inline Ref<Gradient> createGradient(CSSGradientValue& value, RenderElement& renderer, FloatSize size)
</ins><span class="cx"> {
</span><ins>+ if (is<CSSLinearGradientValue>(value))
+ return downcast<CSSLinearGradientValue>(value).createGradient(renderer, size);
+ return downcast<CSSRadialGradientValue>(value).createGradient(renderer, size);
+}
+
+RefPtr<Image> CSSGradientValue::image(RenderElement& renderer, const FloatSize& size)
+{
</ins><span class="cx"> if (size.isEmpty())
</span><span class="cx"> return nullptr;
</span><del>-
</del><span class="cx"> bool cacheable = isCacheable();
</span><span class="cx"> if (cacheable) {
</span><del>- if (!clients().contains(renderer))
</del><ins>+ if (!clients().contains(&renderer))
</ins><span class="cx"> return nullptr;
</span><del>-
- Image* result = cachedImageForSize(size);
- if (result)
</del><ins>+ if (auto* result = cachedImageForSize(size))
</ins><span class="cx"> return result;
</span><span class="cx"> }
</span><del>-
- RefPtr<Gradient> gradient;
-
- if (is<CSSLinearGradientValue>(*this))
- gradient = downcast<CSSLinearGradientValue>(*this).createGradient(*renderer, size);
- else
- gradient = downcast<CSSRadialGradientValue>(*this).createGradient(*renderer, size);
-
- RefPtr<GradientImage> newImage = GradientImage::create(gradient, size);
</del><ins>+ auto newImage = GradientImage::create(createGradient(*this, renderer, size), size);
</ins><span class="cx"> if (cacheable)
</span><del>- saveCachedImageForSize(size, newImage);
-
- return newImage;
</del><ins>+ saveCachedImageForSize(size, newImage.get());
+ return WTFMove(newImage);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // Should only ever be called for deprecated gradients.
</span><span class="lines">@@ -94,45 +86,34 @@
</span><span class="cx">
</span><span class="cx"> struct GradientStop {
</span><span class="cx"> Color color;
</span><del>- float offset;
- bool specified;
- bool isMidpoint;
-
- GradientStop()
- : offset(0)
- , specified(false)
- , isMidpoint(false)
- { }
</del><ins>+ float offset { 0 };
+ bool specified { false };
+ bool isMidpoint { false };
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-RefPtr<CSSGradientValue> CSSGradientValue::gradientWithStylesResolved(const StyleResolver* styleResolver)
</del><ins>+static inline Ref<CSSGradientValue> clone(CSSGradientValue& value)
</ins><span class="cx"> {
</span><del>- bool derived = false;
</del><ins>+ if (is<CSSLinearGradientValue>(value))
+ return downcast<CSSLinearGradientValue>(value).clone();
+ ASSERT(is<CSSRadialGradientValue>(value));
+ return downcast<CSSRadialGradientValue>(value).clone();
+}
+
+Ref<CSSGradientValue> CSSGradientValue::gradientWithStylesResolved(const StyleResolver& styleResolver)
+{
+ bool colorIsDerivedFromElement = false;
</ins><span class="cx"> for (auto& stop : m_stops) {
</span><del>- if (!stop.isMidpoint && styleResolver->colorFromPrimitiveValueIsDerivedFromElement(*stop.m_color)) {
</del><ins>+ if (!stop.isMidpoint && styleResolver.colorFromPrimitiveValueIsDerivedFromElement(*stop.m_color)) {
</ins><span class="cx"> stop.m_colorIsDerivedFromElement = true;
</span><del>- derived = true;
</del><ins>+ colorIsDerivedFromElement = true;
</ins><span class="cx"> break;
</span><span class="cx"> }
</span><span class="cx"> }
</span><del>-
- RefPtr<CSSGradientValue> result;
- if (!derived)
- result = this;
- else if (is<CSSLinearGradientValue>(*this))
- result = downcast<CSSLinearGradientValue>(*this).clone();
- else if (is<CSSRadialGradientValue>(*this))
- result = downcast<CSSRadialGradientValue>(*this).clone();
- else {
- ASSERT_NOT_REACHED();
- return nullptr;
- }
-
</del><ins>+ auto result = colorIsDerivedFromElement ? clone(*this) : makeRef(*this);
</ins><span class="cx"> for (auto& stop : result->m_stops) {
</span><span class="cx"> if (!stop.isMidpoint)
</span><del>- stop.m_resolvedColor = styleResolver->colorFromPrimitiveValue(*stop.m_color);
</del><ins>+ stop.m_resolvedColor = styleResolver.colorFromPrimitiveValue(*stop.m_color);
</ins><span class="cx"> }
</span><del>-
</del><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -579,10 +560,10 @@
</span><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool CSSGradientValue::knownToBeOpaque(const RenderElement*) const
</del><ins>+bool CSSGradientValue::knownToBeOpaque() const
</ins><span class="cx"> {
</span><del>- for (size_t i = 0; i < m_stops.size(); ++i) {
- if (!m_stops[i].m_resolvedColor.isOpaque())
</del><ins>+ for (auto& stop : m_stops) {
+ if (!stop.m_resolvedColor.isOpaque())
</ins><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx"> return true;
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSGradientValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSGradientValue.h (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSGradientValue.h        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/CSSGradientValue.h        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx">
</span><span class="cx"> #include "CSSImageGeneratorValue.h"
</span><span class="cx"> #include "CSSPrimitiveValue.h"
</span><del>-#include <wtf/RefPtr.h>
</del><span class="cx"> #include <wtf/Vector.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -34,7 +33,7 @@
</span><span class="cx">
</span><span class="cx"> class FloatPoint;
</span><span class="cx"> class Gradient;
</span><del>-class RenderView;
</del><ins>+class StyleResolver;
</ins><span class="cx">
</span><span class="cx"> enum CSSGradientType {
</span><span class="cx"> CSSDeprecatedLinearGradient,
</span><span class="lines">@@ -61,7 +60,7 @@
</span><span class="cx">
</span><span class="cx"> class CSSGradientValue : public CSSImageGeneratorValue {
</span><span class="cx"> public:
</span><del>- RefPtr<Image> image(RenderElement*, const FloatSize&);
</del><ins>+ RefPtr<Image> image(RenderElement&, const FloatSize&);
</ins><span class="cx">
</span><span class="cx"> void setFirstX(RefPtr<CSSPrimitiveValue>&& val) { m_firstX = WTFMove(val); }
</span><span class="cx"> void setFirstY(RefPtr<CSSPrimitiveValue>&& val) { m_firstY = WTFMove(val); }
</span><span class="lines">@@ -79,13 +78,13 @@
</span><span class="cx"> CSSGradientType gradientType() const { return m_gradientType; }
</span><span class="cx">
</span><span class="cx"> bool isFixedSize() const { return false; }
</span><del>- FloatSize fixedSize(const RenderElement*) const { return FloatSize(); }
</del><ins>+ FloatSize fixedSize(const RenderElement&) const { return FloatSize(); }
</ins><span class="cx">
</span><span class="cx"> bool isPending() const { return false; }
</span><del>- bool knownToBeOpaque(const RenderElement*) const;
</del><ins>+ bool knownToBeOpaque() const;
</ins><span class="cx">
</span><span class="cx"> void loadSubimages(CachedResourceLoader&, const ResourceLoaderOptions&) { }
</span><del>- RefPtr<CSSGradientValue> gradientWithStylesResolved(const StyleResolver*);
</del><ins>+ Ref<CSSGradientValue> gradientWithStylesResolved(const StyleResolver&);
</ins><span class="cx">
</span><span class="cx"> protected:
</span><span class="cx"> CSSGradientValue(ClassType classType, CSSGradientRepeat repeat, CSSGradientType gradientType)
</span><span class="lines">@@ -132,7 +131,6 @@
</span><span class="cx">
</span><span class="cx"> class CSSLinearGradientValue final : public CSSGradientValue {
</span><span class="cx"> public:
</span><del>-
</del><span class="cx"> static Ref<CSSLinearGradientValue> create(CSSGradientRepeat repeat, CSSGradientType gradientType = CSSLinearGradient)
</span><span class="cx"> {
</span><span class="cx"> return adoptRef(*new CSSLinearGradientValue(repeat, gradientType));
</span><span class="lines">@@ -212,7 +210,6 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-
</del><span class="cx"> // Resolve points/radii to front end values.
</span><span class="cx"> float resolveRadius(CSSPrimitiveValue&, const CSSToLengthConversionData&, float* widthOrHeight = 0);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSImageGeneratorValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -41,6 +41,22 @@
</span><span class="cx">
</span><span class="cx"> static const auto timeToKeepCachedGeneratedImages = std::chrono::seconds { 3 };
</span><span class="cx">
</span><ins>+class CSSImageGeneratorValue::CachedGeneratedImage {
+ WTF_MAKE_FAST_ALLOCATED;
+public:
+ CachedGeneratedImage(CSSImageGeneratorValue&, FloatSize, GeneratedImage&);
+ GeneratedImage& image() const { return const_cast<GeneratedImage&>(m_image.get()); }
+ void puntEvictionTimer() { m_evictionTimer.restart(); }
+
+private:
+ void evictionTimerFired();
+
+ CSSImageGeneratorValue& m_owner;
+ const FloatSize m_size;
+ const Ref<GeneratedImage> m_image;
+ DeferrableOneShotTimer m_evictionTimer;
+};
+
</ins><span class="cx"> CSSImageGeneratorValue::CSSImageGeneratorValue(ClassType classType)
</span><span class="cx"> : CSSValue(classType)
</span><span class="cx"> {
</span><span class="lines">@@ -50,19 +66,17 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void CSSImageGeneratorValue::addClient(RenderElement* renderer)
</del><ins>+void CSSImageGeneratorValue::addClient(RenderElement& renderer)
</ins><span class="cx"> {
</span><del>- ASSERT(renderer);
</del><span class="cx"> if (m_clients.isEmpty())
</span><span class="cx"> ref();
</span><del>- m_clients.add(renderer);
</del><ins>+ m_clients.add(&renderer);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void CSSImageGeneratorValue::removeClient(RenderElement* renderer)
</del><ins>+void CSSImageGeneratorValue::removeClient(RenderElement& renderer)
</ins><span class="cx"> {
</span><del>- ASSERT(renderer);
- ASSERT(m_clients.contains(renderer));
- if (m_clients.remove(renderer) && m_clients.isEmpty())
</del><ins>+ ASSERT(m_clients.contains(&renderer));
+ if (m_clients.remove(&renderer) && m_clients.isEmpty())
</ins><span class="cx"> deref();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -71,15 +85,15 @@
</span><span class="cx"> if (size.isEmpty())
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><del>- CachedGeneratedImage* cachedGeneratedImage = m_images.get(size);
</del><ins>+ auto* cachedGeneratedImage = m_images.get(size);
</ins><span class="cx"> if (!cachedGeneratedImage)
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><span class="cx"> cachedGeneratedImage->puntEvictionTimer();
</span><del>- return cachedGeneratedImage->image();
</del><ins>+ return &cachedGeneratedImage->image();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void CSSImageGeneratorValue::saveCachedImageForSize(FloatSize size, PassRefPtr<GeneratedImage> image)
</del><ins>+void CSSImageGeneratorValue::saveCachedImageForSize(FloatSize size, GeneratedImage& image)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(!m_images.contains(size));
</span><span class="cx"> m_images.add(size, std::make_unique<CachedGeneratedImage>(*this, size, image));
</span><span class="lines">@@ -91,7 +105,7 @@
</span><span class="cx"> m_images.remove(size);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-CSSImageGeneratorValue::CachedGeneratedImage::CachedGeneratedImage(CSSImageGeneratorValue& owner, FloatSize size, PassRefPtr<GeneratedImage> image)
</del><ins>+inline CSSImageGeneratorValue::CachedGeneratedImage::CachedGeneratedImage(CSSImageGeneratorValue& owner, FloatSize size, GeneratedImage& image)
</ins><span class="cx"> : m_owner(owner)
</span><span class="cx"> , m_size(size)
</span><span class="cx"> , m_image(image)
</span><span class="lines">@@ -106,17 +120,17 @@
</span><span class="cx"> m_owner.evictCachedGeneratedImage(m_size);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<Image> CSSImageGeneratorValue::image(RenderElement* renderer, const FloatSize& size)
</del><ins>+RefPtr<Image> CSSImageGeneratorValue::image(RenderElement& renderer, const FloatSize& size)
</ins><span class="cx"> {
</span><span class="cx"> switch (classType()) {
</span><span class="cx"> case CanvasClass:
</span><del>- return downcast<CSSCanvasValue>(*this).image(renderer, size);
</del><ins>+ return downcast<CSSCanvasValue>(*this).image(&renderer, size);
</ins><span class="cx"> case NamedImageClass:
</span><del>- return downcast<CSSNamedImageValue>(*this).image(renderer, size);
</del><ins>+ return downcast<CSSNamedImageValue>(*this).image(&renderer, size);
</ins><span class="cx"> case CrossfadeClass:
</span><span class="cx"> return downcast<CSSCrossfadeValue>(*this).image(renderer, size);
</span><span class="cx"> case FilterImageClass:
</span><del>- return downcast<CSSFilterImageValue>(*this).image(renderer, size);
</del><ins>+ return downcast<CSSFilterImageValue>(*this).image(&renderer, size);
</ins><span class="cx"> case LinearGradientClass:
</span><span class="cx"> return downcast<CSSLinearGradientValue>(*this).image(renderer, size);
</span><span class="cx"> case RadialGradientClass:
</span><span class="lines">@@ -148,15 +162,15 @@
</span><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-FloatSize CSSImageGeneratorValue::fixedSize(const RenderElement* renderer)
</del><ins>+FloatSize CSSImageGeneratorValue::fixedSize(const RenderElement& renderer)
</ins><span class="cx"> {
</span><span class="cx"> switch (classType()) {
</span><span class="cx"> case CanvasClass:
</span><del>- return downcast<CSSCanvasValue>(*this).fixedSize(renderer);
</del><ins>+ return downcast<CSSCanvasValue>(*this).fixedSize(&renderer);
</ins><span class="cx"> case CrossfadeClass:
</span><span class="cx"> return downcast<CSSCrossfadeValue>(*this).fixedSize(renderer);
</span><span class="cx"> case FilterImageClass:
</span><del>- return downcast<CSSFilterImageValue>(*this).fixedSize(renderer);
</del><ins>+ return downcast<CSSFilterImageValue>(*this).fixedSize(&renderer);
</ins><span class="cx"> case LinearGradientClass:
</span><span class="cx"> return downcast<CSSLinearGradientValue>(*this).fixedSize(renderer);
</span><span class="cx"> case RadialGradientClass:
</span><span class="lines">@@ -188,7 +202,7 @@
</span><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool CSSImageGeneratorValue::knownToBeOpaque(const RenderElement* renderer) const
</del><ins>+bool CSSImageGeneratorValue::knownToBeOpaque(const RenderElement& renderer) const
</ins><span class="cx"> {
</span><span class="cx"> switch (classType()) {
</span><span class="cx"> case CrossfadeClass:
</span><span class="lines">@@ -198,11 +212,11 @@
</span><span class="cx"> case NamedImageClass:
</span><span class="cx"> return false;
</span><span class="cx"> case FilterImageClass:
</span><del>- return downcast<CSSFilterImageValue>(*this).knownToBeOpaque(renderer);
</del><ins>+ return downcast<CSSFilterImageValue>(*this).knownToBeOpaque(&renderer);
</ins><span class="cx"> case LinearGradientClass:
</span><del>- return downcast<CSSLinearGradientValue>(*this).knownToBeOpaque(renderer);
</del><ins>+ return downcast<CSSLinearGradientValue>(*this).knownToBeOpaque();
</ins><span class="cx"> case RadialGradientClass:
</span><del>- return downcast<CSSRadialGradientValue>(*this).knownToBeOpaque(renderer);
</del><ins>+ return downcast<CSSRadialGradientValue>(*this).knownToBeOpaque();
</ins><span class="cx"> default:
</span><span class="cx"> ASSERT_NOT_REACHED();
</span><span class="cx"> }
</span><span class="lines">@@ -244,7 +258,6 @@
</span><span class="cx"> return false;
</span><span class="cx">
</span><span class="cx"> ASSERT_NOT_REACHED();
</span><del>-
</del><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -265,7 +278,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><span class="cx"> ASSERT_NOT_REACHED();
</span><del>-
</del><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSImageGeneratorValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSImageGeneratorValue.h (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSImageGeneratorValue.h        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/CSSImageGeneratorValue.h        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -26,7 +26,6 @@
</span><span class="cx"> #pragma once
</span><span class="cx">
</span><span class="cx"> #include "CSSValue.h"
</span><del>-#include "FloatSize.h"
</del><span class="cx"> #include "FloatSizeHash.h"
</span><span class="cx"> #include "Timer.h"
</span><span class="cx"> #include <wtf/HashCountedSet.h>
</span><span class="lines">@@ -38,7 +37,7 @@
</span><span class="cx"> class GeneratedImage;
</span><span class="cx"> class Image;
</span><span class="cx"> class RenderElement;
</span><del>-class StyleResolver;
</del><ins>+
</ins><span class="cx"> struct ResourceLoaderOptions;
</span><span class="cx">
</span><span class="cx"> class CSSImageGeneratorValue : public CSSValue {
</span><span class="lines">@@ -45,16 +44,16 @@
</span><span class="cx"> public:
</span><span class="cx"> ~CSSImageGeneratorValue();
</span><span class="cx">
</span><del>- void addClient(RenderElement*);
- void removeClient(RenderElement*);
</del><ins>+ void addClient(RenderElement&);
+ void removeClient(RenderElement&);
</ins><span class="cx">
</span><del>- RefPtr<Image> image(RenderElement*, const FloatSize&);
</del><ins>+ RefPtr<Image> image(RenderElement&, const FloatSize&);
</ins><span class="cx">
</span><span class="cx"> bool isFixedSize() const;
</span><del>- FloatSize fixedSize(const RenderElement*);
</del><ins>+ FloatSize fixedSize(const RenderElement&);
</ins><span class="cx">
</span><span class="cx"> bool isPending() const;
</span><del>- bool knownToBeOpaque(const RenderElement*) const;
</del><ins>+ bool knownToBeOpaque(const RenderElement&) const;
</ins><span class="cx">
</span><span class="cx"> void loadSubimages(CachedResourceLoader&, const ResourceLoaderOptions&);
</span><span class="cx">
</span><span class="lines">@@ -62,7 +61,7 @@
</span><span class="cx"> CSSImageGeneratorValue(ClassType);
</span><span class="cx">
</span><span class="cx"> GeneratedImage* cachedImageForSize(FloatSize);
</span><del>- void saveCachedImageForSize(FloatSize, PassRefPtr<GeneratedImage>);
</del><ins>+ void saveCachedImageForSize(FloatSize, GeneratedImage&);
</ins><span class="cx"> const HashCountedSet<RenderElement*>& clients() const { return m_clients; }
</span><span class="cx">
</span><span class="cx"> // Helper functions for Crossfade and Filter.
</span><span class="lines">@@ -70,23 +69,8 @@
</span><span class="cx"> static bool subimageIsPending(const CSSValue&);
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- class CachedGeneratedImage {
- WTF_MAKE_FAST_ALLOCATED;
- public:
- CachedGeneratedImage(CSSImageGeneratorValue&, FloatSize, PassRefPtr<GeneratedImage>);
- GeneratedImage* image() { return m_image.get(); }
- void puntEvictionTimer() { m_evictionTimer.restart(); }
</del><ins>+ class CachedGeneratedImage;
</ins><span class="cx">
</span><del>- private:
- void evictionTimerFired();
-
- CSSImageGeneratorValue& m_owner;
- FloatSize m_size;
- RefPtr<GeneratedImage> m_image;
- DeferrableOneShotTimer m_evictionTimer;
- };
-
- friend class CachedGeneratedImage;
</del><span class="cx"> void evictCachedGeneratedImage(FloatSize);
</span><span class="cx">
</span><span class="cx"> HashCountedSet<RenderElement*> m_clients;
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSValuePoolcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSValuePool.cpp (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSValuePool.cpp        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/CSSValuePool.cpp        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -132,7 +132,7 @@
</span><span class="cx"> return *value;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-PassRefPtr<CSSValueList> CSSValuePool::createFontFaceValue(const AtomicString& string)
</del><ins>+RefPtr<CSSValueList> CSSValuePool::createFontFaceValue(const AtomicString& string)
</ins><span class="cx"> {
</span><span class="cx"> // Remove one entry at random if the cache grows too large.
</span><span class="cx"> const int maximumFontFaceCacheSize = 128;
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSValuePoolh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSValuePool.h (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSValuePool.h        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/CSSValuePool.h        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -51,7 +51,7 @@
</span><span class="cx"> public:
</span><span class="cx"> static CSSValuePool& singleton();
</span><span class="cx">
</span><del>- PassRefPtr<CSSValueList> createFontFaceValue(const AtomicString&);
</del><ins>+ RefPtr<CSSValueList> createFontFaceValue(const AtomicString&);
</ins><span class="cx"> Ref<CSSPrimitiveValue> createFontFamilyValue(const String&, FromSystemFontID = FromSystemFontID::No);
</span><span class="cx"> Ref<CSSInheritedValue> createInheritedValue() { return m_inheritedValue.get(); }
</span><span class="cx"> Ref<CSSInitialValue> createImplicitInitialValue() { return m_implicitInitialValue.get(); }
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleBuilderConverterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleBuilderConverter.h (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleBuilderConverter.h        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/StyleBuilderConverter.h        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -62,18 +62,18 @@
</span><span class="cx"> static Length convertLengthOrAuto(StyleResolver&, const CSSValue&);
</span><span class="cx"> static Length convertLengthSizing(StyleResolver&, const CSSValue&);
</span><span class="cx"> static Length convertLengthMaxSizing(StyleResolver&, const CSSValue&);
</span><del>- template <typename T> static T convertComputedLength(StyleResolver&, const CSSValue&);
- template <typename T> static T convertLineWidth(StyleResolver&, const CSSValue&);
</del><ins>+ template<typename T> static T convertComputedLength(StyleResolver&, const CSSValue&);
+ template<typename T> static T convertLineWidth(StyleResolver&, const CSSValue&);
</ins><span class="cx"> static float convertSpacing(StyleResolver&, const CSSValue&);
</span><span class="cx"> static LengthSize convertRadius(StyleResolver&, const CSSValue&);
</span><span class="cx"> static LengthPoint convertObjectPosition(StyleResolver&, const CSSValue&);
</span><span class="cx"> static TextDecoration convertTextDecoration(StyleResolver&, const CSSValue&);
</span><del>- template <typename T> static T convertNumber(StyleResolver&, const CSSValue&);
- template <typename T> static T convertNumberOrAuto(StyleResolver&, const CSSValue&);
</del><ins>+ template<typename T> static T convertNumber(StyleResolver&, const CSSValue&);
+ template<typename T> static T convertNumberOrAuto(StyleResolver&, const CSSValue&);
</ins><span class="cx"> static short convertWebkitHyphenateLimitLines(StyleResolver&, const CSSValue&);
</span><del>- template <CSSPropertyID property> static NinePieceImage convertBorderImage(StyleResolver&, CSSValue&);
- template <CSSPropertyID property> static NinePieceImage convertBorderMask(StyleResolver&, CSSValue&);
- template <CSSPropertyID property> static PassRefPtr<StyleImage> convertStyleImage(StyleResolver&, CSSValue&);
</del><ins>+ template<CSSPropertyID> static NinePieceImage convertBorderImage(StyleResolver&, CSSValue&);
+ template<CSSPropertyID> static NinePieceImage convertBorderMask(StyleResolver&, CSSValue&);
+ template<CSSPropertyID> static RefPtr<StyleImage> convertStyleImage(StyleResolver&, CSSValue&);
</ins><span class="cx"> static TransformOperations convertTransform(StyleResolver&, const CSSValue&);
</span><span class="cx"> static String convertString(StyleResolver&, const CSSValue&);
</span><span class="cx"> static String convertStringOrAuto(StyleResolver&, const CSSValue&);
</span><span class="lines">@@ -91,7 +91,7 @@
</span><span class="cx"> static float convertTextStrokeWidth(StyleResolver&, const CSSValue&);
</span><span class="cx"> static LineBoxContain convertLineBoxContain(StyleResolver&, const CSSValue&);
</span><span class="cx"> static TextDecorationSkip convertTextDecorationSkip(StyleResolver&, const CSSValue&);
</span><del>- static PassRefPtr<ShapeValue> convertShapeValue(StyleResolver&, CSSValue&);
</del><ins>+ static RefPtr<ShapeValue> convertShapeValue(StyleResolver&, CSSValue&);
</ins><span class="cx"> #if ENABLE(CSS_SCROLL_SNAP)
</span><span class="cx"> static ScrollSnapType convertScrollSnapType(StyleResolver&, const CSSValue&);
</span><span class="cx"> static ScrollSnapAlign convertScrollSnapAlign(StyleResolver&, const CSSValue&);
</span><span class="lines">@@ -234,13 +234,13 @@
</span><span class="cx"> return convertLengthSizing(styleResolver, value);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template <typename T>
</del><ins>+template<typename T>
</ins><span class="cx"> inline T StyleBuilderConverter::convertComputedLength(StyleResolver& styleResolver, const CSSValue& value)
</span><span class="cx"> {
</span><span class="cx"> return downcast<CSSPrimitiveValue>(value).computeLength<T>(styleResolver.state().cssToLengthConversionData());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template <typename T>
</del><ins>+template<typename T>
</ins><span class="cx"> inline T StyleBuilderConverter::convertLineWidth(StyleResolver& styleResolver, const CSSValue& value)
</span><span class="cx"> {
</span><span class="cx"> auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
</span><span class="lines">@@ -333,7 +333,7 @@
</span><span class="cx"> return convertPositionComponent<CSSValueTop, CSSValueBottom>(styleResolver, downcast<CSSPrimitiveValue>(value));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template <CSSValueID cssValueFor0, CSSValueID cssValueFor100>
</del><ins>+template<CSSValueID cssValueFor0, CSSValueID cssValueFor100>
</ins><span class="cx"> inline Length StyleBuilderConverter::convertPositionComponent(StyleResolver& styleResolver, const CSSPrimitiveValue& value)
</span><span class="cx"> {
</span><span class="cx"> Length length;
</span><span class="lines">@@ -392,13 +392,13 @@
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template <typename T>
</del><ins>+template<typename T>
</ins><span class="cx"> inline T StyleBuilderConverter::convertNumber(StyleResolver&, const CSSValue& value)
</span><span class="cx"> {
</span><span class="cx"> return downcast<CSSPrimitiveValue>(value).value<T>(CSSPrimitiveValue::CSS_NUMBER);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template <typename T>
</del><ins>+template<typename T>
</ins><span class="cx"> inline T StyleBuilderConverter::convertNumberOrAuto(StyleResolver& styleResolver, const CSSValue& value)
</span><span class="cx"> {
</span><span class="cx"> if (downcast<CSSPrimitiveValue>(value).valueID() == CSSValueAuto)
</span><span class="lines">@@ -414,7 +414,7 @@
</span><span class="cx"> return primitiveValue.value<short>(CSSPrimitiveValue::CSS_NUMBER);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template <CSSPropertyID property>
</del><ins>+template<CSSPropertyID property>
</ins><span class="cx"> inline NinePieceImage StyleBuilderConverter::convertBorderImage(StyleResolver& styleResolver, CSSValue& value)
</span><span class="cx"> {
</span><span class="cx"> NinePieceImage image;
</span><span class="lines">@@ -422,7 +422,7 @@
</span><span class="cx"> return image;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template <CSSPropertyID property>
</del><ins>+template<CSSPropertyID property>
</ins><span class="cx"> inline NinePieceImage StyleBuilderConverter::convertBorderMask(StyleResolver& styleResolver, CSSValue& value)
</span><span class="cx"> {
</span><span class="cx"> NinePieceImage image;
</span><span class="lines">@@ -431,8 +431,8 @@
</span><span class="cx"> return image;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template <CSSPropertyID property>
-inline PassRefPtr<StyleImage> StyleBuilderConverter::convertStyleImage(StyleResolver& styleResolver, CSSValue& value)
</del><ins>+template<CSSPropertyID>
+inline RefPtr<StyleImage> StyleBuilderConverter::convertStyleImage(StyleResolver& styleResolver, CSSValue& value)
</ins><span class="cx"> {
</span><span class="cx"> return styleResolver.styleImage(value);
</span><span class="cx"> }
</span><span class="lines">@@ -758,7 +758,7 @@
</span><span class="cx"> return is<CSSImageValue>(value) || is<CSSImageSetValue>(value) || is<CSSImageGeneratorValue>(value);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-inline PassRefPtr<ShapeValue> StyleBuilderConverter::convertShapeValue(StyleResolver& styleResolver, CSSValue& value)
</del><ins>+inline RefPtr<ShapeValue> StyleBuilderConverter::convertShapeValue(StyleResolver& styleResolver, CSSValue& value)
</ins><span class="cx"> {
</span><span class="cx"> if (is<CSSPrimitiveValue>(value)) {
</span><span class="cx"> ASSERT(downcast<CSSPrimitiveValue>(value).valueID() == CSSValueNone);
</span><span class="lines">@@ -771,7 +771,7 @@
</span><span class="cx"> RefPtr<BasicShape> shape;
</span><span class="cx"> CSSBoxType referenceBox = BoxMissing;
</span><span class="cx"> for (auto& currentValue : downcast<CSSValueList>(value)) {
</span><del>- CSSPrimitiveValue& primitiveValue = downcast<CSSPrimitiveValue>(currentValue.get());
</del><ins>+ auto& primitiveValue = downcast<CSSPrimitiveValue>(currentValue.get());
</ins><span class="cx"> if (primitiveValue.isShape())
</span><span class="cx"> shape = basicShapeForValue(styleResolver.state().cssToLengthConversionData(), *primitiveValue.shapeValue());
</span><span class="cx"> else if (primitiveValue.valueID() == CSSValueContentBox
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleBuilderCustomh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleBuilderCustom.h (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleBuilderCustom.h        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/StyleBuilderCustom.h        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -1361,7 +1361,7 @@
</span><span class="cx"> for (auto& item : downcast<CSSValueList>(value)) {
</span><span class="cx"> if (is<CSSImageGeneratorValue>(item.get())) {
</span><span class="cx"> if (is<CSSGradientValue>(item.get()))
</span><del>- styleResolver.style()->setContent(StyleGeneratedImage::create(*downcast<CSSGradientValue>(item.get()).gradientWithStylesResolved(&styleResolver)), didSet);
</del><ins>+ styleResolver.style()->setContent(StyleGeneratedImage::create(downcast<CSSGradientValue>(item.get()).gradientWithStylesResolved(styleResolver)), didSet);
</ins><span class="cx"> else
</span><span class="cx"> styleResolver.style()->setContent(StyleGeneratedImage::create(downcast<CSSImageGeneratorValue>(item.get())), didSet);
</span><span class="cx"> didSet = true;
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleResolvercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleResolver.cpp (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleResolver.cpp        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/css/StyleResolver.cpp        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -1689,7 +1689,7 @@
</span><span class="cx"> {
</span><span class="cx"> if (is<CSSImageGeneratorValue>(value)) {
</span><span class="cx"> if (is<CSSGradientValue>(value))
</span><del>- return StyleGeneratedImage::create(*downcast<CSSGradientValue>(value).gradientWithStylesResolved(this));
</del><ins>+ return StyleGeneratedImage::create(downcast<CSSGradientValue>(value).gradientWithStylesResolved(*this));
</ins><span class="cx">
</span><span class="cx"> if (is<CSSFilterImageValue>(value)) {
</span><span class="cx"> // FilterImage needs to calculate FilterOperations.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGradientImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GradientImage.cpp (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GradientImage.cpp        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/platform/graphics/GradientImage.cpp        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2008-2016 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,15 +26,12 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include "GradientImage.h"
</span><span class="cx">
</span><del>-#include "FloatRect.h"
</del><span class="cx"> #include "GraphicsContext.h"
</span><span class="cx"> #include "ImageBuffer.h"
</span><del>-#include "Length.h"
-#include "TextStream.h"
</del><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-GradientImage::GradientImage(PassRefPtr<Gradient> generator, const FloatSize& size)
</del><ins>+GradientImage::GradientImage(Gradient& generator, const FloatSize& size)
</ins><span class="cx"> : m_gradient(generator)
</span><span class="cx"> {
</span><span class="cx"> setContainerSize(size);
</span><span class="lines">@@ -53,7 +50,7 @@
</span><span class="cx"> if (destRect.size() != srcRect.size())
</span><span class="cx"> destContext.scale(FloatSize(destRect.width() / srcRect.width(), destRect.height() / srcRect.height()));
</span><span class="cx"> destContext.translate(-srcRect.x(), -srcRect.y());
</span><del>- destContext.fillRect(FloatRect(FloatPoint(), size()), *m_gradient.get());
</del><ins>+ destContext.fillRect(FloatRect(FloatPoint(), size()), m_gradient.get());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void GradientImage::drawPattern(GraphicsContext& destContext, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform& patternTransform,
</span><span class="lines">@@ -80,7 +77,7 @@
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> // Fill with the generated image.
</span><del>- m_cachedImageBuffer->context().fillRect(FloatRect(FloatPoint(), adjustedSize), *m_gradient);
</del><ins>+ m_cachedImageBuffer->context().fillRect(FloatRect(FloatPoint(), adjustedSize), m_gradient.get());
</ins><span class="cx">
</span><span class="cx"> m_cachedGeneratorHash = generatorHash;
</span><span class="cx"> m_cachedAdjustedSize = adjustedSize;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGradientImageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GradientImage.h (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GradientImage.h        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/platform/graphics/GradientImage.h        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2008, 2012, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2008-2016 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -23,40 +23,33 @@
</span><span class="cx"> * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx"> */
</span><span class="cx">
</span><del>-#ifndef GradientImage_h
-#define GradientImage_h
</del><ins>+#pragma once
</ins><span class="cx">
</span><del>-#include "FloatSize.h"
</del><span class="cx"> #include "GeneratedImage.h"
</span><del>-#include "Gradient.h"
-#include "Image.h"
-#include <wtf/RefPtr.h>
</del><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><ins>+class Gradient;
</ins><span class="cx"> class ImageBuffer;
</span><span class="cx">
</span><span class="cx"> class GradientImage final : public GeneratedImage {
</span><span class="cx"> public:
</span><del>- static PassRefPtr<GradientImage> create(PassRefPtr<Gradient> generator, const FloatSize& size)
</del><ins>+ static Ref<GradientImage> create(Gradient& generator, const FloatSize& size)
</ins><span class="cx"> {
</span><del>- return adoptRef(new GradientImage(generator, size));
</del><ins>+ return adoptRef(*new GradientImage(generator, size));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> virtual ~GradientImage();
</span><span class="cx">
</span><del>-protected:
- void draw(GraphicsContext&, const FloatRect& dstRect, const FloatRect& srcRect, CompositeOperator, BlendMode, ImageOrientationDescription) override;
- void drawPattern(GraphicsContext&, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform& patternTransform,
- const FloatPoint& phase, const FloatSize& spacing, CompositeOperator, BlendMode) override;
</del><ins>+private:
+ GradientImage(Gradient&, const FloatSize&);
</ins><span class="cx">
</span><del>- GradientImage(PassRefPtr<Gradient>, const FloatSize&);
-
-private:
- bool isGradientImage() const override { return true; }
- void dump(TextStream&) const override;
</del><ins>+ void draw(GraphicsContext&, const FloatRect& dstRect, const FloatRect& srcRect, CompositeOperator, BlendMode, ImageOrientationDescription) final;
+ void drawPattern(GraphicsContext&, const FloatRect& destRect, const FloatRect& srcRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, CompositeOperator, BlendMode) final;
+ bool isGradientImage() const final { return true; }
+ void dump(TextStream&) const final;
</ins><span class="cx">
</span><del>- RefPtr<Gradient> m_gradient;
</del><ins>+ Ref<Gradient> m_gradient;
</ins><span class="cx"> std::unique_ptr<ImageBuffer> m_cachedImageBuffer;
</span><span class="cx"> FloatSize m_cachedAdjustedSize;
</span><span class="cx"> unsigned m_cachedGeneratorHash;
</span><span class="lines">@@ -63,5 +56,3 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> }
</span><del>-
-#endif
</del></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleStyleGeneratedImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/StyleGeneratedImage.cpp (210214 => 210215)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/StyleGeneratedImage.cpp        2016-12-31 01:28:36 UTC (rev 210214)
+++ trunk/Source/WebCore/rendering/style/StyleGeneratedImage.cpp        2016-12-31 09:17:36 UTC (rev 210215)
</span><span class="lines">@@ -54,8 +54,9 @@
</span><span class="cx">
</span><span class="cx"> FloatSize StyleGeneratedImage::imageSize(const RenderElement* renderer, float multiplier) const
</span><span class="cx"> {
</span><ins>+ ASSERT(renderer);
</ins><span class="cx"> if (m_fixedSize) {
</span><del>- FloatSize fixedSize = const_cast<CSSImageGeneratorValue&>(m_imageGeneratorValue.get()).fixedSize(renderer);
</del><ins>+ FloatSize fixedSize = const_cast<CSSImageGeneratorValue&>(m_imageGeneratorValue.get()).fixedSize(*renderer);
</ins><span class="cx"> if (multiplier == 1.0f)
</span><span class="cx"> return fixedSize;
</span><span class="cx">
</span><span class="lines">@@ -87,22 +88,26 @@
</span><span class="cx">
</span><span class="cx"> void StyleGeneratedImage::addClient(RenderElement* renderer)
</span><span class="cx"> {
</span><del>- m_imageGeneratorValue->addClient(renderer);
</del><ins>+ ASSERT(renderer);
+ m_imageGeneratorValue->addClient(*renderer);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void StyleGeneratedImage::removeClient(RenderElement* renderer)
</span><span class="cx"> {
</span><del>- m_imageGeneratorValue->removeClient(renderer);
</del><ins>+ ASSERT(renderer);
+ m_imageGeneratorValue->removeClient(*renderer);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<Image> StyleGeneratedImage::image(RenderElement* renderer, const FloatSize& size) const
</span><span class="cx"> {
</span><del>- return const_cast<CSSImageGeneratorValue&>(m_imageGeneratorValue.get()).image(renderer, size);
</del><ins>+ ASSERT(renderer);
+ return const_cast<CSSImageGeneratorValue&>(m_imageGeneratorValue.get()).image(*renderer, size);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool StyleGeneratedImage::knownToBeOpaque(const RenderElement* renderer) const
</span><span class="cx"> {
</span><del>- return m_imageGeneratorValue->knownToBeOpaque(renderer);
</del><ins>+ ASSERT(renderer);
+ return m_imageGeneratorValue->knownToBeOpaque(*renderer);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre>
</div>
</div>
</body>
</html>