Title: [194326] trunk
Revision
194326
Author
[email protected]
Date
2015-12-20 20:23:09 -0800 (Sun, 20 Dec 2015)

Log Message

Don't allocate a NSImage and skip unneeded call to TIFFRepresentation when copying image to clipboard.
https://bugs.webkit.org/show_bug.cgi?id=152374

Patch by Jeremy Zerfas <[email protected]> on 2015-12-20
Reviewed by Darin Adler.

Source/WebCore:

When copying an image to the clipboard, don't bother allocating a
NSImage and skip the unneeded call to TIFFRepresentation since the data
from the previous getTIFFRepresentation call can be used instead. This
considerably reduces the amount of memory and CPU time used for large
images/animations.

Test: fast/images/image-copy-memory-usage.html

* platform/mac/PasteboardMac.mm:
(WebCore::Pasteboard::write):

LayoutTests:

Added test to make sure that when copying a 50 frame 500x500 animation
(50 MB uncompressed) to the clipboard, the additional memory usage is
kept to less than 200 MB.

* fast/images/image-copy-memory-usage-expected.txt: Added.
* fast/images/image-copy-memory-usage.html: Added.
* fast/images/resources/dot-moving-in-a-circle-animation.gif: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (194325 => 194326)


--- trunk/LayoutTests/ChangeLog	2015-12-21 02:54:32 UTC (rev 194325)
+++ trunk/LayoutTests/ChangeLog	2015-12-21 04:23:09 UTC (rev 194326)
@@ -1,3 +1,18 @@
+2015-12-20  Jeremy Zerfas  <[email protected]>
+
+        Don't allocate a NSImage and skip unneeded call to TIFFRepresentation when copying image to clipboard.
+        https://bugs.webkit.org/show_bug.cgi?id=152374
+
+        Reviewed by Darin Adler.
+
+        Added test to make sure that when copying a 50 frame 500x500 animation
+        (50 MB uncompressed) to the clipboard, the additional memory usage is
+        kept to less than 200 MB.
+
+        * fast/images/image-copy-memory-usage-expected.txt: Added.
+        * fast/images/image-copy-memory-usage.html: Added.
+        * fast/images/resources/dot-moving-in-a-circle-animation.gif: Added.
+
 2015-12-20  Commit Queue  <[email protected]>
 
         Unreviewed, rolling out r194033 and r194267.

Added: trunk/LayoutTests/fast/images/image-copy-memory-usage-expected.txt (0 => 194326)


--- trunk/LayoutTests/fast/images/image-copy-memory-usage-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/images/image-copy-memory-usage-expected.txt	2015-12-21 04:23:09 UTC (rev 194326)
@@ -0,0 +1,14 @@
+This is an automated test related to Bug 152374 - Reduce resource usage when copying image to clipboard.
+
+This tests how much memory is used while copying an animation into the clipboard. The animation consists of 50 500x500 frames and, assuming 32 bits per pixel, will use 50 MB of memory when uncompressed. To pass the test, after copying the animation to the clipboard, the memory usage of the browser must not have increased by more than 200 MBs.
+
+In order to make this test more accurate it should be performed in a freshly started browser session that has nothing else open and which has an empty cache.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS changeInCommittedVMBytes < 200000000 is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/images/image-copy-memory-usage.html (0 => 194326)


