<!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" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { 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 #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#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>
<title>[19966] trunk</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/19966">19966</a></dd>
<dt>Author</dt> <dd>andersca</dd>
<dt>Date</dt> <dd>2007-03-05 11:31:02 -0800 (Mon, 05 Mar 2007)</dd>
</dl>

<h3>Log Message</h3>
<pre>LayoutTests:

        Reviewed by Adam, Darin.

        &lt;rdar://problem/5025212&gt;
        In Mail, a crash occurs at WebCore::Frame::tree() when clicking on embedded flash object

        * plugins/get-url-with-blank-target-expected.txt: Added.
        * plugins/get-url-with-blank-target.html: Added.

WebKit:

        Reviewed by Adam, Darin.
 
        &lt;rdar://problem/5025212&gt;
        In Mail, a crash occurs at WebCore::Frame::tree() when clicking on embedded flash object

        * Plugins/WebBaseNetscapePluginView.mm:
        (-[WebBaseNetscapePluginView loadPluginRequest:]):
        Handle the case where the web view returned from the delegate method is null. Also, send out an error notification
        in that case so we can catch it.

WebKitTools:

        Reviewed by Adam, Darin.

        &lt;rdar://problem/5025212&gt;
        In Mail, a crash occurs at WebCore::Frame::tree() when clicking on embedded flash object
        
        Add a &quot;getURLNotify&quot; method to the plugin object. This lets you pass a URL, a target and a callback function
        to be run when the URL has finished (or failed) loading.
        
        * DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.c:
        (pluginInvoke):
        (handleCallback):
        * DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.h:
        * DumpRenderTree/TestNetscapePlugIn.subproj/main.c:
        (NPP_URLNotify):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkWebKitChangeLog">trunk/WebKit/ChangeLog</a></li>
