<!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>[166052] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/166052">166052</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2014-03-21 01:04:59 -0700 (Fri, 21 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Use GMainLoopSource for idle and timeout sources in WebCore
https://bugs.webkit.org/show_bug.cgi?id=130078

Reviewed by Philippe Normand.

* platform/audio/gstreamer/AudioFileReaderGStreamer.cpp:
* platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp:
* platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h:
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h:
* platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp:
* platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h:
* platform/graphics/gstreamer/VideoSinkGStreamer.cpp:
* platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp:
* platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
* platform/gtk/GtkDragAndDropHelper.cpp:
* platform/gtk/SharedTimerGtk.cpp:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformaudiogstreamerAudioFileReaderGStreamercpp">trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerInbandTextTrackPrivateGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerInbandTextTrackPrivateGStreamerh">trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerh">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBasecpp">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBaseh">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerTrackPrivateBaseGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerTrackPrivateBaseGStreamerh">trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerVideoSinkGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerWebKitMediaSourceGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerWebKitWebSourceGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgtkGtkDragAndDropHelpercpp">trunk/Source/WebCore/platform/gtk/GtkDragAndDropHelper.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgtkSharedTimerGtkcpp">trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/ChangeLog        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2014-03-20  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] Use GMainLoopSource for idle and timeout sources in WebCore
+        https://bugs.webkit.org/show_bug.cgi?id=130078
+
+        Reviewed by Philippe Normand.
+
+        * platform/audio/gstreamer/AudioFileReaderGStreamer.cpp:
+        * platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp:
+        * platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h:
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h:
+        * platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp:
+        * platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h:
+        * platform/graphics/gstreamer/VideoSinkGStreamer.cpp:
+        * platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp:
+        * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
+        * platform/gtk/GtkDragAndDropHelper.cpp:
+        * platform/gtk/SharedTimerGtk.cpp:
+
</ins><span class="cx"> 2014-03-21  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         HTMLFrameOwnerElement should obey the SubframeLoadingDisabler when creating subframes
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudiogstreamerAudioFileReaderGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -27,14 +27,14 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;gio/gio.h&gt;
</span><span class="cx"> #include &lt;gst/app/gstappsink.h&gt;
</span><ins>+#include &lt;gst/audio/audio.h&gt;
</ins><span class="cx"> #include &lt;gst/gst.h&gt;
</span><span class="cx"> #include &lt;gst/pbutils/pbutils.h&gt;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><ins>+#include &lt;wtf/gobject/GMainLoopSource.h&gt;
</ins><span class="cx"> #include &lt;wtf/gobject/GRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/gobject/GUniquePtr.h&gt;
</span><span class="cx"> 
</span><del>-#include &lt;gst/audio/audio.h&gt;
-
</del><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class AudioFileReader {
</span><span class="lines">@@ -108,13 +108,6 @@
</span><span class="cx">     reader-&gt;plugDeinterleave(pad);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gboolean enteredMainLoopCallback(gpointer userData)
-{
-    AudioFileReader* reader = reinterpret_cast&lt;AudioFileReader*&gt;(userData);
-    reader-&gt;decodeAudioForBusCreation();
-    return FALSE;
-}
-
</del><span class="cx"> AudioFileReader::AudioFileReader(const char* filePath)
</span><span class="cx">     : m_data(0)
</span><span class="cx">     , m_dataSize(0)
</span><span class="lines">@@ -341,9 +334,8 @@
</span><span class="cx">     m_loop = adoptGRef(g_main_loop_new(context.get(), FALSE));
</span><span class="cx"> 
</span><span class="cx">     // Start the pipeline processing just after the loop is started.
</span><del>-    GRefPtr&lt;GSource&gt; timeoutSource = adoptGRef(g_timeout_source_new(0));
-    g_source_attach(timeoutSource.get(), context.get());
-    g_source_set_callback(timeoutSource.get(), reinterpret_cast&lt;GSourceFunc&gt;(enteredMainLoopCallback), this, 0);
</del><ins>+    GMainLoopSource source;
+    source.schedule(&quot;[WebKit] AudioFileReader::decodeAudioForBusCreation&quot;, std::bind(&amp;AudioFileReader::decodeAudioForBusCreation, this), G_PRIORITY_DEFAULT, nullptr, context.get());
</ins><span class="cx"> 
</span><span class="cx">     g_main_loop_run(m_loop.get());
</span><span class="cx">     g_main_context_pop_thread_default(context.get());
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerInbandTextTrackPrivateGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -52,22 +52,8 @@
</span><span class="cx">     return GST_PAD_PROBE_OK;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean textTrackPrivateSampleTimeoutCallback(InbandTextTrackPrivateGStreamer* track)
-{
-    track-&gt;notifyTrackOfSample();
-    return FALSE;
-}
-
-static gboolean textTrackPrivateStreamTimeoutCallback(InbandTextTrackPrivateGStreamer* track)
-{
-    track-&gt;notifyTrackOfStreamChanged();
-    return FALSE;
-}
-
</del><span class="cx"> InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(gint index, GRefPtr&lt;GstPad&gt; pad)
</span><span class="cx">     : InbandTextTrackPrivate(WebVTT), TrackPrivateBaseGStreamer(this, index, pad)
</span><del>-    , m_sampleTimerHandler(0)
-    , m_streamTimerHandler(0)
</del><span class="cx"> {
</span><span class="cx">     m_eventProbe = gst_pad_add_probe(m_pad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
</span><span class="cx">         reinterpret_cast&lt;GstPadProbeCallback&gt;(textTrackPrivateEventCallback), this, 0);
</span><span class="lines">@@ -82,36 +68,28 @@
</span><span class="cx"> 
</span><span class="cx">     gst_pad_remove_probe(m_pad.get(), m_eventProbe);
</span><span class="cx"> 
</span><del>-    if (m_streamTimerHandler)
-        g_source_remove(m_streamTimerHandler);
</del><ins>+    m_streamTimerHandler.cancel();
</ins><span class="cx"> 
</span><span class="cx">     TrackPrivateBaseGStreamer::disconnect();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::handleSample(GRefPtr&lt;GstSample&gt; sample)
</span><span class="cx"> {
</span><del>-    if (m_sampleTimerHandler)
-        g_source_remove(m_sampleTimerHandler);
</del><ins>+    m_sampleTimerHandler.cancel();
</ins><span class="cx">     {
</span><span class="cx">         MutexLocker lock(m_sampleMutex);
</span><span class="cx">         m_pendingSamples.append(sample);
</span><span class="cx">     }
</span><del>-    m_sampleTimerHandler = g_timeout_add(0,
-        reinterpret_cast&lt;GSourceFunc&gt;(textTrackPrivateSampleTimeoutCallback), this);
</del><ins>+    m_sampleTimerHandler.schedule(&quot;[WebKit] InbandTextTrackPrivateGStreamer::notifyTrackOfSample&quot;, std::bind(&amp;InbandTextTrackPrivateGStreamer::notifyTrackOfSample, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::streamChanged()
</span><span class="cx"> {
</span><del>-    if (m_streamTimerHandler)
-        g_source_remove(m_streamTimerHandler);
-    m_streamTimerHandler = g_timeout_add(0,
-        reinterpret_cast&lt;GSourceFunc&gt;(textTrackPrivateStreamTimeoutCallback), this);
</del><ins>+    m_streamTimerHandler.schedule(&quot;[WebKit] InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged&quot;, std::bind(&amp;InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::notifyTrackOfSample()
</span><span class="cx"> {
</span><del>-    m_sampleTimerHandler = 0;
-
</del><span class="cx">     Vector&lt;GRefPtr&lt;GstSample&gt; &gt; samples;
</span><span class="cx">     {
</span><span class="cx">         MutexLocker lock(m_sampleMutex);
</span><span class="lines">@@ -142,8 +120,6 @@
</span><span class="cx"> 
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged()
</span><span class="cx"> {
</span><del>-    m_streamTimerHandler = 0;
-
</del><span class="cx">     GRefPtr&lt;GstEvent&gt; event = adoptGRef(gst_pad_get_sticky_event(m_pad.get(),
</span><span class="cx">         GST_EVENT_STREAM_START, 0));
</span><span class="cx">     if (!event)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerInbandTextTrackPrivateGStreamerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;GRefPtrGStreamer.h&quot;
</span><span class="cx"> #include &quot;InbandTextTrackPrivate.h&quot;
</span><span class="cx"> #include &quot;TrackPrivateBaseGStreamer.h&quot;
</span><ins>+#include &lt;wtf/gobject/GMainLoopSource.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -61,8 +62,8 @@
</span><span class="cx"> private:
</span><span class="cx">     InbandTextTrackPrivateGStreamer(gint index, GRefPtr&lt;GstPad&gt;);
</span><span class="cx"> 
</span><del>-    guint m_sampleTimerHandler;
-    guint m_streamTimerHandler;
</del><ins>+    GMainLoopSource m_sampleTimerHandler;
+    GMainLoopSource m_streamTimerHandler;
</ins><span class="cx">     gulong m_eventProbe;
</span><span class="cx">     Vector&lt;GRefPtr&lt;GstSample&gt; &gt; m_pendingSamples;
</span><span class="cx">     String m_streamId;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx"> 
</span><span class="cx"> // Max interval in seconds to stay in the READY state on manual
</span><span class="cx"> // state change requests.
</span><del>-static const guint gReadyStateTimerInterval = 60;
</del><ins>+static const unsigned gReadyStateTimerInterval = 60;
</ins><span class="cx"> 
</span><span class="cx"> GST_DEBUG_CATEGORY_EXTERN(webkit_media_player_debug);
</span><span class="cx"> #define GST_CAT_DEFAULT webkit_media_player_debug
</span><span class="lines">@@ -92,46 +92,18 @@
</span><span class="cx">     player-&gt;audioChanged();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean mediaPlayerPrivateAudioChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
-{
-    // This is the callback of the timeout source created in ::audioChanged.
-    player-&gt;notifyPlayerOfAudio();
-    return FALSE;
-}
-
</del><span class="cx"> static void setAudioStreamPropertiesCallback(GstChildProxy*, GObject* object, gchar*,
</span><span class="cx">     MediaPlayerPrivateGStreamer* player)
</span><span class="cx"> {
</span><span class="cx">     player-&gt;setAudioStreamProperties(object);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean mediaPlayerPrivateVideoChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
-{
-    // This is the callback of the timeout source created in ::videoChanged.
-    player-&gt;notifyPlayerOfVideo();
-    return FALSE;
-}
-
-static gboolean mediaPlayerPrivateVideoCapsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
-{
-    // This is the callback of the timeout source created in ::videoCapsChanged.
-    player-&gt;notifyPlayerOfVideoCaps();
-    return FALSE;
-}
-
</del><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx"> static void mediaPlayerPrivateTextChangedCallback(GObject*, MediaPlayerPrivateGStreamer* player)
</span><span class="cx"> {
</span><span class="cx">     player-&gt;textChanged();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean mediaPlayerPrivateTextChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
-{
-    // This is the callback of the timeout source created in ::textChanged.
-    player-&gt;notifyPlayerOfText();
-    return FALSE;
-}
-
</del><span class="cx"> static GstFlowReturn mediaPlayerPrivateNewTextSampleCallback(GObject*, MediaPlayerPrivateGStreamer* player)
</span><span class="cx"> {
</span><span class="cx">     player-&gt;newTextSample();
</span><span class="lines">@@ -139,14 +111,6 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-static gboolean mediaPlayerPrivateReadyStateTimeoutCallback(MediaPlayerPrivateGStreamer* player)
-{
-    // This is the callback of the timeout source created in ::changePipelineState.
-    // Reset pipeline if we are sitting on READY state when timeout is reached
-    player-&gt;changePipelineState(GST_STATE_NULL);
-    return FALSE;
-}
-
</del><span class="cx"> static void mediaPlayerPrivatePluginInstallerResultFunction(GstInstallPluginsReturn result, gpointer userData)
</span><span class="cx"> {
</span><span class="cx">     MediaPlayerPrivateGStreamer* player = reinterpret_cast&lt;MediaPlayerPrivateGStreamer*&gt;(userData);
</span><span class="lines">@@ -249,11 +213,6 @@
</span><span class="cx">     , m_volumeAndMuteInitialized(false)
</span><span class="cx">     , m_hasVideo(false)
</span><span class="cx">     , m_hasAudio(false)
</span><del>-    , m_audioTimerHandler(0)
-    , m_textTimerHandler(0)
-    , m_videoTimerHandler(0)
-    , m_videoCapsTimerHandler(0)
-    , m_readyTimerHandler(0)
</del><span class="cx">     , m_totalBytes(-1)
</span><span class="cx">     , m_preservesPitch(false)
</span><span class="cx">     , m_requestedState(GST_STATE_VOID_PENDING)
</span><span class="lines">@@ -285,8 +244,7 @@
</span><span class="cx">         g_signal_handlers_disconnect_by_func(G_OBJECT(m_autoAudioSink.get()),
</span><span class="cx">             reinterpret_cast&lt;gpointer&gt;(setAudioStreamPropertiesCallback), this);
</span><span class="cx"> 
</span><del>-    if (m_readyTimerHandler)
-        g_source_remove(m_readyTimerHandler);
</del><ins>+    m_readyTimerHandler.cancel();
</ins><span class="cx"> 
</span><span class="cx">     if (m_playBin) {
</span><span class="cx">         GRefPtr&lt;GstBus&gt; bus = adoptGRef(gst_pipeline_get_bus(GST_PIPELINE(m_playBin.get())));
</span><span class="lines">@@ -308,18 +266,6 @@
</span><span class="cx"> 
</span><span class="cx">     GRefPtr&lt;GstPad&gt; videoSinkPad = adoptGRef(gst_element_get_static_pad(m_webkitVideoSink.get(), &quot;sink&quot;));
</span><span class="cx">     g_signal_handlers_disconnect_by_func(videoSinkPad.get(), reinterpret_cast&lt;gpointer&gt;(mediaPlayerPrivateVideoSinkCapsChangedCallback), this);
</span><del>-
-    if (m_videoTimerHandler)
-        g_source_remove(m_videoTimerHandler);
-
-    if (m_audioTimerHandler)
-        g_source_remove(m_audioTimerHandler);
-
-    if (m_textTimerHandler)
-        g_source_remove(m_textTimerHandler);
-
-    if (m_videoCapsTimerHandler)
-        g_source_remove(m_videoCapsTimerHandler);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamer::load(const String&amp; url)
</span><span class="lines">@@ -443,12 +389,11 @@
</span><span class="cx">     // if we stay for too long on READY.
</span><span class="cx">     // Also lets remove the timer if we request a state change for any state other than READY.
</span><span class="cx">     // See also https://bugs.webkit.org/show_bug.cgi?id=117354
</span><del>-    if (newState == GST_STATE_READY &amp;&amp; !m_readyTimerHandler) {
-        m_readyTimerHandler = g_timeout_add_seconds(gReadyStateTimerInterval, reinterpret_cast&lt;GSourceFunc&gt;(mediaPlayerPrivateReadyStateTimeoutCallback), this);
-        g_source_set_name_by_id(m_readyTimerHandler, &quot;[WebKit] mediaPlayerPrivateReadyStateTimeoutCallback&quot;);
-    } else if (newState != GST_STATE_READY &amp;&amp; m_readyTimerHandler) {
-        g_source_remove(m_readyTimerHandler);
-        m_readyTimerHandler = 0;
</del><ins>+    if (newState == GST_STATE_READY &amp;&amp; !m_readyTimerHandler.isScheduled()) {
+        m_readyTimerHandler.scheduleAfterDelay(&quot;[WebKit] mediaPlayerPrivateReadyStateTimeoutCallback&quot;, [this] { changePipelineState(GST_STATE_NULL); },
+            std::chrono::seconds(gReadyStateTimerInterval));
+    } else if (newState != GST_STATE_READY &amp;&amp; m_readyTimerHandler.isScheduled()) {
+        m_readyTimerHandler.cancel();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="lines">@@ -669,24 +614,16 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamer::videoChanged()
</span><span class="cx"> {
</span><del>-    if (m_videoTimerHandler)
-        g_source_remove(m_videoTimerHandler);
-    m_videoTimerHandler = g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast&lt;GSourceFunc&gt;(mediaPlayerPrivateVideoChangeTimeoutCallback), this, 0);
-    g_source_set_name_by_id(m_videoTimerHandler, &quot;[WebKit] mediaPlayerPrivateVideoChangeTimeoutCallback&quot;);
</del><ins>+    m_videoTimerHandler.schedule(&quot;[WebKit] MediaPlayerPrivateGStreamer::videoChanged&quot;, std::bind(&amp;MediaPlayerPrivateGStreamer::notifyPlayerOfVideo, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamer::videoCapsChanged()
</span><span class="cx"> {
</span><del>-    if (m_videoCapsTimerHandler)
-        g_source_remove(m_videoCapsTimerHandler);
-    m_videoCapsTimerHandler = g_timeout_add(0, reinterpret_cast&lt;GSourceFunc&gt;(mediaPlayerPrivateVideoCapsChangeTimeoutCallback), this);
-    g_source_set_name_by_id(m_videoCapsTimerHandler, &quot;[WebKit] mediaPlayerPrivateVideoCapsChangeTimeoutCallback&quot;);
</del><ins>+    m_videoCapsTimerHandler.schedule(&quot;[WebKit] MediaPlayerPrivateGStreamer::videoCapsChanged&quot;, std::bind(&amp;MediaPlayerPrivateGStreamer::notifyPlayerOfVideoCaps, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfVideo()
</span><span class="cx"> {
</span><del>-    m_videoTimerHandler = 0;
-
</del><span class="cx">     gint numTracks = 0;
</span><span class="cx">     if (m_playBin)
</span><span class="cx">         g_object_get(m_playBin.get(), &quot;n-video&quot;, &amp;numTracks, NULL);
</span><span class="lines">@@ -724,23 +661,17 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfVideoCaps()
</span><span class="cx"> {
</span><del>-    m_videoCapsTimerHandler = 0;
</del><span class="cx">     m_videoSize = IntSize();
</span><span class="cx">     m_player-&gt;mediaPlayerClient()-&gt;mediaPlayerEngineUpdated(m_player);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamer::audioChanged()
</span><span class="cx"> {
</span><del>-    if (m_audioTimerHandler)
-        g_source_remove(m_audioTimerHandler);
-    m_audioTimerHandler = g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast&lt;GSourceFunc&gt;(mediaPlayerPrivateAudioChangeTimeoutCallback), this, 0);
-    g_source_set_name_by_id(m_audioTimerHandler, &quot;[WebKit] mediaPlayerPrivateAudioChangeTimeoutCallback&quot;);
</del><ins>+    m_audioTimerHandler.schedule(&quot;[WebKit] MediaPlayerPrivateGStreamer::audioChanged&quot;, std::bind(&amp;MediaPlayerPrivateGStreamer::notifyPlayerOfAudio, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfAudio()
</span><span class="cx"> {
</span><del>-    m_audioTimerHandler = 0;
-
</del><span class="cx">     gint numTracks = 0;
</span><span class="cx">     if (m_playBin)
</span><span class="cx">         g_object_get(m_playBin.get(), &quot;n-audio&quot;, &amp;numTracks, NULL);
</span><span class="lines">@@ -779,16 +710,11 @@
</span><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx"> void MediaPlayerPrivateGStreamer::textChanged()
</span><span class="cx"> {
</span><del>-    if (m_textTimerHandler)
-        g_source_remove(m_textTimerHandler);
-    m_textTimerHandler = g_timeout_add(0, reinterpret_cast&lt;GSourceFunc&gt;(mediaPlayerPrivateTextChangeTimeoutCallback), this);
-    g_source_set_name_by_id(m_textTimerHandler, &quot;[WebKit] mediaPlayerPrivateTextChangeTimeoutCallback&quot;);
</del><ins>+    m_textTimerHandler.schedule(&quot;[WebKit] MediaPlayerPrivateGStreamer::textChanged&quot;, std::bind(&amp;MediaPlayerPrivateGStreamer::notifyPlayerOfText, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfText()
</span><span class="cx"> {
</span><del>-    m_textTimerHandler = 0;
-
</del><span class="cx">     gint numTracks = 0;
</span><span class="cx">     if (m_playBin)
</span><span class="cx">         g_object_get(m_playBin.get(), &quot;n-text&quot;, &amp;numTracks, NULL);
</span><span class="lines">@@ -1640,10 +1566,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Loading failed, remove ready timer.
</span><del>-    if (m_readyTimerHandler) {
-        g_source_remove(m_readyTimerHandler);
-        m_readyTimerHandler = 0;
-    }
</del><ins>+    m_readyTimerHandler.cancel();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static HashSet&lt;String&gt; mimeTypeCache()
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &lt;gst/gst.h&gt;
</span><span class="cx"> #include &lt;gst/pbutils/install-plugins.h&gt;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><ins>+#include &lt;wtf/gobject/GMainLoopSource.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(MEDIA_SOURCE)
</span><span class="cx"> #include &quot;MediaSourceGStreamer.h&quot;
</span><span class="lines">@@ -189,11 +190,11 @@
</span><span class="cx">     bool m_volumeAndMuteInitialized;
</span><span class="cx">     bool m_hasVideo;
</span><span class="cx">     bool m_hasAudio;
</span><del>-    guint m_audioTimerHandler;
-    guint m_textTimerHandler;
-    guint m_videoTimerHandler;
-    guint m_videoCapsTimerHandler;
-    guint m_readyTimerHandler;
</del><ins>+    GMainLoopSource m_audioTimerHandler;
+    GMainLoopSource m_textTimerHandler;
+    GMainLoopSource m_videoTimerHandler;
+    GMainLoopSource m_videoCapsTimerHandler;
+    GMainLoopSource m_readyTimerHandler;
</ins><span class="cx">     mutable long m_totalBytes;
</span><span class="cx">     URL m_url;
</span><span class="cx">     bool m_preservesPitch;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -72,26 +72,12 @@
</span><span class="cx">     player-&gt;volumeChanged();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean mediaPlayerPrivateVolumeChangeTimeoutCallback(MediaPlayerPrivateGStreamerBase* player)
-{
-    // This is the callback of the timeout source created in ::volumeChanged.
-    player-&gt;notifyPlayerOfVolumeChange();
-    return FALSE;
-}
-
</del><span class="cx"> static void mediaPlayerPrivateMuteChangedCallback(GObject*, GParamSpec*, MediaPlayerPrivateGStreamerBase* player)
</span><span class="cx"> {
</span><span class="cx">     // This is called when m_volumeElement receives the notify::mute signal.
</span><span class="cx">     player-&gt;muteChanged();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean mediaPlayerPrivateMuteChangeTimeoutCallback(MediaPlayerPrivateGStreamerBase* player)
-{
-    // This is the callback of the timeout source created in ::muteChanged.
-    player-&gt;notifyPlayerOfMute();
-    return FALSE;
-}
-
</del><span class="cx"> static void mediaPlayerPrivateRepaintCallback(WebKitVideoSink*, GstBuffer *buffer, MediaPlayerPrivateGStreamerBase* playerPrivate)
</span><span class="cx"> {
</span><span class="cx">     playerPrivate-&gt;triggerRepaint(buffer);
</span><span class="lines">@@ -103,8 +89,6 @@
</span><span class="cx">     , m_readyState(MediaPlayer::HaveNothing)
</span><span class="cx">     , m_networkState(MediaPlayer::Empty)
</span><span class="cx">     , m_buffer(0)
</span><del>-    , m_volumeTimerHandler(0)
-    , m_muteTimerHandler(0)
</del><span class="cx">     , m_repaintHandler(0)
</span><span class="cx">     , m_volumeSignalHandler(0)
</span><span class="cx">     , m_muteSignalHandler(0)
</span><span class="lines">@@ -134,12 +118,6 @@
</span><span class="cx"> 
</span><span class="cx">     m_player = 0;
</span><span class="cx"> 
</span><del>-    if (m_muteTimerHandler)
-        g_source_remove(m_muteTimerHandler);
-
-    if (m_volumeTimerHandler)
-        g_source_remove(m_volumeTimerHandler);
-
</del><span class="cx">     if (m_volumeSignalHandler) {
</span><span class="cx">         g_signal_handler_disconnect(m_volumeElement.get(), m_volumeSignalHandler);
</span><span class="cx">         m_volumeSignalHandler = 0;
</span><span class="lines">@@ -231,8 +209,6 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::notifyPlayerOfVolumeChange()
</span><span class="cx"> {
</span><del>-    m_volumeTimerHandler = 0;
-
</del><span class="cx">     if (!m_player || !m_volumeElement)
</span><span class="cx">         return;
</span><span class="cx">     double volume;
</span><span class="lines">@@ -246,10 +222,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::volumeChanged()
</span><span class="cx"> {
</span><del>-    if (m_volumeTimerHandler)
-        g_source_remove(m_volumeTimerHandler);
-    m_volumeTimerHandler = g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast&lt;GSourceFunc&gt;(mediaPlayerPrivateVolumeChangeTimeoutCallback), this, 0);
-    g_source_set_name_by_id(m_volumeTimerHandler, &quot;[WebKit] mediaPlayerPrivateVolumeChangeTimeoutCallback&quot;);
</del><ins>+    m_volumeTimerHandler.schedule(&quot;[WebKit] MediaPlayerPrivateGStreamerBase::volumeChanged&quot;, std::bind(&amp;MediaPlayerPrivateGStreamerBase::notifyPlayerOfVolumeChange, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> MediaPlayer::NetworkState MediaPlayerPrivateGStreamerBase::networkState() const
</span><span class="lines">@@ -287,8 +260,6 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::notifyPlayerOfMute()
</span><span class="cx"> {
</span><del>-    m_muteTimerHandler = 0;
-
</del><span class="cx">     if (!m_player || !m_volumeElement)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -299,13 +270,9 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::muteChanged()
</span><span class="cx"> {
</span><del>-    if (m_muteTimerHandler)
-        g_source_remove(m_muteTimerHandler);
-    m_muteTimerHandler = g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast&lt;GSourceFunc&gt;(mediaPlayerPrivateMuteChangeTimeoutCallback), this, 0);
-    g_source_set_name_by_id(m_muteTimerHandler, &quot;[WebKit] mediaPlayerPrivateMuteChangeTimeoutCallback&quot;);
</del><ins>+    m_muteTimerHandler.schedule(&quot;[WebKit] MediaPlayerPrivateGStreamerBase::muteChanged&quot;, std::bind(&amp;MediaPlayerPrivateGStreamerBase::notifyPlayerOfMute, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> #if USE(TEXTURE_MAPPER_GL) &amp;&amp; !USE(COORDINATED_GRAPHICS)
</span><span class="cx"> PassRefPtr&lt;BitmapTexture&gt; MediaPlayerPrivateGStreamerBase::updateTexture(TextureMapper* textureMapper)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &lt;glib.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><ins>+#include &lt;wtf/gobject/GMainLoopSource.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #if USE(TEXTURE_MAPPER_GL) &amp;&amp; !USE(COORDINATED_GRAPHICS)
</span><span class="cx"> #include &quot;TextureMapperPlatformLayer.h&quot;
</span><span class="lines">@@ -119,8 +120,8 @@
</span><span class="cx">     IntSize m_size;
</span><span class="cx">     GMutex* m_bufferMutex;
</span><span class="cx">     GstBuffer* m_buffer;
</span><del>-    unsigned long m_volumeTimerHandler;
-    unsigned long m_muteTimerHandler;
</del><ins>+    GMainLoopSource m_volumeTimerHandler;
+    GMainLoopSource m_muteTimerHandler;
</ins><span class="cx">     unsigned long m_repaintHandler;
</span><span class="cx">     unsigned long m_volumeSignalHandler;
</span><span class="cx">     unsigned long m_muteSignalHandler;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerTrackPrivateBaseGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -53,24 +53,10 @@
</span><span class="cx">     track-&gt;tagsChanged();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean trackPrivateActiveChangeTimeoutCallback(TrackPrivateBaseGStreamer* track)
-{
-    track-&gt;notifyTrackOfActiveChanged();
-    return FALSE;
-}
-
-static gboolean trackPrivateTagsChangeTimeoutCallback(TrackPrivateBaseGStreamer* track)
-{
-    track-&gt;notifyTrackOfTagsChanged();
-    return FALSE;
-}
-
</del><span class="cx"> TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(TrackPrivateBase* owner, gint index, GRefPtr&lt;GstPad&gt; pad)
</span><span class="cx">     : m_index(index)
</span><span class="cx">     , m_pad(pad)
</span><span class="cx">     , m_owner(owner)
</span><del>-    , m_activeTimerHandler(0)
-    , m_tagTimerHandler(0)
</del><span class="cx"> {
</span><span class="cx">     ASSERT(m_pad);
</span><span class="cx"> 
</span><span class="lines">@@ -97,31 +83,21 @@
</span><span class="cx">     g_signal_handlers_disconnect_by_func(m_pad.get(),
</span><span class="cx">         reinterpret_cast&lt;gpointer&gt;(trackPrivateTagsChangedCallback), this);
</span><span class="cx"> 
</span><del>-    if (m_activeTimerHandler)
-        g_source_remove(m_activeTimerHandler);
-    m_activeTimerHandler = 0;
</del><ins>+    m_activeTimerHandler.cancel();
+    m_tagTimerHandler.cancel();
</ins><span class="cx"> 
</span><del>-    if (m_tagTimerHandler)
-        g_source_remove(m_tagTimerHandler);
-    m_tagTimerHandler = 0;
-
</del><span class="cx">     m_pad.clear();
</span><span class="cx">     m_tags.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TrackPrivateBaseGStreamer::activeChanged()
</span><span class="cx"> {
</span><del>-    if (m_activeTimerHandler)
-        g_source_remove(m_activeTimerHandler);
-    m_activeTimerHandler = g_timeout_add(0,
-        reinterpret_cast&lt;GSourceFunc&gt;(trackPrivateActiveChangeTimeoutCallback), this);
-    g_source_set_name_by_id(m_activeTimerHandler, &quot;[WebKit] trackPrivateActiveChangeTimeoutCallback&quot;);
</del><ins>+    m_activeTimerHandler.schedule(&quot;[WebKit] TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged&quot;, std::bind(&amp;TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TrackPrivateBaseGStreamer::tagsChanged()
</span><span class="cx"> {
</span><del>-    if (m_tagTimerHandler)
-        g_source_remove(m_tagTimerHandler);
</del><ins>+    m_tagTimerHandler.cancel();
</ins><span class="cx"> 
</span><span class="cx">     GRefPtr&lt;GstTagList&gt; tags;
</span><span class="cx">     g_object_get(m_pad.get(), &quot;tags&quot;, &amp;tags.outPtr(), NULL);
</span><span class="lines">@@ -130,14 +106,11 @@
</span><span class="cx">         m_tags.swap(tags);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_tagTimerHandler = g_timeout_add(0,
-        reinterpret_cast&lt;GSourceFunc&gt;(trackPrivateTagsChangeTimeoutCallback), this);
-    g_source_set_name_by_id(m_tagTimerHandler, &quot;[WebKit] trackPrivateTagsChangeTimeoutCallback&quot;);
</del><ins>+    m_tagTimerHandler.schedule(&quot;[WebKit] TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged&quot;, std::bind(&amp;TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged, this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged()
</span><span class="cx"> {
</span><del>-    m_activeTimerHandler = 0;
</del><span class="cx">     if (!m_pad)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -175,7 +148,6 @@
</span><span class="cx"> 
</span><span class="cx"> void TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged()
</span><span class="cx"> {
</span><del>-    m_tagTimerHandler = 0;
</del><span class="cx">     if (!m_pad)
</span><span class="cx">         return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerTrackPrivateBaseGStreamerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;GRefPtrGStreamer.h&quot;
</span><span class="cx"> #include &lt;wtf/ThreadingPrimitives.h&gt;
</span><ins>+#include &lt;wtf/gobject/GMainLoopSource.h&gt;
</ins><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -67,8 +68,8 @@
</span><span class="cx">     bool getTag(GstTagList* tags, const gchar* tagName, String&amp; value);
</span><span class="cx"> 
</span><span class="cx">     TrackPrivateBase* m_owner;
</span><del>-    guint m_activeTimerHandler;
-    guint m_tagTimerHandler;
</del><ins>+    GMainLoopSource m_activeTimerHandler;
+    GMainLoopSource m_tagTimerHandler;
</ins><span class="cx"> 
</span><span class="cx">     Mutex m_tagMutex;
</span><span class="cx">     GRefPtr&lt;GstTagList&gt; m_tags;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerVideoSinkGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &lt;gst/gst.h&gt;
</span><span class="cx"> #include &lt;gst/video/gstvideometa.h&gt;
</span><span class="cx"> #include &lt;wtf/OwnPtr.h&gt;
</span><ins>+#include &lt;wtf/gobject/GMainLoopSource.h&gt;
</ins><span class="cx"> #include &lt;wtf/gobject/GMutexLocker.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="lines">@@ -74,7 +75,7 @@
</span><span class="cx"> 
</span><span class="cx"> struct _WebKitVideoSinkPrivate {
</span><span class="cx">     GstBuffer* buffer;
</span><del>-    guint timeoutId;
</del><ins>+    GMainLoopSource timeoutSource;
</ins><span class="cx">     GMutex* bufferMutex;
</span><span class="cx">     GCond* dataCondition;
</span><span class="cx"> 
</span><span class="lines">@@ -100,6 +101,7 @@
</span><span class="cx"> static void webkit_video_sink_init(WebKitVideoSink* sink)
</span><span class="cx"> {
</span><span class="cx">     sink-&gt;priv = G_TYPE_INSTANCE_GET_PRIVATE(sink, WEBKIT_TYPE_VIDEO_SINK, WebKitVideoSinkPrivate);
</span><ins>+    new (sink-&gt;priv) WebKitVideoSinkPrivate();
</ins><span class="cx"> #if GLIB_CHECK_VERSION(2, 31, 0)
</span><span class="cx">     sink-&gt;priv-&gt;dataCondition = new GCond;
</span><span class="cx">     g_cond_init(sink-&gt;priv-&gt;dataCondition);
</span><span class="lines">@@ -113,26 +115,22 @@
</span><span class="cx">     gst_video_info_init(&amp;sink-&gt;priv-&gt;info);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webkitVideoSinkTimeoutCallback(gpointer data)
</del><ins>+static void webkitVideoSinkTimeoutCallback(WebKitVideoSink* sink)
</ins><span class="cx"> {
</span><del>-    WebKitVideoSink* sink = reinterpret_cast&lt;WebKitVideoSink*&gt;(data);
</del><span class="cx">     WebKitVideoSinkPrivate* priv = sink-&gt;priv;
</span><span class="cx"> 
</span><span class="cx">     GMutexLocker lock(priv-&gt;bufferMutex);
</span><span class="cx">     GstBuffer* buffer = priv-&gt;buffer;
</span><span class="cx">     priv-&gt;buffer = 0;
</span><del>-    priv-&gt;timeoutId = 0;
</del><span class="cx"> 
</span><span class="cx">     if (!buffer || priv-&gt;unlocked || UNLIKELY(!GST_IS_BUFFER(buffer))) {
</span><span class="cx">         g_cond_signal(priv-&gt;dataCondition);
</span><del>-        return FALSE;
</del><ins>+        return;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     g_signal_emit(sink, webkitVideoSinkSignals[REPAINT_REQUESTED], 0, buffer);
</span><span class="cx">     gst_buffer_unref(buffer);
</span><span class="cx">     g_cond_signal(priv-&gt;dataCondition);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static GstFlowReturn webkitVideoSinkRender(GstBaseSink* baseSink, GstBuffer* buffer)
</span><span class="lines">@@ -216,9 +214,9 @@
</span><span class="cx">     // This should likely use a lower priority, but glib currently starves
</span><span class="cx">     // lower priority sources.
</span><span class="cx">     // See: https://bugzilla.gnome.org/show_bug.cgi?id=610830.
</span><del>-    priv-&gt;timeoutId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, webkitVideoSinkTimeoutCallback,
-                                          gst_object_ref(sink), reinterpret_cast&lt;GDestroyNotify&gt;(gst_object_unref));
-    g_source_set_name_by_id(priv-&gt;timeoutId, &quot;[WebKit] webkitVideoSinkTimeoutCallback&quot;);
</del><ins>+    gst_object_ref(sink);
+    priv-&gt;timeoutSource.schedule(&quot;[WebKit] webkitVideoSinkTimeoutCallback&quot;, std::bind(webkitVideoSinkTimeoutCallback, sink), G_PRIORITY_DEFAULT,
+        [sink] { gst_object_unref(sink); });
</ins><span class="cx"> 
</span><span class="cx">     g_cond_wait(priv-&gt;dataCondition, priv-&gt;bufferMutex);
</span><span class="cx">     return GST_FLOW_OK;
</span><span class="lines">@@ -252,6 +250,12 @@
</span><span class="cx">     G_OBJECT_CLASS(parent_class)-&gt;dispose(object);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void webkitVideoSinkFinalize(GObject* object)
+{
+    WEBKIT_VIDEO_SINK(object)-&gt;priv-&gt;~WebKitVideoSinkPrivate();
+    G_OBJECT_CLASS(parent_class)-&gt;finalize(object);
+}
+
</ins><span class="cx"> static void webkitVideoSinkGetProperty(GObject* object, guint propertyId, GValue* value, GParamSpec* parameterSpec)
</span><span class="cx"> {
</span><span class="cx">     WebKitVideoSink* sink = WEBKIT_VIDEO_SINK(object);
</span><span class="lines">@@ -376,6 +380,7 @@
</span><span class="cx">     g_type_class_add_private(klass, sizeof(WebKitVideoSinkPrivate));
</span><span class="cx"> 
</span><span class="cx">     gobjectClass-&gt;dispose = webkitVideoSinkDispose;
</span><ins>+    gobjectClass-&gt;finalize = webkitVideoSinkFinalize;
</ins><span class="cx">     gobjectClass-&gt;get_property = webkitVideoSinkGetProperty;
</span><span class="cx"> 
</span><span class="cx">     baseSinkClass-&gt;unlock = webkitVideoSinkUnlock;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerWebKitMediaSourceGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &lt;gst/app/gstappsrc.h&gt;
</span><span class="cx"> #include &lt;gst/gst.h&gt;
</span><span class="cx"> #include &lt;gst/pbutils/missing-plugins.h&gt;
</span><ins>+#include &lt;wtf/gobject/GMainLoopSource.h&gt;
</ins><span class="cx"> #include &lt;wtf/gobject/GUniquePtr.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -43,11 +44,11 @@
</span><span class="cx">     guint64 size;
</span><span class="cx">     gboolean paused;
</span><span class="cx"> 
</span><del>-    guint startId;
-    guint stopId;
-    guint needDataId;
-    guint enoughDataId;
-    guint seekId;
</del><ins>+    GMainLoopSource start;
+    GMainLoopSource stop;
+    GMainLoopSource needData;
+    GMainLoopSource enoughData;
+    GMainLoopSource seek;
</ins><span class="cx"> 
</span><span class="cx">     guint64 requestedOffset;
</span><span class="cx"> } Source;
</span><span class="lines">@@ -172,6 +173,7 @@
</span><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = WEBKIT_MEDIA_SRC_GET_PRIVATE(src);
</span><span class="cx">     src-&gt;priv = priv;
</span><ins>+    new (priv) WebKitMediaSrcPrivate();
</ins><span class="cx"> 
</span><span class="cx">     priv-&gt;sourceVideo.appsrc = gst_element_factory_make(&quot;appsrc&quot;, &quot;videoappsrc&quot;);
</span><span class="cx">     gst_app_src_set_callbacks(GST_APP_SRC(priv-&gt;sourceVideo.appsrc), &amp;appsrcCallbacksVideo, src, 0);
</span><span class="lines">@@ -188,6 +190,7 @@
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="cx">     g_free(priv-&gt;uri);
</span><ins>+    priv-&gt;~WebKitMediaSrcPrivate();
</ins><span class="cx"> 
</span><span class="cx">     GST_CALL_PARENT(G_OBJECT_CLASS, finalize, (object));
</span><span class="cx"> }
</span><span class="lines">@@ -223,36 +226,24 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // must be called on main thread and with object unlocked
</span><del>-static gboolean webKitMediaVideoSrcStop(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaVideoSrcStop(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx">     gboolean seeking;
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><span class="cx"> 
</span><del>-    seeking = priv-&gt;sourceVideo.seekId;
</del><ins>+    seeking = priv-&gt;sourceVideo.seek.isActive();
</ins><span class="cx"> 
</span><del>-    if (priv-&gt;sourceVideo.startId) {
-        g_source_remove(priv-&gt;sourceVideo.startId);
-        priv-&gt;sourceVideo.startId = 0;
-    }
</del><ins>+    priv-&gt;sourceVideo.start.cancel();
</ins><span class="cx"> 
</span><span class="cx">     priv-&gt;player = 0;
</span><span class="cx">     priv-&gt;playbin = 0;
</span><span class="cx"> 
</span><del>-    if (priv-&gt;sourceVideo.needDataId)
-        g_source_remove(priv-&gt;sourceVideo.needDataId);
-    priv-&gt;sourceVideo.needDataId = 0;
</del><ins>+    priv-&gt;sourceVideo.needData.cancel();
+    priv-&gt;sourceVideo.enoughData.cancel();
+    priv-&gt;sourceVideo.seek.cancel();
</ins><span class="cx"> 
</span><del>-    if (priv-&gt;sourceVideo.enoughDataId)
-        g_source_remove(priv-&gt;sourceVideo.enoughDataId);
-    priv-&gt;sourceVideo.enoughDataId = 0;
-
-    if (priv-&gt;sourceVideo.seekId)
-        g_source_remove(priv-&gt;sourceVideo.seekId);
-
-    priv-&gt;sourceVideo.seekId = 0;
-
</del><span class="cx">     priv-&gt;sourceVideo.paused = FALSE;
</span><span class="cx">     priv-&gt;sourceVideo.offset = 0;
</span><span class="cx">     priv-&gt;seekable = FALSE;
</span><span class="lines">@@ -260,8 +251,6 @@
</span><span class="cx">     priv-&gt;duration = 0;
</span><span class="cx">     priv-&gt;nbSource = 0;
</span><span class="cx"> 
</span><del>-    priv-&gt;sourceVideo.stopId = 0;
-
</del><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx"> 
</span><span class="cx">     if (priv-&gt;sourceVideo.appsrc) {
</span><span class="lines">@@ -271,41 +260,27 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Stopped request&quot;);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitMediaAudioSrcStop(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaAudioSrcStop(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx">     gboolean seeking;
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><span class="cx"> 
</span><del>-    seeking = priv-&gt;sourceAudio.seekId;
</del><ins>+    seeking = priv-&gt;sourceAudio.seek.isActive();
</ins><span class="cx"> 
</span><del>-    if (priv-&gt;sourceAudio.startId) {
-        g_source_remove(priv-&gt;sourceAudio.startId);
-        priv-&gt;sourceAudio.startId = 0;
-    }
</del><ins>+    priv-&gt;sourceAudio.start.cancel();
</ins><span class="cx"> 
</span><span class="cx">     priv-&gt;player = 0;
</span><span class="cx"> 
</span><span class="cx">     priv-&gt;playbin = 0;
</span><span class="cx"> 
</span><del>-    if (priv-&gt;sourceAudio.needDataId)
-        g_source_remove(priv-&gt;sourceAudio.needDataId);
-    priv-&gt;sourceAudio.needDataId = 0;
</del><ins>+    priv-&gt;sourceAudio.needData.cancel();
+    priv-&gt;sourceAudio.enoughData.cancel();
+    priv-&gt;sourceAudio.seek.cancel();
</ins><span class="cx"> 
</span><del>-    if (priv-&gt;sourceAudio.enoughDataId)
-        g_source_remove(priv-&gt;sourceAudio.enoughDataId);
-    priv-&gt;sourceAudio.enoughDataId = 0;
-
-    if (priv-&gt;sourceAudio.seekId)
-        g_source_remove(priv-&gt;sourceAudio.seekId);
-
-    priv-&gt;sourceAudio.seekId = 0;
-
</del><span class="cx">     priv-&gt;sourceAudio.paused = FALSE;
</span><span class="cx"> 
</span><span class="cx">     priv-&gt;sourceAudio.offset = 0;
</span><span class="lines">@@ -315,8 +290,6 @@
</span><span class="cx">     priv-&gt;duration = 0;
</span><span class="cx">     priv-&gt;nbSource = 0;
</span><span class="cx"> 
</span><del>-    priv-&gt;sourceAudio.stopId = 0;
-
</del><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx"> 
</span><span class="cx">     if (priv-&gt;sourceAudio.appsrc) {
</span><span class="lines">@@ -326,12 +299,10 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Stopped request&quot;);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // must be called on main thread and with object unlocked
</span><del>-static gboolean webKitMediaVideoSrcStart(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaVideoSrcStart(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="lines">@@ -340,19 +311,15 @@
</span><span class="cx">         GST_ERROR_OBJECT(src, &quot;No URI provided&quot;);
</span><span class="cx">         GST_OBJECT_UNLOCK(src);
</span><span class="cx">         webKitMediaVideoSrcStop(src);
</span><del>-        return FALSE;
</del><ins>+        return;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    priv-&gt;sourceVideo.startId = 0;
-
</del><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Started request&quot;);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // must be called on main thread and with object unlocked
</span><del>-static gboolean webKitMediaAudioSrcStart(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaAudioSrcStart(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="lines">@@ -361,15 +328,11 @@
</span><span class="cx">         GST_ERROR_OBJECT(src, &quot;No URI provided&quot;);
</span><span class="cx">         GST_OBJECT_UNLOCK(src);
</span><span class="cx">         webKitMediaAudioSrcStop(src);
</span><del>-        return FALSE;
</del><ins>+        return;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    priv-&gt;sourceAudio.startId = 0;
-
</del><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Started request&quot;);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static GstStateChangeReturn webKitMediaSrcChangeState(GstElement* element, GstStateChange transition)
</span><span class="lines">@@ -401,19 +364,29 @@
</span><span class="cx">     case GST_STATE_CHANGE_READY_TO_PAUSED:
</span><span class="cx">         GST_DEBUG_OBJECT(src, &quot;READY-&gt;PAUSED&quot;);
</span><span class="cx">         GST_OBJECT_LOCK(src);
</span><del>-        priv-&gt;sourceVideo.startId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaVideoSrcStart, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
-        g_source_set_name_by_id(priv-&gt;sourceVideo.startId, &quot;[WebKit] webKitMediaVideoSrcStart&quot;);
-        priv-&gt;sourceAudio.startId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaAudioSrcStart, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
-        g_source_set_name_by_id(priv-&gt;sourceAudio.startId, &quot;[WebKit] webKitMediaAudioSrcStart&quot;);
</del><ins>+
+        gst_object_ref(src);
+        priv-&gt;sourceVideo.start.schedule(&quot;[WebKit] webKitMediaVideoSrcStart&quot;, std::bind(webKitMediaVideoSrcStart, src), G_PRIORITY_DEFAULT,
+            [src] { gst_object_unref(src); });
+
+        gst_object_ref(src);
+        priv-&gt;sourceAudio.start.schedule(&quot;[WebKit] webKitMediaAudioSrcStart&quot;, std::bind(webKitMediaAudioSrcStart, src), G_PRIORITY_DEFAULT,
+            [src] { gst_object_unref(src); });
+
</ins><span class="cx">         GST_OBJECT_UNLOCK(src);
</span><span class="cx">         break;
</span><span class="cx">     case GST_STATE_CHANGE_PAUSED_TO_READY:
</span><span class="cx">         GST_DEBUG_OBJECT(src, &quot;PAUSED-&gt;READY&quot;);
</span><span class="cx">         GST_OBJECT_LOCK(src);
</span><del>-        priv-&gt;sourceVideo.stopId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaVideoSrcStop, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
-        g_source_set_name_by_id(priv-&gt;sourceVideo.stopId, &quot;[WebKit] webKitMediaVideoSrcStop&quot;);
-        priv-&gt;sourceAudio.stopId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaAudioSrcStop, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
-        g_source_set_name_by_id(priv-&gt;sourceAudio.stopId, &quot;[WebKit] webKitMediaAudioSrcStop&quot;);
</del><ins>+
+        gst_object_ref(src);
+        priv-&gt;sourceVideo.stop.schedule(&quot;[WebKit] webKitMediaVideoSrcStop&quot;, std::bind(webKitMediaVideoSrcStop, src), G_PRIORITY_DEFAULT,
+            [src] { gst_object_unref(src); });
+
+        gst_object_ref(src);
+        priv-&gt;sourceAudio.stop.schedule(&quot;[WebKit] webKitMediaAudioSrcStop&quot;, std::bind(webKitMediaAudioSrcStop, src), G_PRIORITY_DEFAULT,
+            [src] { gst_object_unref(src); });
+
</ins><span class="cx">         GST_OBJECT_UNLOCK(src);
</span><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="lines">@@ -519,40 +492,22 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // appsrc callbacks
</span><del>-static gboolean webKitMediaVideoSrcNeedDataMainCb(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaVideoSrcNeedDataMainCb(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><del>-    // already stopped
-    if (!priv-&gt;sourceVideo.needDataId) {
-        GST_OBJECT_UNLOCK(src);
-        return FALSE;
-    }
-
</del><span class="cx">     priv-&gt;sourceVideo.paused = FALSE;
</span><del>-    priv-&gt;sourceVideo.needDataId = 0;
</del><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitMediaAudioSrcNeedDataMainCb(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaAudioSrcNeedDataMainCb(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><del>-    // already stopped
-    if (!priv-&gt;sourceAudio.needDataId) {
-        GST_OBJECT_UNLOCK(src);
-        return FALSE;
-    }
-
</del><span class="cx">     priv-&gt;sourceAudio.paused = FALSE;
</span><del>-    priv-&gt;sourceAudio.needDataId = 0;
</del><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void webKitMediaVideoSrcNeedDataCb(GstAppSrc*, guint length, gpointer userData)
</span><span class="lines">@@ -563,13 +518,14 @@
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Need more data: %u&quot;, length);
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><del>-    if (priv-&gt;sourceVideo.needDataId || !priv-&gt;sourceVideo.paused) {
</del><ins>+    if (priv-&gt;sourceVideo.needData.isScheduled() || !priv-&gt;sourceVideo.paused) {
</ins><span class="cx">         GST_OBJECT_UNLOCK(src);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    priv-&gt;sourceVideo.needDataId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaVideoSrcNeedDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
-    g_source_set_name_by_id(priv-&gt;sourceVideo.needDataId, &quot;[WebKit] webKitMediaVideoSrcNeedDataMainCb&quot;);
</del><ins>+    gst_object_ref(src);
+    priv-&gt;sourceVideo.needData.schedule(&quot;[WebKit] webKitMediaVideoSrcNeedDataMainCb&quot;, std::bind(webKitMediaVideoSrcNeedDataMainCb, src), G_PRIORITY_DEFAULT,
+        [src] { gst_object_unref(src); });
</ins><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -581,50 +537,33 @@
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Need more data: %u&quot;, length);
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><del>-    if (priv-&gt;sourceAudio.needDataId || !priv-&gt;sourceAudio.paused) {
</del><ins>+    if (priv-&gt;sourceAudio.needData.isScheduled() || !priv-&gt;sourceAudio.paused) {
</ins><span class="cx">         GST_OBJECT_UNLOCK(src);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    priv-&gt;sourceAudio.needDataId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaAudioSrcNeedDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
-    g_source_set_name_by_id(priv-&gt;sourceAudio.needDataId, &quot;[WebKit] webKitMediaAudioSrcNeedDataMainCb&quot;);
</del><ins>+    gst_object_ref(src);
+    priv-&gt;sourceAudio.needData.schedule(&quot;[WebKit] webKitMediaAudioSrcNeedDataMainCb&quot;, std::bind(webKitMediaAudioSrcNeedDataMainCb, src), G_PRIORITY_DEFAULT,
+        [src] { gst_object_unref(src); });
</ins><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitMediaVideoSrcEnoughDataMainCb(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaVideoSrcEnoughDataMainCb(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><del>-    // already stopped
-    if (!priv-&gt;sourceVideo.enoughDataId) {
-        GST_OBJECT_UNLOCK(src);
-        return FALSE;
-    }
-
</del><span class="cx">     priv-&gt;sourceVideo.paused = TRUE;
</span><del>-    priv-&gt;sourceVideo.enoughDataId = 0;
</del><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitMediaAudioSrcEnoughDataMainCb(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaAudioSrcEnoughDataMainCb(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><del>-    // already stopped
-    if (!priv-&gt;sourceAudio.enoughDataId) {
-        GST_OBJECT_UNLOCK(src);
-        return FALSE;
-    }
-
</del><span class="cx">     priv-&gt;sourceAudio.paused = TRUE;
</span><del>-    priv-&gt;sourceAudio.enoughDataId = 0;
</del><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void webKitMediaVideoSrcEnoughDataCb(GstAppSrc*, gpointer userData)
</span><span class="lines">@@ -635,13 +574,15 @@
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Have enough data&quot;);
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><del>-    if (priv-&gt;sourceVideo.enoughDataId || priv-&gt;sourceVideo.paused) {
</del><ins>+    if (priv-&gt;sourceVideo.enoughData.isScheduled() || priv-&gt;sourceVideo.paused) {
</ins><span class="cx">         GST_OBJECT_UNLOCK(src);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    priv-&gt;sourceVideo.enoughDataId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaVideoSrcEnoughDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
-    g_source_set_name_by_id(priv-&gt;sourceVideo.enoughDataId, &quot;[WebKit] webKitMediaVideoSrcEnoughDataMainCb&quot;);
</del><ins>+    gst_object_ref(src);
+    priv-&gt;sourceVideo.enoughData.schedule(&quot;[WebKit] webKitMediaVideoSrcEnoughDataMainCb&quot;, std::bind(webKitMediaVideoSrcEnoughDataMainCb, src), G_PRIORITY_DEFAULT,
+        [src] { gst_object_unref(src); });
+
</ins><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -653,28 +594,27 @@
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Have enough data&quot;);
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><del>-    if (priv-&gt;sourceAudio.enoughDataId || priv-&gt;sourceAudio.paused) {
</del><ins>+    if (priv-&gt;sourceAudio.enoughData.isScheduled() || priv-&gt;sourceAudio.paused) {
</ins><span class="cx">         GST_OBJECT_UNLOCK(src);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    priv-&gt;sourceAudio.enoughDataId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaAudioSrcEnoughDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
-    g_source_set_name_by_id(priv-&gt;sourceAudio.enoughDataId, &quot;[WebKit] webKitMediaAudioSrcEnoughDataMainCb&quot;);
</del><ins>+    gst_object_ref(src);
+    priv-&gt;sourceAudio.enoughData.schedule(&quot;[WebKit] webKitMediaAudioSrcEnoughDataMainCb&quot;, std::bind(webKitMediaAudioSrcEnoughDataMainCb, src), G_PRIORITY_DEFAULT,
+        [src] { gst_object_unref(src); });
+
</ins><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitMediaVideoSrcSeekMainCb(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaVideoSrcSeekMainCb(WebKitMediaSrc*)
</ins><span class="cx"> {
</span><span class="cx">     notImplemented();
</span><del>-    src-&gt;priv-&gt;sourceVideo.seekId = 0;
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitMediaAudioSrcSeekMainCb(WebKitMediaSrc* src)
</del><ins>+
+static void webKitMediaAudioSrcSeekMainCb(WebKitMediaSrc*)
</ins><span class="cx"> {
</span><span class="cx">     notImplemented();
</span><del>-    src-&gt;priv-&gt;sourceAudio.seekId = 0;
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static gboolean webKitMediaVideoSrcSeekDataCb(GstAppSrc*, guint64 offset, gpointer userData)
</span><span class="lines">@@ -701,10 +641,10 @@
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Doing range-request seek&quot;);
</span><span class="cx">     priv-&gt;sourceVideo.requestedOffset = offset;
</span><span class="cx"> 
</span><del>-    if (priv-&gt;sourceVideo.seekId)
-        g_source_remove(priv-&gt;sourceVideo.seekId);
-    priv-&gt;sourceVideo.seekId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaVideoSrcSeekMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
-    g_source_set_name_by_id(priv-&gt;sourceVideo.seekId, &quot;[WebKit] webKitMediaVideoSrcSeekMainCb&quot;);
</del><ins>+    gst_object_ref(src);
+    priv-&gt;sourceVideo.seek.schedule(&quot;[WebKit] webKitMediaVideoSrcSeekMainCb&quot;, std::bind(webKitMediaVideoSrcSeekMainCb, src), G_PRIORITY_DEFAULT,
+        [src] { gst_object_unref(src); });
+
</ins><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx"> 
</span><span class="cx">     return TRUE;
</span><span class="lines">@@ -734,10 +674,10 @@
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Doing range-request seek&quot;);
</span><span class="cx">     priv-&gt;sourceAudio.requestedOffset = offset;
</span><span class="cx"> 
</span><del>-    if (priv-&gt;sourceAudio.seekId)
-        g_source_remove(priv-&gt;sourceAudio.seekId);
-    priv-&gt;sourceAudio.seekId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaAudioSrcSeekMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
-    g_source_set_name_by_id(priv-&gt;sourceAudio.seekId, &quot;[WebKit] webKitMediaAudioSrcSeekMainCb&quot;);
</del><ins>+    gst_object_ref(src);
+    priv-&gt;sourceAudio.seek.schedule(&quot;[WebKit] webKitMediaAudioSrcSeekMainCb&quot;, std::bind(webKitMediaAudioSrcSeekMainCb, src), G_PRIORITY_DEFAULT,
+        [src] { gst_object_unref(src); });
+
</ins><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx"> 
</span><span class="cx">     return TRUE;
</span><span class="lines">@@ -822,14 +762,14 @@
</span><span class="cx">     GST_DEBUG_OBJECT(m_src, &quot;Have EOS&quot;);
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(m_src);
</span><del>-    if (!priv-&gt;sourceVideo.seekId) {
</del><ins>+    if (!priv-&gt;sourceVideo.seek.isActive()) {
</ins><span class="cx">         GST_OBJECT_UNLOCK(m_src);
</span><span class="cx">         gst_app_src_end_of_stream(GST_APP_SRC(priv-&gt;sourceVideo.appsrc));
</span><span class="cx">     } else
</span><span class="cx">         GST_OBJECT_UNLOCK(m_src);
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(m_src);
</span><del>-    if (!priv-&gt;sourceAudio.seekId) {
</del><ins>+    if (!priv-&gt;sourceAudio.seek.isActive()) {
</ins><span class="cx">         GST_OBJECT_UNLOCK(m_src);
</span><span class="cx">         gst_app_src_end_of_stream(GST_APP_SRC(priv-&gt;sourceAudio.appsrc));
</span><span class="cx">     } else
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerWebKitWebSourceGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> #include &lt;gst/gst.h&gt;
</span><span class="cx"> #include &lt;gst/pbutils/missing-plugins.h&gt;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><ins>+#include &lt;wtf/gobject/GMainLoopSource.h&gt;
</ins><span class="cx"> #include &lt;wtf/gobject/GMutexLocker.h&gt;
</span><span class="cx"> #include &lt;wtf/gobject/GRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/gobject/GUniquePtr.h&gt;
</span><span class="lines">@@ -126,11 +127,11 @@
</span><span class="cx"> 
</span><span class="cx">     guint64 requestedOffset;
</span><span class="cx"> 
</span><del>-    guint startID;
-    guint stopID;
-    guint needDataID;
-    guint enoughDataID;
-    guint seekID;
</del><ins>+    GMainLoopSource startSource;
+    GMainLoopSource stopSource;
+    GMainLoopSource needDataSource;
+    GMainLoopSource enoughDataSource;
+    GMainLoopSource seekSource;
</ins><span class="cx"> 
</span><span class="cx">     GRefPtr&lt;GstBuffer&gt; buffer;
</span><span class="cx"> 
</span><span class="lines">@@ -253,6 +254,7 @@
</span><span class="cx">     WebKitWebSrcPrivate* priv = WEBKIT_WEB_SRC_GET_PRIVATE(src);
</span><span class="cx"> 
</span><span class="cx">     src-&gt;priv = priv;
</span><ins>+    new (priv) WebKitWebSrcPrivate();
</ins><span class="cx"> 
</span><span class="cx">     priv-&gt;appsrc = GST_APP_SRC(gst_element_factory_make(&quot;appsrc&quot;, 0));
</span><span class="cx">     if (!priv-&gt;appsrc) {
</span><span class="lines">@@ -314,6 +316,7 @@
</span><span class="cx">     WebKitWebSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="cx">     g_free(priv-&gt;uri);
</span><ins>+    priv-&gt;~WebKitWebSrcPrivate();
</ins><span class="cx"> 
</span><span class="cx">     GST_CALL_PARENT(G_OBJECT_CLASS, finalize, (object));
</span><span class="cx"> }
</span><span class="lines">@@ -364,24 +367,13 @@
</span><span class="cx"> {
</span><span class="cx">     WebKitWebSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><del>-    if (priv-&gt;startID)
-        g_source_remove(priv-&gt;startID);
-    priv-&gt;startID = 0;
-
-    if (priv-&gt;needDataID)
-        g_source_remove(priv-&gt;needDataID);
-    priv-&gt;needDataID = 0;
-
-    if (priv-&gt;enoughDataID)
-        g_source_remove(priv-&gt;enoughDataID);
-    priv-&gt;enoughDataID = 0;
-
-    if (priv-&gt;seekID)
-        g_source_remove(priv-&gt;seekID);
-    priv-&gt;seekID = 0;
</del><ins>+    priv-&gt;startSource.cancel();
+    priv-&gt;needDataSource.cancel();
+    priv-&gt;enoughDataSource.cancel();
+    priv-&gt;seekSource.cancel();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitWebSrcStop(WebKitWebSrc* src)
</del><ins>+static void webKitWebSrcStop(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitWebSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="lines">@@ -389,10 +381,9 @@
</span><span class="cx"> 
</span><span class="cx">     GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><span class="cx"> 
</span><del>-    bool seeking = priv-&gt;seekID;
</del><ins>+    bool seeking = priv-&gt;seekSource.isActive();
</ins><span class="cx"> 
</span><span class="cx">     removeTimeoutSources(src);
</span><del>-    priv-&gt;stopID = 0;
</del><span class="cx"> 
</span><span class="cx">     if (priv-&gt;client) {
</span><span class="cx">         delete priv-&gt;client;
</span><span class="lines">@@ -436,11 +427,9 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Stopped request&quot;);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitWebSrcStart(WebKitWebSrc* src)
</del><ins>+static void webKitWebSrcStart(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitWebSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="lines">@@ -448,13 +437,11 @@
</span><span class="cx"> 
</span><span class="cx">     GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><span class="cx"> 
</span><del>-    priv-&gt;startID = 0;
-
</del><span class="cx">     if (!priv-&gt;uri) {
</span><span class="cx">         GST_ERROR_OBJECT(src, &quot;No URI provided&quot;);
</span><span class="cx">         locker.unlock();
</span><span class="cx">         webKitWebSrcStop(src);
</span><del>-        return FALSE;
</del><ins>+        return;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!priv-&gt;client);
</span><span class="lines">@@ -510,10 +497,9 @@
</span><span class="cx">         }
</span><span class="cx">         locker.unlock();
</span><span class="cx">         webKitWebSrcStop(src);
</span><del>-        return FALSE;
</del><ins>+        return;
</ins><span class="cx">     }
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Started request&quot;);
</span><del>-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static GstStateChangeReturn webKitWebSrcChangeState(GstElement* element, GstStateChange transition)
</span><span class="lines">@@ -545,13 +531,17 @@
</span><span class="cx">     switch (transition) {
</span><span class="cx">     case GST_STATE_CHANGE_READY_TO_PAUSED:
</span><span class="cx">         GST_DEBUG_OBJECT(src, &quot;READY-&gt;PAUSED&quot;);
</span><del>-        priv-&gt;startID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcStart, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</del><ins>+        gst_object_ref(src);
+        priv-&gt;startSource.schedule(&quot;[WebKit] webKitWebSrcStart&quot;, std::bind(webKitWebSrcStart, src), G_PRIORITY_DEFAULT,
+            [src] { gst_object_unref(src); });
</ins><span class="cx">         break;
</span><span class="cx">     case GST_STATE_CHANGE_PAUSED_TO_READY:
</span><span class="cx">         GST_DEBUG_OBJECT(src, &quot;PAUSED-&gt;READY&quot;);
</span><span class="cx">         // cancel pending sources
</span><span class="cx">         removeTimeoutSources(src);
</span><del>-        priv-&gt;stopID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcStop, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</del><ins>+        gst_object_ref(src);
+        priv-&gt;stopSource.schedule(&quot;[WebKit] webKitWebSrcStop&quot;, std::bind(webKitWebSrcStop, src), G_PRIORITY_DEFAULT,
+            [src] { gst_object_unref(src); });
</ins><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         break;
</span><span class="lines">@@ -666,24 +656,18 @@
</span><span class="cx"> 
</span><span class="cx"> // appsrc callbacks
</span><span class="cx"> 
</span><del>-static gboolean webKitWebSrcNeedDataMainCb(WebKitWebSrc* src)
</del><ins>+static void webKitWebSrcNeedDataMainCb(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitWebSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><span class="cx">     GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><del>-    // already stopped
-    if (!priv-&gt;needDataID)
-        return FALSE;
-
</del><span class="cx">     priv-&gt;paused = FALSE;
</span><del>-    priv-&gt;needDataID = 0;
</del><span class="cx">     locker.unlock();
</span><span class="cx"> 
</span><span class="cx">     if (priv-&gt;client)
</span><span class="cx">         priv-&gt;client-&gt;setDefersLoading(false);
</span><del>-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void webKitWebSrcNeedDataCb(GstAppSrc*, guint length, gpointer userData)
</span><span class="lines">@@ -694,31 +678,26 @@
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Need more data: %u&quot;, length);
</span><span class="cx"> 
</span><span class="cx">     GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><del>-    if (priv-&gt;needDataID || !priv-&gt;paused) {
</del><ins>+    if (priv-&gt;needDataSource.isScheduled() || !priv-&gt;paused)
</ins><span class="cx">         return;
</span><del>-    }
</del><span class="cx"> 
</span><del>-    priv-&gt;needDataID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcNeedDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</del><ins>+    gst_object_ref(src);
+    priv-&gt;needDataSource.schedule(&quot;[WebKit] webKitWebSrcNeedDataMainCb&quot;, std::bind(webKitWebSrcNeedDataMainCb, src), G_PRIORITY_DEFAULT,
+        [src] { gst_object_unref(src); });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitWebSrcEnoughDataMainCb(WebKitWebSrc* src)
</del><ins>+static void webKitWebSrcEnoughDataMainCb(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitWebSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><span class="cx">     GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><del>-    // already stopped
-    if (!priv-&gt;enoughDataID)
-        return FALSE;
-
</del><span class="cx">     priv-&gt;paused = TRUE;
</span><del>-    priv-&gt;enoughDataID = 0;
</del><span class="cx">     locker.unlock();
</span><span class="cx"> 
</span><span class="cx">     if (priv-&gt;client)
</span><span class="cx">         priv-&gt;client-&gt;setDefersLoading(true);
</span><del>-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void webKitWebSrcEnoughDataCb(GstAppSrc*, gpointer userData)
</span><span class="lines">@@ -729,29 +708,20 @@
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Have enough data&quot;);
</span><span class="cx"> 
</span><span class="cx">     GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><del>-    if (priv-&gt;enoughDataID || priv-&gt;paused) {
</del><ins>+    if (priv-&gt;enoughDataSource.isScheduled() || priv-&gt;paused)
</ins><span class="cx">         return;
</span><del>-    }
</del><span class="cx"> 
</span><del>-    priv-&gt;enoughDataID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcEnoughDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</del><ins>+    gst_object_ref(src);
+    priv-&gt;enoughDataSource.schedule(&quot;[WebKit] webKitWebSrcEnoughDataMainCb&quot;, std::bind(webKitWebSrcEnoughDataMainCb, src), G_PRIORITY_DEFAULT,
+        [src] { gst_object_unref(src); });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitWebSrcSeekMainCb(WebKitWebSrc* src)
</del><ins>+static void webKitWebSrcSeekMainCb(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><del>-    WebKitWebSrcPrivate* priv = src-&gt;priv;
-
</del><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><del>-    GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
-    // already stopped
-    if (!priv-&gt;seekID)
-        return FALSE;
-    locker.unlock();
-
</del><span class="cx">     webKitWebSrcStop(src);
</span><span class="cx">     webKitWebSrcStart(src);
</span><del>-
-    return FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static gboolean webKitWebSrcSeekDataCb(GstAppSrc*, guint64 offset, gpointer userData)
</span><span class="lines">@@ -770,9 +740,9 @@
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Doing range-request seek&quot;);
</span><span class="cx">     priv-&gt;requestedOffset = offset;
</span><span class="cx"> 
</span><del>-    if (priv-&gt;seekID)
-        g_source_remove(priv-&gt;seekID);
-    priv-&gt;seekID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcSeekMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</del><ins>+    gst_object_ref(src);
+    priv-&gt;seekSource.schedule(&quot;[WebKit] webKitWebSrcSeekMainCb&quot;, std::bind(webKitWebSrcSeekMainCb, src), G_PRIORITY_DEFAULT,
+        [src] { gst_object_unref(src); });
</ins><span class="cx">     return TRUE;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -828,7 +798,7 @@
</span><span class="cx"> 
</span><span class="cx">     GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><span class="cx"> 
</span><del>-    if (priv-&gt;seekID) {
</del><ins>+    if (priv-&gt;seekSource.isActive()) {
</ins><span class="cx">         GST_DEBUG_OBJECT(src, &quot;Seek in progress, ignoring response&quot;);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -932,7 +902,7 @@
</span><span class="cx">     if (priv-&gt;buffer)
</span><span class="cx">         unmapGstBuffer(priv-&gt;buffer.get());
</span><span class="cx"> 
</span><del>-    if (priv-&gt;seekID) {
</del><ins>+    if (priv-&gt;seekSource.isActive()) {
</ins><span class="cx">         GST_DEBUG_OBJECT(src, &quot;Seek in progress, ignoring data&quot;);
</span><span class="cx">         priv-&gt;buffer.clear();
</span><span class="cx">         return;
</span><span class="lines">@@ -993,7 +963,7 @@
</span><span class="cx">     GST_DEBUG_OBJECT(src, &quot;Have EOS&quot;);
</span><span class="cx"> 
</span><span class="cx">     GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><del>-    if (!priv-&gt;seekID) {
</del><ins>+    if (!priv-&gt;seekSource.isActive()) {
</ins><span class="cx">         locker.unlock();
</span><span class="cx">         gst_app_src_end_of_stream(priv-&gt;appsrc);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkGtkDragAndDropHelpercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/gtk/GtkDragAndDropHelper.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/GtkDragAndDropHelper.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/gtk/GtkDragAndDropHelper.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> #include &quot;GtkVersioning.h&quot;
</span><span class="cx"> #include &quot;PasteboardHelper.h&quot;
</span><span class="cx"> #include &lt;gtk/gtk.h&gt;
</span><ins>+#include &lt;wtf/gobject/GMainLoopSource.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -68,18 +69,6 @@
</span><span class="cx">     PasteboardHelper::defaultPasteboardHelper()-&gt;fillSelectionData(selectionData, info, dataObject);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-struct HandleDragLaterData {
-    DroppingContext* context;
-    GtkDragAndDropHelper* glue;
-};
-
-static gboolean handleDragLeaveLaterCallback(HandleDragLaterData* data)
-{
-    data-&gt;glue-&gt;handleDragLeaveLater(data-&gt;context);
-    delete data;
-    return FALSE;
-}
-
</del><span class="cx"> void GtkDragAndDropHelper::handleDragLeaveLater(DroppingContext* context)
</span><span class="cx"> {
</span><span class="cx">     auto iterator = m_droppingContexts.find(context-&gt;gdkContext);
</span><span class="lines">@@ -109,11 +98,8 @@
</span><span class="cx">     // During a drop GTK+ will fire a drag-leave signal right before firing
</span><span class="cx">     // the drag-drop signal. We want the actions for drag-leave to happen after
</span><span class="cx">     // those for drag-drop, so schedule them to happen asynchronously here.
</span><del>-    HandleDragLaterData* data = new HandleDragLaterData;
-    data-&gt;context = context;
-    data-&gt;context-&gt;exitedCallback = exitedCallback;
-    data-&gt;glue = this;
-    g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast&lt;GSourceFunc&gt;(handleDragLeaveLaterCallback), data, 0);
</del><ins>+    context-&gt;exitedCallback = exitedCallback;
+    GMainLoopSource::createAndDeleteOnDestroy().schedule(&quot;[WebKit] handleDragLeaveLater&quot;, std::bind(&amp;GtkDragAndDropHelper::handleDragLeaveLater, this, context));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void queryNewDropContextData(DroppingContext* dropContext, GtkWidget* widget, guint time)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkSharedTimerGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -28,47 +28,32 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;SharedTimer.h&quot;
</span><span class="cx"> 
</span><del>-#include &lt;wtf/Assertions.h&gt;
-#include &lt;wtf/CurrentTime.h&gt;
</del><span class="cx"> #include &lt;gdk/gdk.h&gt;
</span><del>-#include &lt;glib.h&gt;
</del><ins>+#include &lt;wtf/gobject/GMainLoopSource.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-static guint sharedTimer;
</del><ins>+static GMainLoopSource gSharedTimer;
</ins><span class="cx"> static void (*sharedTimerFiredFunction)();
</span><span class="cx"> 
</span><span class="cx"> void setSharedTimerFiredFunction(void (*f)())
</span><span class="cx"> {
</span><span class="cx">     sharedTimerFiredFunction = f;
</span><ins>+    if (!sharedTimerFiredFunction)
+        gSharedTimer.cancel();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean sharedTimerTimeoutCallback(gpointer)
-{
-    if (sharedTimerFiredFunction)
-        sharedTimerFiredFunction();
-    return FALSE;
-}
-
</del><span class="cx"> void setSharedTimerFireInterval(double interval)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(sharedTimerFiredFunction);
</span><span class="cx"> 
</span><del>-    guint intervalInMS = static_cast&lt;guint&gt;(interval * 1000);
-
-    stopSharedTimer();
-    sharedTimer = g_timeout_add_full(GDK_PRIORITY_REDRAW, intervalInMS, sharedTimerTimeoutCallback, 0, 0);
-    g_source_set_name_by_id(sharedTimer, &quot;[WebKit] sharedTimerTimeoutCallback&quot;);
</del><ins>+    gSharedTimer.scheduleAfterDelay(&quot;[WebKit] sharedTimerTimeoutCallback&quot;, sharedTimerFiredFunction,
+        std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(std::chrono::duration&lt;double&gt;(interval)), GDK_PRIORITY_REDRAW);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void stopSharedTimer()
</span><span class="cx"> {
</span><del>-    if (sharedTimer == 0)
-        return;
-
-    gboolean removedSource = g_source_remove(sharedTimer);
-    ASSERT_UNUSED(removedSource, removedSource);
-    sharedTimer = 0;
</del><ins>+    gSharedTimer.cancel();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>