--- trunk/LayoutTests/fast/images/image-copy-memory-usage.html	                        (rev 0)
+++ trunk/LayoutTests/fast/images/image-copy-memory-usage.html	2015-12-21 04:23:09 UTC (rev 194326)
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="UTF-8" />
+		<title>image-copy-memory-usage.html</title>
+		<script src=""
+	</head>
+
+	<body>
+		<script type="text/_javascript_">
+			description("This is an automated test related to " +
+			    "<a href="" 152374 - Reduce resource usage when " +
+			    "copying image to clipboard</a>.<br />" +
+			    "<br />" +
+			    "This tests how much memory is used while copying an animation into the clipboard. The animation " +
+			    "consists of 50 500x500 frames and, assuming 32 bits per pixel, will use 50 MB of memory when " +
+			    "uncompressed. To pass the test, after copying the animation to the clipboard, the memory usage of " +
+			    "the browser must not have increased by more than 200 MBs.<br />" +
+			    "<br />" +
+			    "In order to make this test more accurate it should be performed in a freshly started browser " +
+			    "session that has nothing else open and which has an empty cache.");
+
+			window.jsTestIsAsync = true;
+
+			var changeInCommittedVMBytes; // Needs to be global for shouldBeTrue() to see it.
+
+			function tryToSetUpAndRunTest()
+			{
+			    // Exit if the mallocStatistics() function is not available since it is needed to automatically
+			    // determine the results of the test.
+			    if (!window.internals || !window.internals.mallocStatistics) {
+			        debug("The mallocStatistics() function is not available, you will need to check memory usage " +
+			            "manually. First record the memory usage of the browser. Then copy the animation into the " +
+			            "clipboard. Finally check the memory usage of the browser again and subtract the amount of " +
+			            "memory that it was using previously. If the difference is greater than 200 MBs, the browser " +
+			           "has failed the test.<br />");
+			        return;
+			    }
+
+			    var initialCommittedVMBytes = window.internals.mallocStatistics().committedVMBytes;
+			    // Add a listener for clipboard copy events which will then check how much memory was used to perform
+			    // the copy and also finish the test. setTimeout() is used with a zero delay in order to cause this to
+			    // run after the copy is finished.
+			    document.getElementById("animationFrame").contentWindow.document.addEventListener("copy",
+			        setTimeout(
+			        	function()
+			            {
+			                var finalCommittedVMBytes = window.internals.mallocStatistics().committedVMBytes;
+			                changeInCommittedVMBytes = finalCommittedVMBytes - initialCommittedVMBytes;
+			                shouldBeTrue("changeInCommittedVMBytes < 200000000");
+			                window.finishJSTest();
+			            },
+			            0),
+			        false);
+
+			    // Exit if execCommand("copy") is not supported since that is needed to automatically copy the animation
+			    // to the clipboard.
+			    if (!document.queryCommandSupported('copy')) {
+			        debug("execCommand(\"copy\") is not supported. You will need to manually copy the animation into " +
+			            "the clipboard to finish the test.<br />");
+			        return;
+			    }
+
+			    document.getElementById("animationFrame").contentWindow.document.execCommand("copy");
+			}
+		</script>
+
+		<!-- The "Copy Image" option doesn't show up in the image context menu if using a data URI and that might make
+		-    it difficult to perform a copy manually so load the image from a file instead.
+		-->
+		<iframe id="animationFrame" width="500" height="500" _onload_="tryToSetUpAndRunTest()"
+		  src=""
+		</iframe>
+	</body>
+</html>

Added: trunk/LayoutTests/fast/images/resources/dot-moving-in-a-circle-animation.gif (0 => 194326)


