<!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>[284834] branches/safari-612-branch/Source/WebKit</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/284834">284834</a></dd>
<dt>Author</dt> <dd>alancoon@apple.com</dd>
<dt>Date</dt> <dd>2021-10-25 14:51:10 -0700 (Mon, 25 Oct 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>Cherry-pick <a href="http://trac.webkit.org/projects/webkit/changeset/284102">r284102</a>. rdar://problem/84630200

    WebGL video texture upload is very slow due to excessive transfer of the video pixel buffer
    https://bugs.webkit.org/show_bug.cgi?id=231425

    Patch by Kimmo Kinnunen <kkinnunen@apple.com> on 2021-10-13
    Reviewed by Youenn Fablet.

    Typical WebGL content requests the videos to be uploaded to a texture
    once per render loop update, even though the video has not changed.
    The video pixel buffer is slow to transfer across IPC. It should be transferred
    only when it has changed.

    MediaPlayerPrivateAVFoundationObjC and MediaPlayerPrivateMediaSourceAVFObjC hold
    the last requested pixel buffer ref. They will update it or discard it only
    when pixelBufferForCurrentTime() is called.

    Cache the pixel buffer to MediaPlayerPrivateRemote (GPUP side proxy)
    Cache the pixel buffer to RemoteMediaPlayerProxy (WebP side proxy)

    The caches increase the total memory use only during the duration
    of the call, since after the ref has been updated, it refers
    to the one always held in the original objects (MediaPlayerPrivateAVFoundationObjC
    and MediaPlayerPrivateMediaSourceAVFObjC)

    No new tests, fixes a perf regression wrt GPUP media.

    * GPUProcess/media/RemoteMediaPlayerProxy.cpp:
    (WebKit::RemoteMediaPlayerProxy::invalidate):
    * GPUProcess/media/RemoteMediaPlayerProxy.h:
    * GPUProcess/media/RemoteMediaPlayerProxy.messages.in:
    * GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm:
    (WebKit::RemoteMediaPlayerProxy::nativeImageForCurrentTime):
    (WebKit::RemoteMediaPlayerProxy::pixelBufferForCurrentTimeIfChanged):
    (WebKit::RemoteMediaPlayerProxy::pixelBufferForCurrentTime): Deleted.
    * WebProcess/GPU/media/MediaPlayerPrivateRemote.h:
    * WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm:
    (WebKit::MediaPlayerPrivateRemote::pixelBufferForCurrentTime):

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@284102 268f45cc-cd09-0410-ab3c-d52691b4dbfc</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari612branchSourceWebKitChangeLog">branches/safari-612-branch/Source/WebKit/ChangeLog</a></li>
<li><a href="#branchessafari612branchSourceWebKitGPUProcessmediaRemoteMediaPlayerProxycpp">branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp</a></li>
<li><a href="#branchessafari612branchSourceWebKitGPUProcessmediaRemoteMediaPlayerProxyh">branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h</a></li>
<li><a href="#branchessafari612branchSourceWebKitGPUProcessmediaRemoteMediaPlayerProxymessagesin">branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in</a></li>
<li><a href="#branchessafari612branchSourceWebKitGPUProcessmediacocoaRemoteMediaPlayerProxyCocoamm">branches/safari-612-branch/Source/WebKit/GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm</a></li>
<li><a href="#branchessafari612branchSourceWebKitWebProcessGPUmediaMediaPlayerPrivateRemoteh">branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h</a></li>
<li><a href="#branchessafari612branchSourceWebKitWebProcessGPUmediacocoaMediaPlayerPrivateRemoteCocoamm">branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari612branchSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/ChangeLog (284833 => 284834)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/ChangeLog       2021-10-25 21:51:06 UTC (rev 284833)
+++ branches/safari-612-branch/Source/WebKit/ChangeLog  2021-10-25 21:51:10 UTC (rev 284834)
</span><span class="lines">@@ -1,5 +1,86 @@
</span><span class="cx"> 2021-10-25  Null  <null@apple.com>
</span><span class="cx"> 
</span><ins>+        Cherry-pick r284102. rdar://problem/84630200
+
+    WebGL video texture upload is very slow due to excessive transfer of the video pixel buffer
+    https://bugs.webkit.org/show_bug.cgi?id=231425
+    
+    Patch by Kimmo Kinnunen <kkinnunen@apple.com> on 2021-10-13
+    Reviewed by Youenn Fablet.
+    
+    Typical WebGL content requests the videos to be uploaded to a texture
+    once per render loop update, even though the video has not changed.
+    The video pixel buffer is slow to transfer across IPC. It should be transferred
+    only when it has changed.
+    
+    MediaPlayerPrivateAVFoundationObjC and MediaPlayerPrivateMediaSourceAVFObjC hold
+    the last requested pixel buffer ref. They will update it or discard it only
+    when pixelBufferForCurrentTime() is called.
+    
+    Cache the pixel buffer to MediaPlayerPrivateRemote (GPUP side proxy)
+    Cache the pixel buffer to RemoteMediaPlayerProxy (WebP side proxy)
+    
+    The caches increase the total memory use only during the duration
+    of the call, since after the ref has been updated, it refers
+    to the one always held in the original objects (MediaPlayerPrivateAVFoundationObjC
+    and MediaPlayerPrivateMediaSourceAVFObjC)
+    
+    No new tests, fixes a perf regression wrt GPUP media.
+    
+    * GPUProcess/media/RemoteMediaPlayerProxy.cpp:
+    (WebKit::RemoteMediaPlayerProxy::invalidate):
+    * GPUProcess/media/RemoteMediaPlayerProxy.h:
+    * GPUProcess/media/RemoteMediaPlayerProxy.messages.in:
+    * GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm:
+    (WebKit::RemoteMediaPlayerProxy::nativeImageForCurrentTime):
+    (WebKit::RemoteMediaPlayerProxy::pixelBufferForCurrentTimeIfChanged):
+    (WebKit::RemoteMediaPlayerProxy::pixelBufferForCurrentTime): Deleted.
+    * WebProcess/GPU/media/MediaPlayerPrivateRemote.h:
+    * WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm:
+    (WebKit::MediaPlayerPrivateRemote::pixelBufferForCurrentTime):
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@284102 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-10-13  Kimmo Kinnunen  <kkinnunen@apple.com>
+
+            WebGL video texture upload is very slow due to excessive transfer of the video pixel buffer
+            https://bugs.webkit.org/show_bug.cgi?id=231425
+
+            Reviewed by Youenn Fablet.
+
+            Typical WebGL content requests the videos to be uploaded to a texture
+            once per render loop update, even though the video has not changed.
+            The video pixel buffer is slow to transfer across IPC. It should be transferred
+            only when it has changed.
+
+            MediaPlayerPrivateAVFoundationObjC and MediaPlayerPrivateMediaSourceAVFObjC hold
+            the last requested pixel buffer ref. They will update it or discard it only
+            when pixelBufferForCurrentTime() is called.
+
+            Cache the pixel buffer to MediaPlayerPrivateRemote (GPUP side proxy)
+            Cache the pixel buffer to RemoteMediaPlayerProxy (WebP side proxy)
+
+            The caches increase the total memory use only during the duration
+            of the call, since after the ref has been updated, it refers
+            to the one always held in the original objects (MediaPlayerPrivateAVFoundationObjC
+            and MediaPlayerPrivateMediaSourceAVFObjC)
+
+            No new tests, fixes a perf regression wrt GPUP media.
+
+            * GPUProcess/media/RemoteMediaPlayerProxy.cpp:
+            (WebKit::RemoteMediaPlayerProxy::invalidate):
+            * GPUProcess/media/RemoteMediaPlayerProxy.h:
+            * GPUProcess/media/RemoteMediaPlayerProxy.messages.in:
+            * GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm:
+            (WebKit::RemoteMediaPlayerProxy::nativeImageForCurrentTime):
+            (WebKit::RemoteMediaPlayerProxy::pixelBufferForCurrentTimeIfChanged):
+            (WebKit::RemoteMediaPlayerProxy::pixelBufferForCurrentTime): Deleted.
+            * WebProcess/GPU/media/MediaPlayerPrivateRemote.h:
+            * WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm:
+            (WebKit::MediaPlayerPrivateRemote::pixelBufferForCurrentTime):
+
+2021-10-25  Null  <null@apple.com>
+
</ins><span class="cx">         Cherry-pick r283975. rdar://problem/84630618
</span><span class="cx"> 
</span><span class="cx">     Error the encoder in case we cannot create a RemoteVideoSample
</span></span></pre></div>
<a id="branchessafari612branchSourceWebKitGPUProcessmediaRemoteMediaPlayerProxycpp"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp (284833 => 284834)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp     2021-10-25 21:51:06 UTC (rev 284833)
+++ branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp        2021-10-25 21:51:10 UTC (rev 284834)
</span><span class="lines">@@ -104,6 +104,9 @@
</span><span class="cx">         m_sandboxExtension = nullptr;
</span><span class="cx">     }
</span><span class="cx">     m_renderingResourcesRequest = { };
</span><ins>+#if USE(AVFOUNDATION)
+    m_pixelBufferForCurrentTime = nullptr;
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RemoteMediaPlayerProxy::getConfiguration(RemoteMediaPlayerConfiguration& configuration)
</span></span></pre></div>
<a id="branchessafari612branchSourceWebKitGPUProcessmediaRemoteMediaPlayerProxyh"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h (284833 => 284834)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h       2021-10-25 21:51:06 UTC (rev 284833)
+++ branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h  2021-10-25 21:51:10 UTC (rev 284834)
</span><span class="lines">@@ -311,7 +311,7 @@
</span><span class="cx">     void nativeImageForCurrentTime(CompletionHandler<void(std::optional<WTF::MachSendRight>&&)>&&);
</span><span class="cx"> #endif
</span><span class="cx"> #if USE(AVFOUNDATION)
</span><del>-    void pixelBufferForCurrentTime(CompletionHandler<void(RetainPtr<CVPixelBufferRef>&&)>&&);
</del><ins>+    void pixelBufferForCurrentTimeIfChanged(CompletionHandler<void(std::optional<RetainPtr<CVPixelBufferRef>>&&)>&&);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if !RELEASE_LOG_DISABLED
</span><span class="lines">@@ -366,7 +366,9 @@
</span><span class="cx">     ScopedRenderingResourcesRequest m_renderingResourcesRequest;
</span><span class="cx"> 
</span><span class="cx">     bool m_observingTimeChanges { false };
</span><del>-
</del><ins>+#if USE(AVFOUNDATION)
+    RetainPtr<CVPixelBufferRef> m_pixelBufferForCurrentTime;
+#endif
</ins><span class="cx"> #if !RELEASE_LOG_DISABLED
</span><span class="cx">     const Logger& m_logger;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="branchessafari612branchSourceWebKitGPUProcessmediaRemoteMediaPlayerProxymessagesin"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in (284833 => 284834)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in     2021-10-25 21:51:06 UTC (rev 284833)
+++ branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in        2021-10-25 21:51:10 UTC (rev 284834)
</span><span class="lines">@@ -126,7 +126,7 @@
</span><span class="cx">     NativeImageForCurrentTime() -> (std::optional<MachSendRight> sendRight) Synchronous
</span><span class="cx"> #endif
</span><span class="cx"> #if USE(AVFOUNDATION)
</span><del>-    PixelBufferForCurrentTime() -> (RetainPtr<CVPixelBufferRef> pixelBuffer) Synchronous
</del><ins>+    PixelBufferForCurrentTimeIfChanged() -> (std::optional<RetainPtr<CVPixelBufferRef>> pixelBuffer) Synchronous
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     PlayAtHostTime(MonotonicTime time)
</span></span></pre></div>
<a id="branchessafari612branchSourceWebKitGPUProcessmediacocoaRemoteMediaPlayerProxyCocoamm"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm (284833 => 284834)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm   2021-10-25 21:51:06 UTC (rev 284833)
+++ branches/safari-612-branch/Source/WebKit/GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm      2021-10-25 21:51:10 UTC (rev 284834)
</span><span class="lines">@@ -111,13 +111,20 @@
</span><span class="cx">     completionHandler(surface->createSendRight());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RemoteMediaPlayerProxy::pixelBufferForCurrentTime(CompletionHandler<void(RetainPtr<CVPixelBufferRef>&&)>&& completionHandler)
</del><ins>+#if USE(AVFOUNDATION)
+void RemoteMediaPlayerProxy::pixelBufferForCurrentTimeIfChanged(CompletionHandler<void(std::optional<RetainPtr<CVPixelBufferRef>>&&)>&& completionHandler)
</ins><span class="cx"> {
</span><del>-    RetainPtr<CVPixelBufferRef> result;
</del><ins>+    std::optional<RetainPtr<CVPixelBufferRef>> result;
+    RetainPtr<CVPixelBufferRef> pixelBuffer;
</ins><span class="cx">     if (m_player)
</span><del>-        result = m_player->pixelBufferForCurrentTime();
</del><ins>+        pixelBuffer = m_player->pixelBufferForCurrentTime();
+    if (m_pixelBufferForCurrentTime != pixelBuffer) {
+        result = pixelBuffer;
+        m_pixelBufferForCurrentTime = WTFMove(pixelBuffer);
+    }
</ins><span class="cx">     completionHandler(WTFMove(result));
</span><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchessafari612branchSourceWebKitWebProcessGPUmediaMediaPlayerPrivateRemoteh"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h (284833 => 284834)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h 2021-10-25 21:51:06 UTC (rev 284833)
+++ branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h    2021-10-25 21:51:10 UTC (rev 284834)
</span><span class="lines">@@ -445,6 +445,9 @@
</span><span class="cx">     bool m_waitingForKey { false };
</span><span class="cx">     bool m_timeIsProgressing { false };
</span><span class="cx">     bool m_renderingCanBeAccelerated { false };
</span><ins>+#if USE(AVFOUNDATION)
+    RetainPtr<CVPixelBufferRef> m_pixelBufferForCurrentTime;
+#endif
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="branchessafari612branchSourceWebKitWebProcessGPUmediacocoaMediaPlayerPrivateRemoteCocoamm"></a>
<div class="modfile"><h4>Modified: branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm (284833 => 284834)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm     2021-10-25 21:51:06 UTC (rev 284833)
+++ branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm        2021-10-25 21:51:10 UTC (rev 284834)
</span><span class="lines">@@ -66,14 +66,17 @@
</span><span class="cx">     return NativeImage::create(WTFMove(platformImage));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if USE(AVFOUNDATION)
</ins><span class="cx"> RetainPtr<CVPixelBufferRef> MediaPlayerPrivateRemote::pixelBufferForCurrentTime()
</span><span class="cx"> {
</span><del>-
-    RetainPtr<CVPixelBufferRef> result;
-    if (!connection().sendSync(Messages::RemoteMediaPlayerProxy::PixelBufferForCurrentTime(), Messages::RemoteMediaPlayerProxy::PixelBufferForCurrentTime::Reply(result), m_id))
</del><ins>+    std::optional<RetainPtr<CVPixelBufferRef>> result;
+    if (!connection().sendSync(Messages::RemoteMediaPlayerProxy::PixelBufferForCurrentTimeIfChanged(), Messages::RemoteMediaPlayerProxy::PixelBufferForCurrentTimeIfChanged::Reply(result), m_id))
</ins><span class="cx">         return nullptr;
</span><del>-    return result;
</del><ins>+    if (result)
+        m_pixelBufferForCurrentTime = WTFMove(*result);
+    return m_pixelBufferForCurrentTime;
</ins><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>