<!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.
<rdar://problem/5025212>
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.
<rdar://problem/5025212>
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.
<rdar://problem/5025212>
In Mail, a crash occurs at WebCore::Frame::tree() when clicking on embedded flash object
Add a "getURLNotify" 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 <acarlsson@apple.com>
+
+ Reviewed by Adam, Darin.
+
+ <rdar://problem/5025212>
+ 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 <ap@webkit.org>
</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>+<html>
+<body>
+<embed name="plg" type="application/x-webkit-test-netscape"></embed>
+<script>
+var NPERR_GENERIC_ERROR = 1;
+
+function callback(result) {
+ var d = document.getElementById('result');
+
+ if (result == NPERR_GENERIC_ERROR)
+ d.innerHTML = "SUCCESS"
+ else
+ d.innerHTML = "FAILED - Expected error code 1 but got error code " + result
+
+ layoutTestController.notifyDone();
+}
+
+if (window.layoutTestController) {
+ layoutTestController.dumpAsText();
+ layoutTestController.waitUntilDone();
+
+ plg.getURLNotify("http://www.apple.com", "_blank", "callback");
+} else {
+ document.write("Cannot run interactively");
+}
+</script>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.
+<div id="result">FAILED</div>
+</body>
+</html>
</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 <acarlsson@apple.com>
+
+ Reviewed by Adam, Darin.
+
+ <rdar://problem/5025212>
+ 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 <sullivan@apple.com>
</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)->tree()->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 <acarlsson@apple.com>
+
+ Reviewed by Adam, Darin.
+
+ <rdar://problem/5025212>
+ In Mail, a crash occurs at WebCore::Frame::tree() when clicking on embedded flash object
+
+ Add a "getURLNotify" 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 <kkowalczyk@gmail.com>
</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"> "testCallback",
</span><span class="cx"> "getURL",
</span><span class="cx"> "removeDefaultMethod",
</span><del>- "testDOMAccess"
</del><ins>+ "testDOMAccess",
+ "getURLNotify",
</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 && NPVARIANT_IS_STRING(args[0]) && NPVARIANT_IS_STRING(args[1]) && NPVARIANT_IS_STRING(args[2])) {
+ NPUTF8* urlString = createCStringFromNPVariant(&args[0]);
+ NPUTF8* targetString = createCStringFromNPVariant(&args[1]);
+ NPUTF8* callbackString = createCStringFromNPVariant(&args[2]);
+
+ NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString);
+ browser->geturlnotify(obj->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->getvalue(object->npp, NPPVpluginScriptableNPObject, &windowScriptObject);
+
+ NPIdentifier callbackIdentifier = notifyData;
+
+ INT32_TO_NPVARIANT(reason, args[0]);
+
+ NPVariant browserResult;
+ browser->invoke(object->npp, windowScriptObject, callbackIdentifier, args, 1, &browserResult);
+ browser->releasevariantvalue(&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->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>