<li><a href="#trunkWebKitPluginsWebBaseNetscapePluginViewmm">trunk/WebKit/Plugins/WebBaseNetscapePluginView.mm</a></li>
<li><a href="#trunkWebKitToolsChangeLog">trunk/WebKitTools/ChangeLog</a></li>
<li><a href="#trunkWebKitToolsDumpRenderTreeTestNetscapePlugInsubprojPluginObjectc">trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.c</a></li>
<li><a href="#trunkWebKitToolsDumpRenderTreeTestNetscapePlugInsubprojPluginObjecth">trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.h</a></li>
<li><a href="#trunkWebKitToolsDumpRenderTreeTestNetscapePlugInsubprojmainc">trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/main.c</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestspluginsgeturlwithblanktargetexpectedtxt">trunk/LayoutTests/plugins/get-url-with-blank-target-expected.txt</a></li>
<li><a href="#trunkLayoutTestspluginsgeturlwithblanktargethtml">trunk/LayoutTests/plugins/get-url-with-blank-target.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (19965 => 19966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2007-03-05 18:37:17 UTC (rev 19965)
+++ trunk/LayoutTests/ChangeLog        2007-03-05 19:31:02 UTC (rev 19966)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2007-03-05  Anders Carlsson  &lt;acarlsson@apple.com&gt;
+
+        Reviewed by Adam, Darin.
+
+        &lt;rdar://problem/5025212&gt;
+        In Mail, a crash occurs at WebCore::Frame::tree() when clicking on embedded flash object
+
+        * plugins/get-url-with-blank-target-expected.txt: Added.
+        * plugins/get-url-with-blank-target.html: Added.
+
</ins><span class="cx"> 2007-03-05  Alexey Proskuryakov  &lt;ap@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Darin.
</span></span></pre></div>
<a id="trunkLayoutTestspluginsgeturlwithblanktargetexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/plugins/get-url-with-blank-target-expected.txt (0 => 19966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/plugins/get-url-with-blank-target-expected.txt                                (rev 0)
+++ trunk/LayoutTests/plugins/get-url-with-blank-target-expected.txt        2007-03-05 19:31:02 UTC (rev 19966)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+ This tests that we won't crash when a plugin tries to open an URL in a new window when the application does not create the window. If this test is successful, the text SUCCESS should be seen below.
+SUCCESS
+
</ins></span></pre></div>
<a id="trunkLayoutTestspluginsgeturlwithblanktargethtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/plugins/get-url-with-blank-target.html (0 => 19966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/plugins/get-url-with-blank-target.html                                (rev 0)
+++ trunk/LayoutTests/plugins/get-url-with-blank-target.html        2007-03-05 19:31:02 UTC (rev 19966)
</span><span class="lines">@@ -0,0 +1,29 @@
</span><ins>+&lt;html&gt;
+&lt;body&gt;
+&lt;embed name=&quot;plg&quot; type=&quot;application/x-webkit-test-netscape&quot;&gt;&lt;/embed&gt;
+&lt;script&gt;
+var NPERR_GENERIC_ERROR = 1;
+
+function callback(result) {
+    var d = document.getElementById('result');
+
+    if (result == NPERR_GENERIC_ERROR)
+        d.innerHTML = &quot;SUCCESS&quot;
+    else
+        d.innerHTML = &quot;FAILED - Expected error code 1 but got error code &quot; + result
+
+    layoutTestController.notifyDone();
+}
+
+if (window.layoutTestController) {
+    layoutTestController.dumpAsText();
+    layoutTestController.waitUntilDone();
+    
+    plg.getURLNotify(&quot;http://www.apple.com&quot;, &quot;_blank&quot;, &quot;callback&quot;);
+} else {
+    document.write(&quot;Cannot run interactively&quot;);
+}
+&lt;/script&gt;This tests that we won't crash when a plugin tries to open an URL in a new window when the application does not create the window. If this test is successful, the word SUCCESS should be seen below.
+&lt;div id=&quot;result&quot;&gt;FAILED&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/WebKit/ChangeLog (19965 => 19966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKit/ChangeLog        2007-03-05 18:37:17 UTC (rev 19965)
+++ trunk/WebKit/ChangeLog        2007-03-05 19:31:02 UTC (rev 19966)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2007-03-05  Anders Carlsson  &lt;acarlsson@apple.com&gt;
+
+        Reviewed by Adam, Darin.

+        &lt;rdar://problem/5025212&gt;
+        In Mail, a crash occurs at WebCore::Frame::tree() when clicking on embedded flash object
+
+        * Plugins/WebBaseNetscapePluginView.mm:
+        (-[WebBaseNetscapePluginView loadPluginRequest:]):
+        Handle the case where the web view returned from the delegate method is null. Also, send out an error notification
+        in that case so we can catch it.
+
</ins><span class="cx"> 2007-03-05  John Sullivan  &lt;sullivan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Darin and Kevin D
</span></span></pre></div>
<a id="trunkWebKitPluginsWebBaseNetscapePluginViewmm"></a>
<div class="modfile"><h4>Modified: trunk/WebKit/Plugins/WebBaseNetscapePluginView.mm (19965 => 19966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKit/Plugins/WebBaseNetscapePluginView.mm        2007-03-05 18:37:17 UTC (rev 19965)
+++ trunk/WebKit/Plugins/WebBaseNetscapePluginView.mm        2007-03-05 19:31:02 UTC (rev 19966)
</span><span class="lines">@@ -1978,6 +1978,16 @@
</span><span class="cx">             } else {
</span><span class="cx">                 newWebView = [[WebDefaultUIDelegate sharedUIDelegate] webView:currentWebView createWebViewWithRequest:nil];
</span><span class="cx">             }
</span><ins>+            
+            if (!newWebView) {
+                if ([pluginRequest sendNotification]) {
+                    [self willCallPlugInFunction];
+                    NPP_URLNotify(plugin, [[[pluginRequest request] URL] _web_URLCString], NPERR_GENERIC_ERROR, [pluginRequest notifyData]);
+                    [self didCallPlugInFunction];
+                }
+                return;
+            }
+            
</ins><span class="cx">             frame = [newWebView mainFrame];
</span><span class="cx">             core(frame)-&gt;tree()-&gt;setName(frameName);
</span><span class="cx">             [[newWebView _UIDelegateForwarder] webViewShow:newWebView];
</span></span></pre></div>
<a id="trunkWebKitToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/ChangeLog (19965 => 19966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/ChangeLog        2007-03-05 18:37:17 UTC (rev 19965)
+++ trunk/WebKitTools/ChangeLog        2007-03-05 19:31:02 UTC (rev 19966)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2007-03-05  Anders Carlsson  &lt;acarlsson@apple.com&gt;
+
+        Reviewed by Adam, Darin.
+
+        &lt;rdar://problem/5025212&gt;
+        In Mail, a crash occurs at WebCore::Frame::tree() when clicking on embedded flash object
+        
+        Add a &quot;getURLNotify&quot; method to the plugin object. This lets you pass a URL, a target and a callback function
+        to be run when the URL has finished (or failed) loading.
+        
+        * DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.c:
+        (pluginInvoke):
+        (handleCallback):
+        * DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.h:
+        * DumpRenderTree/TestNetscapePlugIn.subproj/main.c:
+        (NPP_URLNotify):
+
</ins><span class="cx"> 2007-03-04  Krzysztof Kowalczyk  &lt;kkowalczyk@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Nikolas Zimmermann.
</span></span></pre></div>
<a id="trunkWebKitToolsDumpRenderTreeTestNetscapePlugInsubprojPluginObjectc"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.c (19965 => 19966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.c        2007-03-05 18:37:17 UTC (rev 19965)
+++ trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.c        2007-03-05 19:31:02 UTC (rev 19966)
</span><span class="lines">@@ -79,15 +79,17 @@
</span><span class="cx"> #define ID_TEST_GETURL              1
</span><span class="cx"> #define ID_REMOVE_DEFAULT_METHOD    2
</span><span class="cx"> #define ID_TEST_DOM_ACCESS          3
</span><ins>+#define ID_TEST_GET_URL_NOTIFY      4
</ins><span class="cx"> 
</span><del>-#define NUM_METHOD_IDENTIFIERS      4
</del><ins>+#define NUM_METHOD_IDENTIFIERS      5
</ins><span class="cx"> 
</span><span class="cx"> static NPIdentifier pluginMethodIdentifiers[NUM_METHOD_IDENTIFIERS];
</span><span class="cx"> static const NPUTF8 *pluginMethodIdentifierNames[NUM_METHOD_IDENTIFIERS] = {
</span><span class="cx">     &quot;testCallback&quot;,
</span><span class="cx">     &quot;getURL&quot;,
</span><span class="cx">     &quot;removeDefaultMethod&quot;,
</span><del>-    &quot;testDOMAccess&quot;
</del><ins>+    &quot;testDOMAccess&quot;,
+    &quot;getURLNotify&quot;,
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> static NPUTF8* createCStringFromNPVariant(const NPVariant *variant)
</span><span class="lines">@@ -209,6 +211,22 @@
</span><span class="cx">         testDOMAccess(obj);
</span><span class="cx">         VOID_TO_NPVARIANT(*result);
</span><span class="cx">         return true;
</span><ins>+    } else if (name == pluginMethodIdentifiers[ID_TEST_GET_URL_NOTIFY]) {
+        if (argCount == 3 &amp;&amp; NPVARIANT_IS_STRING(args[0]) &amp;&amp; NPVARIANT_IS_STRING(args[1]) &amp;&amp; NPVARIANT_IS_STRING(args[2])) {
+            NPUTF8* urlString = createCStringFromNPVariant(&amp;args[0]);
+            NPUTF8* targetString = createCStringFromNPVariant(&amp;args[1]);            
+            NPUTF8* callbackString = createCStringFromNPVariant(&amp;args[2]);
+            
+            NPIdentifier callbackIdentifier = browser-&gt;getstringidentifier(callbackString);
+            browser-&gt;geturlnotify(obj-&gt;npp, urlString, targetString, callbackIdentifier);
+
+            free(urlString);
+            free(targetString);
+            free(callbackString);
+            
+            VOID_TO_NPVARIANT(*result);
+            return true;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="lines">@@ -244,3 +262,21 @@
</span><span class="cx"> {
</span><span class="cx">     free(obj);
</span><span class="cx"> }
</span><ins>+
+void handleCallback(PluginObject* object, const char *url, NPReason reason, void *notifyData)
+{
+    assert(object);
+    
+    NPVariant args[1];
+    
+    NPObject *windowScriptObject;
+    browser-&gt;getvalue(object-&gt;npp, NPPVpluginScriptableNPObject, &amp;windowScriptObject);
+    
+    NPIdentifier callbackIdentifier = notifyData;
+
+    INT32_TO_NPVARIANT(reason, args[0]);
+
+    NPVariant browserResult;
+    browser-&gt;invoke(object-&gt;npp, windowScriptObject, callbackIdentifier, args, 1, &amp;browserResult);
+    browser-&gt;releasevariantvalue(&amp;browserResult);
+}
</ins></span></pre></div>
<a id="trunkWebKitToolsDumpRenderTreeTestNetscapePlugInsubprojPluginObjecth"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.h (19965 => 19966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.h        2007-03-05 18:37:17 UTC (rev 19965)
+++ trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/PluginObject.h        2007-03-05 19:31:02 UTC (rev 19966)
</span><span class="lines">@@ -42,3 +42,4 @@
</span><span class="cx"> } PluginObject;
</span><span class="cx"> 
</span><span class="cx"> extern NPClass *getPluginClass(void);
</span><ins>+extern void handleCallback(PluginObject* object, const char *url, NPReason reason, void *notifyData);
</ins></span></pre></div>
<a id="trunkWebKitToolsDumpRenderTreeTestNetscapePlugInsubprojmainc"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/main.c (19965 => 19966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/main.c        2007-03-05 18:37:17 UTC (rev 19965)
+++ trunk/WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/main.c        2007-03-05 19:31:02 UTC (rev 19966)
</span><span class="lines">@@ -192,6 +192,9 @@
</span><span class="cx"> 
</span><span class="cx"> void NPP_URLNotify(NPP instance, const char *url, NPReason reason, void *notifyData)
</span><span class="cx"> {
</span><ins>+    PluginObject *obj = instance-&gt;pdata;
+        
+    handleCallback(obj, url, reason, notifyData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value)
</span></span></pre>
</div>
</div>

</body>
</html>