Title: [181895] trunk
Revision
181895
Author
[email protected]
Date
2015-03-24 09:50:55 -0700 (Tue, 24 Mar 2015)

Log Message

[WK2] NetworkCache retrievals fail for entries with no body
https://bugs.webkit.org/show_bug.cgi?id=142979
<rdar://problem/20264100>

Reviewed by Antti Koivisto.

Source/WebKit2:

NetworkCache retrievals were failing for entries with no body because
decodeEntry() doesn't correctly handle this case. In particular, the
following check fails:
"metaData.bodyOffset + metaData.bodySize == fileData.size()".
This is because bodyOffset is pageSize-aligned.

As a result, the following resource on apple.com is stored in the cache
but we fail to reuse it and reload it from the network every time:
http://images.apple.com/home/styles/promos.css

This patch updates decodeEntry() to create a null Data object for the
body if bodySize is 0.

* NetworkProcess/cache/NetworkCacheDataCocoa.mm:
(WebKit::NetworkCache::Data::data):
Do not attempt to initialize m_data if m_dispatchData is null as the
call to dispatch_data_create_map() would then crash. We now return
null in this case. This is needed as decodeStorageEntry() in
NetworkCache.cpp constructs a SharedBuffer from
storageEntry.body.data() and the body may be null.

* NetworkProcess/cache/NetworkCacheStorage.cpp:
(WebKit::NetworkCache::decodeEntry):

LayoutTests:

Add network disk cache validation test for resources that have no body
(only headers).

* http/tests/cache/disk-cache/disk-cache-validation-no-body-expected.txt: Added.
* http/tests/cache/disk-cache/disk-cache-validation-no-body.html: Added.
* http/tests/cache/disk-cache/resources/generate-response-no-body.cgi: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (181894 => 181895)


--- trunk/LayoutTests/ChangeLog	2015-03-24 16:44:19 UTC (rev 181894)
+++ trunk/LayoutTests/ChangeLog	2015-03-24 16:50:55 UTC (rev 181895)
@@ -1,5 +1,20 @@
 2015-03-24  Chris Dumez  <[email protected]>
 
+        [WK2] NetworkCache retrievals fail for entries with no body
+        https://bugs.webkit.org/show_bug.cgi?id=142979
+        <rdar://problem/20264100>
+
+        Reviewed by Antti Koivisto.
+
+        Add network disk cache validation test for resources that have no body
+        (only headers).
+
+        * http/tests/cache/disk-cache/disk-cache-validation-no-body-expected.txt: Added.
+        * http/tests/cache/disk-cache/disk-cache-validation-no-body.html: Added.
+        * http/tests/cache/disk-cache/resources/generate-response-no-body.cgi: Added.
+
+2015-03-24  Chris Dumez  <[email protected]>
+
         [WK2] The WebKit network cache does not cache responses with "Content-Disposition: attachment" header
         https://bugs.webkit.org/show_bug.cgi?id=142989
         <rdar://problem/20265992>

Added: trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-validation-no-body-expected.txt (0 => 181895)


--- trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-validation-no-body-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-validation-no-body-expected.txt	2015-03-24 16:50:55 UTC (rev 181895)
@@ -0,0 +1,902 @@
+Test permutations of various cache headers
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+running 243 tests
+
+response headers: undefined
+response source: Network
+
+response headers: {"Cache-control":"max-age=0"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100"}
+response source: Disk cache
+
+response headers: {"Expires":"now(0)"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(0)"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(0)"}
+response source: Disk cache
+
+response headers: {"Expires":"now(100)"}
+response source: Disk cache
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(100)"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(100)"}
+response source: Disk cache
+
+response headers: {"Cache-control":"no-store"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-store"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(0)"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(0)"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-store"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(100)"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(100)"}
+response source: Network
+
+response headers: {"Cache-control":"no-cache"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-cache"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(0)"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(0)"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-cache"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(100)"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(100)"}
+response source: Network
+
+response headers: {"ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=0","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100","ETag":"match"}
+response source: Disk cache
+
+response headers: {"Expires":"now(0)","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(0)","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(0)","ETag":"match"}
+response source: Disk cache
+
+response headers: {"Expires":"now(100)","ETag":"match"}
+response source: Disk cache
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(100)","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(100)","ETag":"match"}
+response source: Disk cache
+
+response headers: {"Cache-control":"no-store","ETag":"match"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","ETag":"match"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","ETag":"match"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-store","ETag":"match"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(0)","ETag":"match"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(0)","ETag":"match"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-store","ETag":"match"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(100)","ETag":"match"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(100)","ETag":"match"}
+response source: Network
+
+response headers: {"Cache-control":"no-cache","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=0, no-cache","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100, no-cache","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Expires":"now(0)","Cache-control":"no-cache","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(0)","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(0)","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Expires":"now(100)","Cache-control":"no-cache","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(100)","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(100)","ETag":"match"}
+response source: Disk cache after validation
+
+response headers: {"ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","ETag":"nomatch"}
+response source: Disk cache
+
+response headers: {"Expires":"now(0)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(0)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(0)","ETag":"nomatch"}
+response source: Disk cache
+
+response headers: {"Expires":"now(100)","ETag":"nomatch"}
+response source: Disk cache
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(100)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(100)","ETag":"nomatch"}
+response source: Disk cache
+
+response headers: {"Cache-control":"no-store","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-store","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(0)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(0)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-store","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(100)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(100)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"no-cache","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-cache","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(0)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(0)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-cache","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(100)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(100)","ETag":"nomatch"}
+response source: Network
+
+response headers: {"Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Cache-control":"no-store","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-store","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-store","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"no-cache","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-cache","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-cache","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=0","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Cache-control":"no-store","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-store","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-store","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"no-cache","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=0, no-cache","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100, no-cache","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Expires":"now(0)","Cache-control":"no-cache","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Expires":"now(100)","Cache-control":"no-cache","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache after validation
+
+response headers: {"ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Disk cache
+
+response headers: {"Cache-control":"no-store","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-store","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-store","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"no-cache","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-cache","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-cache","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"en"}
+response source: Network
+
+response headers: {"Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"no-store","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-store","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-store","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"no-cache","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-cache","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(0)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-cache","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(100)","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"no-store","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-store","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-store","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"no-cache","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-cache","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(0)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-cache","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(100)","ETag":"match","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"no-store","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-store","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-store","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-store","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-store","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"no-cache","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(0)","Cache-control":"no-cache","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(0)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Expires":"now(100)","Cache-control":"no-cache","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=0, no-cache","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+response headers: {"Cache-control":"max-age=100, no-cache","Expires":"now(100)","ETag":"nomatch","Vary":"Accept-Language"}
+request headers: {"Accept-Language":"unique()"}
+response source: Network
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-validation-no-body.html (0 => 181895)


--- trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-validation-no-body.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-validation-no-body.html	2015-03-24 16:50:55 UTC (rev 181895)
@@ -0,0 +1,45 @@
+<script src=""
+<script src=""
+<body>
+<script>
+
+var testMatrix =
+[
+ [
+  {},
+  { responseHeaders: {'Cache-control': 'max-age=0' } },
+  { responseHeaders: {'Cache-control': 'max-age=100' } },
+  ],
+ [
+  {},
+  { responseHeaders: {'Expires': 'now(0)' } },
+  { responseHeaders: {'Expires': 'now(100)' } },
+  ],
+ [
+  {},
+  { responseHeaders: {'Cache-control': 'no-store' } },
+  { responseHeaders: {'Cache-control': 'no-cache' } },
+  ],
+ [
+  {},
+  { responseHeaders: {'ETag': 'match' } },
+  { responseHeaders: {'ETag': 'nomatch' } },
+  ],
+ [
+  {},
+  { responseHeaders: {'Vary': 'Accept-Language' }, requestHeaders: { 'Accept-Language': 'en' } },
+  { responseHeaders: {'Vary': 'Accept-Language' }, requestHeaders: { 'Accept-Language': 'unique()' } },
+  ],
+ ];
+
+description("Test permutations of various cache headers");
+
+var tests = generateTests(testMatrix, false /* withBody */);
+
+debug("running " + tests.length + " tests");
+debug("");
+
+runTests(tests);
+
+</script>
+<script src=""

Added: trunk/LayoutTests/http/tests/cache/disk-cache/resources/generate-response-no-body.cgi (0 => 181895)


--- trunk/LayoutTests/http/tests/cache/disk-cache/resources/generate-response-no-body.cgi	                        (rev 0)
+++ trunk/LayoutTests/http/tests/cache/disk-cache/resources/generate-response-no-body.cgi	2015-03-24 16:50:55 UTC (rev 181895)
@@ -0,0 +1,17 @@
+#!/usr/bin/perl -w
+
+use CGI;
+use HTTP::Date;
+
+my $query = new CGI;
+@names = $query->param;
+
+if ($query->http && $query->http("If-None-Match") eq "match") {
+    print "Status: 304\n";
+}
+
+foreach (@names) {
+    next if ($_ eq "uniqueId");
+    print $_ . ": " . $query->param($_) . "\n";
+}
+print "\n";
Property changes on: trunk/LayoutTests/http/tests/cache/disk-cache/resources/generate-response-no-body.cgi
___________________________________________________________________

Added: svn:executable

Modified: trunk/Source/WebKit2/ChangeLog (181894 => 181895)


--- trunk/Source/WebKit2/ChangeLog	2015-03-24 16:44:19 UTC (rev 181894)
+++ trunk/Source/WebKit2/ChangeLog	2015-03-24 16:50:55 UTC (rev 181895)
@@ -1,5 +1,37 @@
 2015-03-24  Chris Dumez  <[email protected]>
 
+        [WK2] NetworkCache retrievals fail for entries with no body
+        https://bugs.webkit.org/show_bug.cgi?id=142979
+        <rdar://problem/20264100>
+
+        Reviewed by Antti Koivisto.
+
+        NetworkCache retrievals were failing for entries with no body because
+        decodeEntry() doesn't correctly handle this case. In particular, the
+        following check fails:
+        "metaData.bodyOffset + metaData.bodySize == fileData.size()".
+        This is because bodyOffset is pageSize-aligned.
+
+        As a result, the following resource on apple.com is stored in the cache
+        but we fail to reuse it and reload it from the network every time:
+        http://images.apple.com/home/styles/promos.css
+
+        This patch updates decodeEntry() to create a null Data object for the
+        body if bodySize is 0.
+
+        * NetworkProcess/cache/NetworkCacheDataCocoa.mm:
+        (WebKit::NetworkCache::Data::data):
+        Do not attempt to initialize m_data if m_dispatchData is null as the
+        call to dispatch_data_create_map() would then crash. We now return
+        null in this case. This is needed as decodeStorageEntry() in
+        NetworkCache.cpp constructs a SharedBuffer from
+        storageEntry.body.data() and the body may be null.
+
+        * NetworkProcess/cache/NetworkCacheStorage.cpp:
+        (WebKit::NetworkCache::decodeEntry):
+
+2015-03-24  Chris Dumez  <[email protected]>
+
         [WK2] The WebKit network cache does not cache responses with "Content-Disposition: attachment" header
         https://bugs.webkit.org/show_bug.cgi?id=142989
         <rdar://problem/20265992>

Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm (181894 => 181895)


--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm	2015-03-24 16:44:19 UTC (rev 181894)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm	2015-03-24 16:50:55 UTC (rev 181895)
@@ -49,7 +49,7 @@
 
 const uint8_t* Data::data() const
 {
-    if (!m_data) {
+    if (!m_data && m_dispatchData) {
         const void* data;
         size_t size;
         m_dispatchData = adoptDispatch(dispatch_data_create_map(m_dispatchData.get(), &data, &size));

Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp (181894 => 181895)


--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp	2015-03-24 16:44:19 UTC (rev 181894)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp	2015-03-24 16:50:55 UTC (rev 181895)
@@ -212,18 +212,22 @@
 
     if (metaData.key != key)
         return nullptr;
-    if (metaData.bodyOffset + metaData.bodySize != fileData.size())
-        return nullptr;
 
-    auto bodyData = mapFile(fd, metaData.bodyOffset, metaData.bodySize);
-    if (bodyData.isNull()) {
-        LOG(NetworkCacheStorage, "(NetworkProcess) map failed");
-        return nullptr;
-    }
+    Data bodyData;
+    if (metaData.bodySize) {
+        if (metaData.bodyOffset + metaData.bodySize != fileData.size())
+            return nullptr;
 
-    if (metaData.bodyChecksum != hashData(bodyData)) {
-        LOG(NetworkCacheStorage, "(NetworkProcess) data checksum mismatch");
-        return nullptr;
+        bodyData = mapFile(fd, metaData.bodyOffset, metaData.bodySize);
+        if (bodyData.isNull()) {
+            LOG(NetworkCacheStorage, "(NetworkProcess) map failed");
+            return nullptr;
+        }
+
+        if (metaData.bodyChecksum != hashData(bodyData)) {
+            LOG(NetworkCacheStorage, "(NetworkProcess) data checksum mismatch");
+            return nullptr;
+        }
     }
 
     return std::make_unique<Storage::Entry>(Storage::Entry {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to