<!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>[211288] trunk</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/211288">211288</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2017-01-27 10:44:18 -0800 (Fri, 27 Jan 2017)</dd>
</dl>
<h3>Log Message</h3>
<pre>Implement Cache-control: immutable
https://bugs.webkit.org/show_bug.cgi?id=167497
Reviewed by Chris Dumez.
Source/WebCore:
Cache-control value 'immutable' indicates that a subresource does not change and so does not need to be
revalidated on a normal reload. This can significantly speed up reloads and reduce network traffic.
It is has been implemented in Firefox and is already used by Facebook.
https://tools.ietf.org/html/draft-mcmanus-immutable-00
https://hacks.mozilla.org/2017/01/using-immutable-caching-to-speed-up-the-web/
This patch implements Cache-control: immutable for memory cache only. A disk cache implementation
doesn't seem necessary as the resource is basically always expected to be in memory cache on reload.
Immutable is only supported for https as suggested by the draft specification (and Gecko implementation).
Test: http/tests/cache/cache-control-immutable-http.html
http/tests/cache/cache-control-immutable-https.html
* loader/cache/CachedResource.cpp:
(WebCore::CachedResource::makeRevalidationDecision):
On normal reloads (CachePolicyRevalidate) of https resources check for 'Cache-control: immutable'.
If the resource is not expired don't revalidate it.
* platform/network/CacheValidation.cpp:
(WebCore::parseCacheControlDirectives):
* platform/network/CacheValidation.h:
* platform/network/ResourceResponseBase.cpp:
(WebCore::ResourceResponseBase::cacheControlContainsImmutable):
* platform/network/ResourceResponseBase.h:
LayoutTests:
* http/tests/cache/cache-control-immutable-http-expected.txt: Added.
* http/tests/cache/cache-control-immutable-http.html: Added.
* http/tests/cache/cache-control-immutable-https-expected.txt: Added.
* http/tests/cache/cache-control-immutable-https.html: Added.
* http/tests/cache/resources/cache-control-immutable.js: Added.
* http/tests/cache/resources/iframe-with-script.cgi: Added.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedResourcecpp">trunk/Source/WebCore/loader/cache/CachedResource.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkCacheValidationcpp">trunk/Source/WebCore/platform/network/CacheValidation.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkCacheValidationh">trunk/Source/WebCore/platform/network/CacheValidation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceResponseBasecpp">trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceResponseBaseh">trunk/Source/WebCore/platform/network/ResourceResponseBase.h</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestshttptestscachecachecontrolimmutablehttpexpectedtxt">trunk/LayoutTests/http/tests/cache/cache-control-immutable-http-expected.txt</a></li>
<li><a href="#trunkLayoutTestshttptestscachecachecontrolimmutablehttphtml">trunk/LayoutTests/http/tests/cache/cache-control-immutable-http.html</a></li>
<li><a href="#trunkLayoutTestshttptestscachecachecontrolimmutablehttpsexpectedtxt">trunk/LayoutTests/http/tests/cache/cache-control-immutable-https-expected.txt</a></li>
<li><a href="#trunkLayoutTestshttptestscachecachecontrolimmutablehttpshtml">trunk/LayoutTests/http/tests/cache/cache-control-immutable-https.html</a></li>
<li><a href="#trunkLayoutTestshttptestscacheresourcescachecontrolimmutablejs">trunk/LayoutTests/http/tests/cache/resources/cache-control-immutable.js</a></li>
<li><a href="#trunkLayoutTestshttptestscacheresourcesiframewithscriptcgi">trunk/LayoutTests/http/tests/cache/resources/iframe-with-script.cgi</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (211287 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-01-27 18:39:16 UTC (rev 211287)
+++ trunk/LayoutTests/ChangeLog        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2017-01-27 Antti Koivisto <antti@apple.com>
+
+ Implement Cache-control: immutable
+ https://bugs.webkit.org/show_bug.cgi?id=167497
+
+ Reviewed by Chris Dumez.
+
+ * http/tests/cache/cache-control-immutable-http-expected.txt: Added.
+ * http/tests/cache/cache-control-immutable-http.html: Added.
+ * http/tests/cache/cache-control-immutable-https-expected.txt: Added.
+ * http/tests/cache/cache-control-immutable-https.html: Added.
+ * http/tests/cache/resources/cache-control-immutable.js: Added.
+ * http/tests/cache/resources/iframe-with-script.cgi: Added.
+
</ins><span class="cx"> 2017-01-26 Ryan Haddad <ryanhaddad@apple.com>
</span><span class="cx">
</span><span class="cx"> Marking media/modern-media-controls/layout-node/addChild.html as flaky.
</span></span></pre></div>
<a id="trunkLayoutTestshttptestscachecachecontrolimmutablehttpexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/cache/cache-control-immutable-http-expected.txt (0 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cache/cache-control-immutable-http-expected.txt         (rev 0)
+++ trunk/LayoutTests/http/tests/cache/cache-control-immutable-http-expected.txt        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+HTTP: Test if non-expired subresource with Cache-control: immutable is revalidated: YES (expected YES)
+HTTP: Test if expired subresource with Cache-control: immutable is revalidated: YES (expected YES)
+
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestscachecachecontrolimmutablehttphtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/cache/cache-control-immutable-http.html (0 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cache/cache-control-immutable-http.html         (rev 0)
+++ trunk/LayoutTests/http/tests/cache/cache-control-immutable-http.html        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+<script>
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+}
+</script>
+<script src="resources/cache-control-immutable.js"></script>
+<body>
+<div id=logdiv><div>
+<script>
+test(1000, (revalidated) => {
+ log("HTTP: Test if non-expired subresource with Cache-control: immutable is revalidated", true, revalidated);
+ test(0, (revalidated) => {
+ log("HTTP: Test if expired subresource with Cache-control: immutable is revalidated", true, revalidated);
+ if (window.testRunner)
+ testRunner.notifyDone();
+ });
+});
+</script>
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestscachecachecontrolimmutablehttpsexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/cache/cache-control-immutable-https-expected.txt (0 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cache/cache-control-immutable-https-expected.txt         (rev 0)
+++ trunk/LayoutTests/http/tests/cache/cache-control-immutable-https-expected.txt        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+HTTPS: Test if non-expired subresource with Cache-control: immutable is revalidated: NO (expected NO)
+HTTPS: Test if expired subresource with Cache-control: immutable is revalidated: YES (expected YES)
+
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestscachecachecontrolimmutablehttpshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/cache/cache-control-immutable-https.html (0 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cache/cache-control-immutable-https.html         (rev 0)
+++ trunk/LayoutTests/http/tests/cache/cache-control-immutable-https.html        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+<script>
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+}
+if (window.location.protocol == "http:")
+ window.location = "https://127.0.0.1:8443/cache/cache-control-immutable-https.html";
+</script>
+<script src="resources/cache-control-immutable.js"></script>
+<body>
+<div id=logdiv><div>
+<script>
+test(1000, (revalidated) => {
+ log("HTTPS: Test if non-expired subresource with Cache-control: immutable is revalidated", false, revalidated);
+ test(0, (revalidated) => {
+ log("HTTPS: Test if expired subresource with Cache-control: immutable is revalidated", true, revalidated);
+ if (window.testRunner)
+ testRunner.notifyDone();
+ });
+});
+</script>
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestscacheresourcescachecontrolimmutablejs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/cache/resources/cache-control-immutable.js (0 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cache/resources/cache-control-immutable.js         (rev 0)
+++ trunk/LayoutTests/http/tests/cache/resources/cache-control-immutable.js        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+function log(text, expected, result)
+{
+ logdiv.innerText += text + ": " + (result ? "YES" : "NO") + " (expected " + (expected ? "YES" : "NO") + ")\n";
+}
+
+function insertIframe(maxAge, loaded) {
+ const iframe = document.createElement('iframe');
+ document.body.appendChild(iframe);
+ iframe.src = "resources/iframe-with-script.cgi?script-cache-control=immutable,max-age=" + maxAge;
+ iframe.onload = () => loaded(iframe);
+}
+
+function test(maxAge, callback) {
+ insertIframe(maxAge, (iframe) => {
+ const firstNumber = iframe.contentWindow.randomNumber;
+ iframe.onload = () => callback(firstNumber != iframe.contentWindow.randomNumber);
+ iframe.contentWindow.location.reload();
+ });
+}
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestscacheresourcesiframewithscriptcgi"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/cache/resources/iframe-with-script.cgi (0 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cache/resources/iframe-with-script.cgi         (rev 0)
+++ trunk/LayoutTests/http/tests/cache/resources/iframe-with-script.cgi        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+#!/usr/bin/perl -w
+
+use CGI;
+
+print "Content-type: text/html\n";
+print "Cache-control: no-cache\n";
+print "\n";
+
+my $query = new CGI;
+my $scriptCacheControl = $query->param("script-cache-control");
+
+print "<script src='cache-simulator.cgi?uniqueId=1&Cache-control=";
+print $scriptCacheControl;
+print "'></script>\n";
</ins><span class="cx">Property changes on: trunk/LayoutTests/http/tests/cache/resources/iframe-with-script.cgi
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svnexecutable"></a>
<div class="addfile"><h4>Added: svn:executable</h4></div>
<ins>+*
</ins><span class="cx">\ No newline at end of property
</span><a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211287 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-27 18:39:16 UTC (rev 211287)
+++ trunk/Source/WebCore/ChangeLog        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2017-01-27 Antti Koivisto <antti@apple.com>
+
+ Implement Cache-control: immutable
+ https://bugs.webkit.org/show_bug.cgi?id=167497
+
+ Reviewed by Chris Dumez.
+
+ Cache-control value 'immutable' indicates that a subresource does not change and so does not need to be
+ revalidated on a normal reload. This can significantly speed up reloads and reduce network traffic.
+
+ It is has been implemented in Firefox and is already used by Facebook.
+
+ https://tools.ietf.org/html/draft-mcmanus-immutable-00
+ https://hacks.mozilla.org/2017/01/using-immutable-caching-to-speed-up-the-web/
+
+ This patch implements Cache-control: immutable for memory cache only. A disk cache implementation
+ doesn't seem necessary as the resource is basically always expected to be in memory cache on reload.
+
+ Immutable is only supported for https as suggested by the draft specification (and Gecko implementation).
+
+ Test: http/tests/cache/cache-control-immutable-http.html
+ http/tests/cache/cache-control-immutable-https.html
+
+ * loader/cache/CachedResource.cpp:
+ (WebCore::CachedResource::makeRevalidationDecision):
+
+ On normal reloads (CachePolicyRevalidate) of https resources check for 'Cache-control: immutable'.
+ If the resource is not expired don't revalidate it.
+
+ * platform/network/CacheValidation.cpp:
+ (WebCore::parseCacheControlDirectives):
+ * platform/network/CacheValidation.h:
+ * platform/network/ResourceResponseBase.cpp:
+ (WebCore::ResourceResponseBase::cacheControlContainsImmutable):
+ * platform/network/ResourceResponseBase.h:
+
</ins><span class="cx"> 2017-01-27 Youenn Fablet <youennf@gmail.com>
</span><span class="cx">
</span><span class="cx"> [WebRTC] Use MediaEndPointPeerConnection if not using libwebrtc
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedResourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedResource.cpp (211287 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedResource.cpp        2017-01-27 18:39:16 UTC (rev 211287)
+++ trunk/Source/WebCore/loader/cache/CachedResource.cpp        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -748,7 +748,14 @@
</span><span class="cx"> return RevalidationDecision::No;
</span><span class="cx">
</span><span class="cx"> case CachePolicyReload:
</span><ins>+ return RevalidationDecision::YesDueToCachePolicy;
+
</ins><span class="cx"> case CachePolicyRevalidate:
</span><ins>+ if (m_response.cacheControlContainsImmutable() && m_response.url().protocolIs("https")) {
+ if (isExpired())
+ return RevalidationDecision::YesDueToExpired;
+ return RevalidationDecision::No;
+ }
</ins><span class="cx"> return RevalidationDecision::YesDueToCachePolicy;
</span><span class="cx">
</span><span class="cx"> case CachePolicyVerify:
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkCacheValidationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/CacheValidation.cpp (211287 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/CacheValidation.cpp        2017-01-27 18:39:16 UTC (rev 211287)
+++ trunk/Source/WebCore/platform/network/CacheValidation.cpp        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -316,7 +316,8 @@
</span><span class="cx"> double maxStale = directives[i].second.toDouble(&ok);
</span><span class="cx"> if (ok)
</span><span class="cx"> result.maxStale = duration_cast<microseconds>(duration<double>(maxStale));
</span><del>- }
</del><ins>+ } else if (equalLettersIgnoringASCIICase(directives[i].first, "immutable"))
+ result.immutable = true;
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkCacheValidationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/CacheValidation.h (211287 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/CacheValidation.h        2017-01-27 18:39:16 UTC (rev 211287)
+++ trunk/Source/WebCore/platform/network/CacheValidation.h        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -66,6 +66,7 @@
</span><span class="cx"> bool noCache { false };
</span><span class="cx"> bool noStore { false };
</span><span class="cx"> bool mustRevalidate { false };
</span><ins>+ bool immutable { false };
</ins><span class="cx"> };
</span><span class="cx"> WEBCORE_EXPORT CacheControlDirectives parseCacheControlDirectives(const HTTPHeaderMap&);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceResponseBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp (211287 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp        2017-01-27 18:39:16 UTC (rev 211287)
+++ trunk/Source/WebCore/platform/network/ResourceResponseBase.cpp        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -425,6 +425,13 @@
</span><span class="cx"> parseCacheControlDirectives();
</span><span class="cx"> return m_cacheControlDirectives.mustRevalidate;
</span><span class="cx"> }
</span><ins>+
+bool ResourceResponseBase::cacheControlContainsImmutable() const
+{
+ if (!m_haveParsedCacheControlHeader)
+ parseCacheControlDirectives();
+ return m_cacheControlDirectives.immutable;
+}
</ins><span class="cx">
</span><span class="cx"> bool ResourceResponseBase::hasCacheValidatorFields() const
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceResponseBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceResponseBase.h (211287 => 211288)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceResponseBase.h        2017-01-27 18:39:16 UTC (rev 211287)
+++ trunk/Source/WebCore/platform/network/ResourceResponseBase.h        2017-01-27 18:44:18 UTC (rev 211288)
</span><span class="lines">@@ -119,10 +119,10 @@
</span><span class="cx"> const std::optional<CertificateInfo>& certificateInfo() const { return m_certificateInfo; };
</span><span class="cx">
</span><span class="cx"> // These functions return parsed values of the corresponding response headers.
</span><del>- // NaN means that the header was not present or had invalid value.
</del><span class="cx"> WEBCORE_EXPORT bool cacheControlContainsNoCache() const;
</span><span class="cx"> WEBCORE_EXPORT bool cacheControlContainsNoStore() const;
</span><span class="cx"> WEBCORE_EXPORT bool cacheControlContainsMustRevalidate() const;
</span><ins>+ WEBCORE_EXPORT bool cacheControlContainsImmutable() const;
</ins><span class="cx"> WEBCORE_EXPORT bool hasCacheValidatorFields() const;
</span><span class="cx"> WEBCORE_EXPORT std::optional<std::chrono::microseconds> cacheControlMaxAge() const;
</span><span class="cx"> WEBCORE_EXPORT std::optional<std::chrono::system_clock::time_point> date() const;
</span></span></pre>
</div>
</div>
</body>
</html>