<!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>[181643] 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/181643">181643</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-03-17 05:22:06 -0700 (Tue, 17 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Wrong transfer annotations used in GObject DOM bindings
https://bugs.webkit.org/show_bug.cgi?id=142780

Reviewed by Gustavo Noronha Silva.

We are using transfer none for all methods returning a GObject DOM
Object. That's not true. Only objects derived from Node are
automatically released by the DOM object cache and can be transfer
none. All other objects are added to the cache only to avoid
creating the same wrapper twice for the same core object, but
caller should release the returned reference.

* bindings/gobject/WebKitDOMCustomUnstable.h:
* bindings/scripts/CodeGeneratorGObject.pm:
(GetTransferTypeForReturnType):
(GenerateFunction):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsgobjectWebKitDOMCustomUnstableh">trunk/Source/WebCore/bindings/gobject/WebKitDOMCustomUnstable.h</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorGObjectpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorGObject.pm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (181642 => 181643)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-03-17 12:18:18 UTC (rev 181642)
+++ trunk/Source/WebCore/ChangeLog        2015-03-17 12:22:06 UTC (rev 181643)
</span><span class="lines">@@ -1,5 +1,24 @@
</span><span class="cx"> 2015-03-17  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><ins>+        [GTK] Wrong transfer annotations used in GObject DOM bindings
+        https://bugs.webkit.org/show_bug.cgi?id=142780
+
+        Reviewed by Gustavo Noronha Silva.
+
+        We are using transfer none for all methods returning a GObject DOM
+        Object. That's not true. Only objects derived from Node are
+        automatically released by the DOM object cache and can be transfer
+        none. All other objects are added to the cache only to avoid
+        creating the same wrapper twice for the same core object, but
+        caller should release the returned reference.
+
+        * bindings/gobject/WebKitDOMCustomUnstable.h:
+        * bindings/scripts/CodeGeneratorGObject.pm:
+        (GetTransferTypeForReturnType):
+        (GenerateFunction):
+
+2015-03-17  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
</ins><span class="cx">         [GTK] WebKitDOM objects leaking
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=118788
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsgobjectWebKitDOMCustomUnstableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/gobject/WebKitDOMCustomUnstable.h (181642 => 181643)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/gobject/WebKitDOMCustomUnstable.h        2015-03-17 12:18:18 UTC (rev 181642)
+++ trunk/Source/WebCore/bindings/gobject/WebKitDOMCustomUnstable.h        2015-03-17 12:22:06 UTC (rev 181643)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx">  * webkit_dom_dom_window_get_webkit_namespace:
</span><span class="cx">  * @self: A #WebKitDOMDOMWindow
</span><span class="cx">  *
</span><del>- * Returns: (transfer none): A #WebKitDOMWebKitNamespace
</del><ins>+ * Returns: (transfer full): A #WebKitDOMWebKitNamespace
</ins><span class="cx">  *
</span><span class="cx">  * Stability: Unstable
</span><span class="cx">  * Since: 2.8
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx">  * @self: A #WebKitDOMUserMessageHandlersNamespace
</span><span class="cx">  * @name: a #gchar
</span><span class="cx">  *
</span><del>- * Returns: (transfer none): A #WebKitDOMUserMessageHandler
</del><ins>+ * Returns: (transfer full): A #WebKitDOMUserMessageHandler
</ins><span class="cx">  *
</span><span class="cx">  * Stability: Unstable
</span><span class="cx">  * Since: 2.8
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorGObjectpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorGObject.pm (181642 => 181643)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorGObject.pm        2015-03-17 12:18:18 UTC (rev 181642)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorGObject.pm        2015-03-17 12:22:06 UTC (rev 181643)
</span><span class="lines">@@ -49,6 +49,29 @@
</span><span class="cx">                     &quot;NodeIterator&quot; =&gt; 1, &quot;TreeWalker&quot; =&gt; 1, &quot;AbstractView&quot; =&gt; 1, &quot;Blob&quot; =&gt; 1, &quot;DOMTokenList&quot; =&gt; 1,
</span><span class="cx">                     &quot;HTMLCollection&quot; =&gt; 1, &quot;TextTrackCue&quot; =&gt; 1);
</span><span class="cx"> 
</span><ins>+# Only objects derived from Node are released by the DOM object cache and can be
+# transfer none. Ideally we could use GetBaseClass with the parent type to check
+# whether it's Node, but unfortunately we only have the name of the return type,
+# and we can't know its parent base class. Since there are fewer classes in the
+# API that are not derived from Node, we will list them here to decide the
+# transfer type.
+my %transferFullTypeHash = (&quot;AudioTrack&quot; =&gt; 1, &quot;AudioTrackList&quot; =&gt; 1, &quot;BarProp&quot; =&gt; 1, &quot;BatteryManager&quot; =&gt; 1,
+    &quot;CSSRuleList&quot; =&gt; 1, &quot;CSSStyleDeclaration&quot; =&gt; 1, &quot;CSSStyleSheet&quot; =&gt; 1,
+    &quot;DOMApplicationCache&quot; =&gt; 1, &quot;DOMMimeType&quot; =&gt; 1, &quot;DOMMimeTypeArray&quot; =&gt; 1, &quot;DOMNamedFlowCollection&quot; =&gt; 1,
+    &quot;DOMPlugin&quot; =&gt; 1, &quot;DOMPluginArray&quot; =&gt; 1, &quot;DOMSecurityPolicy&quot; =&gt; 1,
+    &quot;DOMSelection&quot; =&gt; 1, &quot;DOMSettableTokenList&quot; =&gt; 1, &quot;DOMStringList&quot; =&gt; 1,
+    &quot;DOMWindow&quot; =&gt; 1, &quot;DOMWindowCSS&quot; =&gt; 1, &quot;EventTarget&quot; =&gt; 1,
+    &quot;File&quot; =&gt; 1, &quot;FileList&quot; =&gt; 1, &quot;Gamepad&quot; =&gt; 1, &quot;GamepadList&quot; =&gt; 1,
+    &quot;Geolocation&quot; =&gt; 1, &quot;HTMLOptionsCollection&quot; =&gt; 1, &quot;History&quot; =&gt; 1,
+    &quot;KeyboardEvent&quot; =&gt; 1, &quot;MediaError&quot; =&gt; 1, &quot;MediaController&quot; =&gt; 1,
+    &quot;MouseEvent&quot; =&gt; 1, &quot;MediaQueryList&quot; =&gt; 1, &quot;Navigator&quot; =&gt; 1, &quot;NodeFilter&quot; =&gt; 1,
+    &quot;Performance&quot; =&gt; 1, &quot;PerformanceEntry&quot; =&gt; 1, &quot;PerformanceEntryList&quot; =&gt; 1, &quot;PerformanceNavigation&quot; =&gt; 1, &quot;PerformanceTiming&quot; =&gt; 1,
+    &quot;Range&quot; =&gt; 1, &quot;Screen&quot; =&gt; 1, &quot;SpeechSynthesis&quot; =&gt; 1, &quot;SpeechSynthesisVoice&quot; =&gt; 1,
+    &quot;Storage&quot; =&gt; 1, &quot;StyleMedia&quot; =&gt; 1, &quot;TextTrack&quot; =&gt; 1, &quot;TextTrackCueList&quot; =&gt; 1,
+    &quot;TimeRanges&quot; =&gt; 1, &quot;Touch&quot; =&gt; 1, &quot;UIEvent&quot; =&gt; 1, &quot;UserMessageHandler&quot; =&gt; 1, &quot;UserMessageHandlersNamespace&quot; =&gt; 1,
+    &quot;ValidityState&quot; =&gt; 1, &quot;VideoTrack&quot; =&gt; 1, &quot;WebKitNamedFlow&quot; =&gt; 1,
+    &quot;WebKitNamespace&quot; =&gt; 1, &quot;WebKitPoint&quot; =&gt; 1, &quot;WheelEvent&quot; =&gt; 1, &quot;XPathNSResolver&quot; =&gt; 1);
+
</ins><span class="cx"> # List of function parameters that are allowed to be NULL
</span><span class="cx"> my $canBeNullParams = {
</span><span class="cx">     'webkit_dom_document_create_attribute_ns' =&gt; ['namespaceURI'],
</span><span class="lines">@@ -945,6 +968,20 @@
</span><span class="cx">     return &quot;${name}_type&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+sub GetTransferTypeForReturnType {
+    my $returnType = shift;
+
+    # Node is always transfer none.
+    return &quot;none&quot; if $returnType eq &quot;Node&quot;;
+
+    # Any base class but Node is transfer full.
+    return &quot;full&quot; if IsBaseType($returnType);
+
+    # Any other class not derived from Node is transfer full.
+    return &quot;full&quot; if $transferFullTypeHash{$returnType};
+    return &quot;none&quot;;
+}
+
</ins><span class="cx"> sub GenerateFunction {
</span><span class="cx">     my ($object, $interfaceName, $function, $prefix, $parentNode) = @_;
</span><span class="cx"> 
</span><span class="lines">@@ -1042,7 +1079,8 @@
</span><span class="cx">     my $hasReturnTag = 0;
</span><span class="cx">     $returnTypeName =~ s/\*$//;
</span><span class="cx">     if ($returnValueIsGDOMType) {
</span><del>-        push(@functionHeader, &quot; * Returns: (transfer none): A #${returnTypeName}&quot;);
</del><ins>+        my $transferType = GetTransferTypeForReturnType($functionSigType);
+        push(@functionHeader, &quot; * Returns: (transfer $transferType): A #${returnTypeName}&quot;);
</ins><span class="cx">         $hasReturnTag = 1;
</span><span class="cx">     } elsif ($returnType ne &quot;void&quot;) {
</span><span class="cx">         push(@functionHeader, &quot; * Returns: A #${returnTypeName}&quot;);
</span></span></pre>
</div>
</div>

</body>
</html>