--- trunk/LayoutTests/fast/images/resources/dot-moving-in-a-circle-animation.gif	                        (rev 0)
+++ trunk/LayoutTests/fast/images/resources/dot-moving-in-a-circle-animation.gif	2015-12-21 04:23:09 UTC (rev 194326)
@@ -0,0 +1,28 @@
+GIF89a\xF4\xF4\xF1\xE6\xE6\xE6!\xFFNETSCAPE2.0!\xF9\xFF,\xF4\xF4@\xFF\x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋ\xB3޼\xFB\x86\xE2H\x96扦\xEAʶ\xEE\xC7\xF2L\xD7\xF6\x8D\xE7\xFA\xCE\xF7\xFE
+\x87Ģ\xF1\x88L*\x97̦\xF3	\x8DJ\xA7Ԫ\xF5\x8A\xCDj\xB7ܮ\xF7\x8B\xC7\xE4\xB2\xF9\x8CN\xAB\xD7\xEC\xB6\xFB+\x8F\xCB\xE7\xF4\xBA\xFD\x8E\xCF\xEB\xF7\xFC\xBE\xFF(8HXhx\xA8\xA0\x80\xD8\xE8H\xB6\xB8\xF88IYiy\x89\x99\xA9\xB9\xC9\xD9\xE9\xF9	*:JZjz\x8A\x9A\xAA\xBA\xCA\xDA\xEA\xFA
++;K[k{\x8B\x9B\xAB\xBB\xCB\xDB\xEB\xFB,<L\l|\x8C\x9C\xAC\xBC\xCC\xDC\xEC\xFC-=M]m}\x8D\x9D\xAD\xBD\xCD\xDD\xED\xFD+.>N^n~\x8E\x9E\xAE\xBE\xCE\xDE\xEE\xFE/?O_o\x8F\x9F\xAF\xBF\xCF\xDF\xEF\xFF0\xA0\xC0\x81<\x880\xA1…:|1\xA2ĉ+Z\xBC\x881\xA3ƍ\xFF;z\xFC2\xA4ȑ$K:\x8A\x84\x92\x91ɕ,[\xBA|	3\xA6̙4kڼ\x893\xA7Ν<{\xFA\xFC	4\xA8СD\x8B=\x8A4\xA9ҥL\x9B:}
+5\xAAԩT\xABZ\xBD\x8A5\xAB֭\\xBBz\xFD
+6\xACرd˚=\x8B6\xADڵlۺ}7\xAEܹt\xEBڽ\x8B7\xAF޽|\xFB\xFA\xFD8\xB0\xE0\xC1\x84>\x8C8\xB1\xE2Ō;~9\xB2\xE4ɔ+[\xBE\x8C9\xB3\xE6͜+\xA7T\xD49\xCCgI\xA1K\x9B>\x8D:\xB5\xEAլ[\xBB~+;\xB6\xECٴk۾\x8D;\xB7\xEEݼ{\xFB\xFE+<\xB8\xF0\xE1ċ?\x8E<\xB9\xF2\xE5̛;=\xBA\xF4\xE9ԫ[\xBF\x8E=\xBB\xF6\xEDܻ{\xFF>\xBC\xF8\xF1\xE4˛?\x8F>\xBD\xFA\xF5\xECۻ?\xBE\xFC\xF9\xF4\xEBۿ\x8F?\xBF\xFE\xFD\xFC\xFB\xFB\xFF\xFF`\x80H`\x81\x88`\x82
+.\xC8`\x83>a\x84NHa\x85^\x88a\x86n\xC8a\x87~b\x88"\x8EHb\x89&\x9E\x88b\x8A*\xAE\xC8b\x8B.\xBEc\x8C2\xCEHc\x8D6ވc\x8E:\xEE\xC8c\x8F>\xFEd\x90BId\x91F\x89LJ\x8E\x9AL\xAA\xE4\xE4gF\x82d\x95V^\x89e\x96Zn\xC9e\x97^~	f\x98b\x8EIf\x99f\x9E\x89f\x9Aj\xAE\xC9f\x9Bn\xBE	g\x9Cr\xCEIg\x9Dvމg\x9Ez\xEE\xC9g\x9F~\xFE	h\xA0\x82Jh\xA1\x86\x8Ah\xA2\x8A.\xCAh\xA3\x8E>
+i\xA4\x92NJi\xA5\x96^\x8Ai\xA6\x9An\xCAi\xA7\x9E~
+j\xA8\xA2\x8EJj\xA9\xA6\x9E\x8Aj\xAA\xAA\xAE\xCAj\xAB\xAE\xBE
+k\xAC\xB2\xCEJk\xAD\xB6ފk\xAE\xBA\xEE\xCAk\xAF\xBE\xFE
+l\xB0\xC2Kl\xB1\xC6\x8Bl\xB2\xCA.\xCBl\xB3\xCE>m\xB4\xD2NKm\xB5\xD6^\x8Bm\xB6\xDAn\xCBm\xB7\xDE~M!\xF9,\xF5\x88\x8C\x8F\xA9\xCB\x9ANW\xED=9o\xD3U>ci\x9E\xE1\xC8yl\x9B!\xF9,\x89+\x8C\x8F\xA9\xCB\xED\xA3HU\xEB=9\xEF\xDE]\xA0'\x8DZiZ\xE2\xB8Ma\xEBRG!\xF9,\x8C\x8C\x8F\xA9\xCB\xED\xA3d\xA0\x82\x89\xAC\xC5A\xEB\xE9yR\xF8E\xE4f\x9E\xD7Hr!g\x94A!\xF9,!\x90 \x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4Z2\xB0Z\xD3\xDEI \x8D!dzh\xBA\x95\xE6GVgP!\xF9,.\x97 \x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4\xDA\xEB\x80vo\xEAyRF\xA4\x9D_\xAAr\xE6	\x96!\xF9,;\x9F \x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4\xDA\x81to\xE9yP>\xA4\xE8\x9C_\xAAr\xE6	\x96!\xF9,F\xA8!\x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋ\xB3\xD0\xDEm`\xF8\x8Cci\x92M\xAA2,\xB1"\xF8\xA9!\xF9,Q\xB3!\x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋ+\xD8 r\xFE|_#\x8AL9.(\xA8\xAE݉\x86&\x94!\xF9,Y\xBF
 "\x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋ\xB3\xC4\xDE= ،#c\x92K\xAE\xAC\x87\xA6\xE2	\xA9A!\xF9,a\xCC \x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋ\xD8\xC0q\xAE}`"\x8Ad9hj\xAC\x9B\xB2\x86\x9F\x97!\xF9,f\xDA \x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋؠq\xAE} "\x8Ad9h\xAC[\xB2\x86\x9F\x97!\xF9,j\xE9 \x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4Z	2XZ\xA7\xDE h\x8Ca`zh\xBA\x95\xE6G*gP!\xF9,l\xF8
+\x8C\x8F\xA9\xCB\xED\xA3\x9Ct\x81\xC6g\xEF\xE0\x85\xE2Hz\xA0ؙ\xC8g!\xF9,j \x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4Z2XZ\xA7\xDE h\x8Ca`zh\xBA\x95\xE6G*\xE7Q!\xF9,f!\x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋؠq\xBE|_"\x8AH9j\xE8v\xAE][\x86&\x93&!\xF9,a$!\x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋ\xD8\xC0q\xCE|\x9F"\x8AI9"(\xA8\xAE݉\x86f\x93*!\xF9,Y2"\x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋ\xB3\xC4\xDE= ،#c\x92K\xAE\xAC\x87\xA6\xE2	\xA9M!\xF9,Q?!\x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋ\xD8 r\xFE|\x9F&\x8EKi*(x\xAE\xB3\x86\xA2\xC76!\xF9,FK"\x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4ڋ\xF3\xD0\xDEI \x8D\xE3c\x92N\xAE\xAC\x87\xA6\xE29\xA9P!\xF9,;V \x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4\xDAk\x80to\xE9yP>\xA4\xE8\x9C_\xAAr\xE6	\x96
+!\xF9,._ \x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4Z
+2\xB0Z\xE3\xEEE (\x8E\xE1c\x9EN\x9AI\xE9\xD7q*T!\xF9,!g\x8C\x8F\xA9\xCB\xED\xA3\x9C\xB4>\x80\x81͙r.}_$\x82Pٝ\xA8F\x96\xDEX\x99R!\xF9,n\x8C\x8F\xA9\xCB\xED#\xC8T\xEB59\xDF\xDEI\xA0\x8DZiZ\xE2\xB8`˝W!\xF9,r+\x8C\x8F\xA9\xCB\xED\x81\x90\xCDYӽ\xD9\xEC\xDD}\&bdI\x85bw|,2\xB2!\xF9,\xF5u\x8C\x8F\xA9+\x93s1\xCEYսm\xDCcS\x8A_zl\xACG\xB2!\xF9,\xE6u\x8C\x81`\xCB활l\xCEY\xEB}9n\xD6y\xDF*\xE3\x9E\x94\xA6\xAEH\x8F!\xF9,\xD7r+ \x8C\x81`\xCB활l\xCEY\xEB}9n\xD6y\xDF*\xE3\x9E\x94\xA6\xAEH\xC7\xF2<!\xF9,\xC9n!\x8C\x81`\xCBݙ\x9CdNY\xEB}9\xEE\xD5y_"#؝\x94\xA6\xAEf\xC7\xF2LK!\xF9,\xBCg#\x8C\x81`\xCB͙\x9C\NW\xEB}9\xEE\xD3!\x8E\xA4f\x9EbJy\xEC\xC7\xF2L\xD76S!\xF9,\xAF_#\x8C\x81`\xCB͙\x9C\NW\xEB}9\xEE\xD3!\x8E\xA4f\x9EbJy\xEC\xC7\xF2L\xD7\xF6\xBD!\xF9,\xA4V#\x8C\x81`\xCB}\x89
 \x9CNV\xEB}9\xEE\x9El\xA8\x88\xA0\xB8d(\xAE\xEE\xC7\xF2L\xD7\xF6\xCD!\xF9,\x99K$\x8C\x81`\xCB}\x89\x9CNV\xEB}9\xEE\x9El\xA8\x88\xA0\xB8d(\xAE\xEE\xC7\xF2L\xD7\xF6\x8D\xDB!\xF9,\x91?#\x8C\x81`˜\xD9\xE2{q\xCDYåu\xC3\xEE)\x99\x97YXi"\xE8ʶ\xEE\xC7\xF2L\xD7\xF6\!\xF9,\x892#\x8C\x81`˜\xD9\xE2{q\xCDYåu\xC3\xEE)\x99\x97YXi"\xE8ʶ\xEE\xC7\xF2L\xD7\xF6\xED!\xF9,\x84$"\x8C\x81`ˑ\xD9\xD6{q\xCEf)\xCBps\x85e\xD1q\x8D$b\xA6\xEAʶ\xEE\xC7\xF2L\xD7o!\xF9,\x80!\x8C\x81`˙\xBC\x9C\x83R\xB6\xFA"FwSV(r䉦\xEAʶ\xEE\xC7\xF2L\x87!\xF9,~ \x8C\x81`{\x89\x9C[R\xB6\xFA"\xCE;\xEB
+\x81Ч\x8C扦\xEAʶ\xEE\xC72Z!\xF9,~\xF8
+\x8C\x81`\x9B\xC9\x{D81C}\xB4\xC2@_[\xC7\xF1\x86\xE2H\x96扦\xAAY!\xF9,~\xE9 \x8C+	Ǫ\x9C;R\xA2\xFA"NwSUP\xB7\x8C扦\xEAʶ\xEEDzY!\xF9,\x80\xDA"\x8C\xA0\x80\xBD\xDB\xCC{n\xD2c\xAF\xCC
+\xF1\xEEeQ2\x8Dh\xA6\xEAʶ\xEE\xC7\xF2L\xD7f!\xF9,\x84\xCC!\x8Co\xA0\x80\xBB\\x82\xB1Qjo=z\xCF\xEE\x80\xD2%q^\x89\xA6\xEAʶ\xEE\xC7\xF2L;!\xF9,\x89\xBF#\x8C\x8F\xE9\xC6\xD8C1NU\xED\xCB\xDAq\xB9}\xCD\xF4]Pe]ʶ\xEE\xC7\xF2L\xD7\xF6\xDD!\xF9,\x91\xB3#\x8C\x8F\xE9\xC6\xD8C1NU\xED\xCB\xDAq\xB9}\xCD\xF4]Pe]ʶ\xEE\xC7\xF2L׶\!\xF9,\x99\xA8$\x8C\x8F\xE9\xC9\xD8{1NU\xED+Y\xDF.m\xE0\xB2`yd(F\xAE\xEE\xC7\xF2L\xD7\xF6\x8D\x97!\xF9,\xA4\x9F#\x8C\x8F\xE9\xC9\xD8{1NU\xED+Y\xDF.m\xE0\xB2`yd(F\xAE\xEE\xC7\xF2L\xD76\!\xF9,\xAF\x97#\x8C\x8F\xC0\xA0\x9FZ\x83PJ\xED\xC5Fo\xEEM\xDC:#\xA9\x9DG\xAA\xAEb\xC7\xF2L\xD7\xF6\xAD!\xF9,\xBC\x90#\x8C\x8F\xC0\xA0\x9FZ\x83PJ\xED\xC5Fo\xEEM\xDC:#\xA9\x9DG\xAA\xAEb\xC7\xF2L׶Z!\xF9,\xC9\x8C!\x8C\x8Fi\xC0\xA0\xAFZ\x83TJ\xED\xC5Gox\x8AYjhg\xAD\xC8\xE7\xC6\xF2L+!\xF9,\xD7\x89+!\x8C\x8Fy\x
 C0\xA0\xFFZ\x834HYսm\xDC\xDFZ\xA3S\x9A[\xBApl˼\xF2L#;
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (194325 => 194326)


--- trunk/Source/WebCore/ChangeLog	2015-12-21 02:54:32 UTC (rev 194325)
+++ trunk/Source/WebCore/ChangeLog	2015-12-21 04:23:09 UTC (rev 194326)
@@ -1,3 +1,21 @@
+2015-12-20  Jeremy Zerfas  <[email protected]>
+
+        Don't allocate a NSImage and skip unneeded call to TIFFRepresentation when copying image to clipboard.
+        https://bugs.webkit.org/show_bug.cgi?id=152374
+
+        Reviewed by Darin Adler.
+
+        When copying an image to the clipboard, don't bother allocating a
+        NSImage and skip the unneeded call to TIFFRepresentation since the data
+        from the previous getTIFFRepresentation call can be used instead. This
+        considerably reduces the amount of memory and CPU time used for large
+        images/animations.
+
+        Test: fast/images/image-copy-memory-usage.html
+
+        * platform/mac/PasteboardMac.mm:
+        (WebCore::Pasteboard::write):
+
 2015-12-20  Gyuyoung Kim  <[email protected]>
 
         Reduce PassRefPtr uses in dom - 2

Modified: trunk/Source/WebCore/platform/mac/PasteboardMac.mm (194325 => 194326)


--- trunk/Source/WebCore/platform/mac/PasteboardMac.mm	2015-12-21 02:54:32 UTC (rev 194325)
+++ trunk/Source/WebCore/platform/mac/PasteboardMac.mm	2015-12-21 04:23:09 UTC (rev 194326)
@@ -255,7 +255,7 @@
 
 void Pasteboard::write(const PasteboardImage& pasteboardImage)
 {
-    NSData *imageData = [pasteboardImage.image->getNSImage() TIFFRepresentation];
+    CFDataRef imageData = pasteboardImage.image->getTIFFRepresentation();
     if (!imageData)
         return;
 
@@ -263,7 +263,7 @@
     ASSERT(MIMETypeRegistry::isSupportedImageResourceMIMEType(pasteboardImage.resourceMIMEType));
 
     m_changeCount = writeURLForTypes(writableTypesForImage(), m_pasteboardName, pasteboardImage.url);
-    m_changeCount = platformStrategies()->pasteboardStrategy()->setBufferForType(SharedBuffer::wrapNSData(imageData), NSTIFFPboardType, m_pasteboardName);
+    m_changeCount = platformStrategies()->pasteboardStrategy()->setBufferForType(SharedBuffer::wrapCFData(imageData), NSTIFFPboardType, m_pasteboardName);
     writeFileWrapperAsRTFDAttachment(fileWrapper(pasteboardImage), m_pasteboardName, m_changeCount);
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to