Author: mhutch
Date: 2007-05-13 10:51:42 -0400 (Sun, 13 May 2007)
New Revision: 77311
Removed:
trunk/jscall-sharp/src/jscallglue/
Modified:
trunk/jscall-sharp/src/
trunk/jscall-sharp/src/AspNetEdit.JSCall/CommandManager.cs
trunk/jscall-sharp/src/ChangeLog
trunk/jscall-sharp/src/Makefile.am
trunk/jscall-sharp/src/Resources/JSCall.js
trunk/jscall-sharp/src/jscall.dll.config.in
trunk/jscall-sharp/src/jscall.mdp
Log:
2007-05-13 Michael Hutchinson <[EMAIL PROTECTED]>
* src/AspNetEdit.JSCall/CommandManager.cs,
src/Resources/JSCall.js: Removed the need for
glue code using "javascript:" urls instead.
Thanks to Chris Howie for this idea.
API changes:
JSCallInit, JSCallRegisterClrHandler, and
JSCallUnregisterClrHandler are no longer necessary.
The CommandManager will call any JS function, passing it the
arguments directly rather than as an array.
* src/jscallglue: Removed C++ glue files.
* src/Makefile.am,
src/jscall.dll.config.in,
src/jscall.mdp: Updated.
Property changes on: trunk/jscall-sharp/src
___________________________________________________________________
Name: svn:ignore
- AssemblyInfo.cs
jscall.dll
Makefile.in
jscall.dll.mdb
libjscallglue.dll.so
Makefile
jscall.pidb
jscall.userprefs
jscall.dll.config
jscall.key
.deps
+ AssemblyInfo.cs
jscall.dll
Makefile.in
jscall.dll.mdb
libjscallglue.dll.so
Makefile
jscall.pidb
jscall.userprefs
jscall.usertasks
jscall.dll.config
jscall.key
.deps
Modified: trunk/jscall-sharp/src/AspNetEdit.JSCall/CommandManager.cs
===================================================================
--- trunk/jscall-sharp/src/AspNetEdit.JSCall/CommandManager.cs 2007-05-13
11:01:05 UTC (rev 77310)
+++ trunk/jscall-sharp/src/AspNetEdit.JSCall/CommandManager.cs 2007-05-13
14:51:42 UTC (rev 77311)
@@ -4,7 +4,7 @@
* Authors:
* Michael Hutchinson <[EMAIL PROTECTED]>
*
- * Copyright (C) 2005 Michael Hutchinson
+ * Copyright (C) 2005-2007 Michael Hutchinson
*
* This sourcecode is licenced under The MIT License:
*
@@ -32,21 +32,12 @@
using System.Collections;
using Gecko;
using System.Text;
-using System.Runtime.InteropServices;
namespace AspNetEdit.JSCall
{
public class CommandManager
- {
- [DllImport ("jscallglue.dll")]
- static extern int PlaceFunctionCall (IntPtr embed,
- [MarshalAs(UnmanagedType.LPWStr)] string call,
- [MarshalAs(UnmanagedType.LPWStr)] string returnto,
- [MarshalAs(UnmanagedType.LPWStr)] string args);
-
- [DllImport ("jscallglue.dll")]
- static extern int ExecuteScript (IntPtr embed,
- [MarshalAs(UnmanagedType.LPWStr)] string script);
+ {
+ private const char delimiter = (char)234;
private Hashtable functions = new Hashtable ();
private WebControl webControl;
@@ -65,7 +56,7 @@
if (!webControl.Title.StartsWith ("JSCall"))
return;
- string[] call = webControl.Title.Split ((char)234);
+ string[] call = webControl.Title.Split (delimiter);
if (call.Length < 2)
throw new Exception ("Too few parameters in
call from JavaScript.");
@@ -97,105 +88,49 @@
if ((script == null) || (script.Length < 1))
throw new ArgumentNullException ("A null or
empty script cannot be executed.", "script");
- int result = ExecuteScript (webControl.Handle, script);
- string err;
-
- switch (result)
- {
- case 0:
- return;
-
- case 1:
- err = "Could not obtain IDOMDocument
from GtkMozEmbed. Have you shown the window yet?";
- break;
-
- case 2:
- err = "Could not create script
element.";
- break;
-
- case 3:
- err = "Could not cast script element to
nsIDOMHTMLScriptElement.";
- break;
-
- case 4:
- err = "Could not locate body element.";
- break;
-
- case 5:
- err = "Could not append script element
to body.";
- break;
- }
-
- throw new Exception ("Glue function ExecuteScript: " +
err);
- }
-
+ webControl.LoadUrl ("javascript:" + script);
+ }
+
public void JSCall (string function, string returnTo, params
string[] args)
{
if ((function==null) || (function.Length < 1))
throw new ArgumentException ("A function name
must be specified.", "function");
-
- if (returnTo == null) returnTo = string.Empty;
- string argsOut = String.Empty;
-
- if (args != null) {
- argsOut += args[0];
- for (int i = 1; i <= args.Length - 1; i++) {
- argsOut += (char)234 + args[i];
- }
+ StringBuilder sb = new StringBuilder ();
+ sb.Append ("javascript: ");
+
+ //wrap the call in a function to handle the return value
+ if (returnTo != null)
+ sb.AppendFormat ("JSCallPlaceClrCall(\"{0}\",
\"\", new Array( ", returnTo);
+
+ //call the function
+ sb.AppendFormat ("{0} (", function);
+
+ //add the arguments
+ if (args != null) {
+ for (int i = 0; i < args.Length - 1; i++)
+ sb.AppendFormat ("\"{0}\", ",
escapeJSString (args[i]));
+ sb.AppendFormat ("\"{0}\"", escapeJSString
(args[args.Length-1]));
}
-
- int result = PlaceFunctionCall (webControl.Handle,
function, returnTo, argsOut);
-
- string err;
-
- switch (result)
- {
- case 0:
- return;
-
- case 1:
- err = "Could not obtain IDOMDocument
from GtkMozEmbed. Have you shown the window yet?";
- break;
-
- case 2:
- err = "Error finding 'jscall' nodes.";
- break;
-
- case 3:
- err = "Error getting number of 'jscall'
nodes.";
- break;
-
- case 4:
- err = "More or fewer than one 'jscall'
node.";
- break;
-
- case 5:
- err = "Error getting 'jscall' node.";
- break;
-
- case 6:
- err = "Error adding 'infunction' node.";
- break;
-
- case 7:
- err = "Error setting attributes on
'infunction' node.";
- break;
-
- case 8:
- err = "Error getting nsIDOMNode
interface on 'infunction' node.";
- break;
-
- case 9:
- err = "Error appending 'infunction'
node to 'jscall' node.";
- break;
-
- default:
- err = "The glue wrapper returned an
unknown error.";
- break;
- }
-
- throw new Exception ("Glue function PlaceFunctionCall:
"+err);
+
+ //close the function call
+ sb.Append (")");
+
+ //end return wrapper
+ if (returnTo != null)
+ sb.Append (") )");
+ sb.Append(";");
+
+ System.Diagnostics.Trace.WriteLine(sb.ToString ());
+
+ webControl.LoadUrl (sb.ToString ());
+ }
+
+ private string escapeJSString (string s)
+ {
+ return s.Replace ("\\", "\\\\")
+ .Replace ("\"", "\\\"")
+ .Replace ("\n", "\\n");
}
public void RegisterJSHandler (string name, ClrCall handler)
@@ -222,9 +157,7 @@
throw new IndexOutOfRangeException ("A function
with this name has not been registered.");
}
}
-
}
-
public delegate string ClrCall (string[] args);
}
Modified: trunk/jscall-sharp/src/ChangeLog
===================================================================
--- trunk/jscall-sharp/src/ChangeLog 2007-05-13 11:01:05 UTC (rev 77310)
+++ trunk/jscall-sharp/src/ChangeLog 2007-05-13 14:51:42 UTC (rev 77311)
@@ -1,3 +1,22 @@
+2007-05-13 Michael Hutchinson <[EMAIL PROTECTED]>
+
+ * src/AspNetEdit.JSCall/CommandManager.cs,
+ src/Resources/JSCall.js: Removed the need for
+ glue code using "javascript:" urls instead.
+ Thanks to Chris Howie for this idea.
+
+ API changes:
+ JSCallInit, JSCallRegisterClrHandler, and
+ JSCallUnregisterClrHandler are no longer necessary.
+ The CommandManager will call any JS function, passing it the
+ arguments directly rather than as an array.
+
+ * src/jscallglue: Removed C++ glue files.
+
+ * src/Makefile.am,
+ src/jscall.dll.config.in,
+ src/jscall.mdp: Updated.
+
2007-04-02 Michael Hutchinson <[EMAIL PROTECTED]>
* jscallglue/Makefile.am: More dist fixes.
Modified: trunk/jscall-sharp/src/Makefile.am
===================================================================
--- trunk/jscall-sharp/src/Makefile.am 2007-05-13 11:01:05 UTC (rev 77310)
+++ trunk/jscall-sharp/src/Makefile.am 2007-05-13 14:51:42 UTC (rev 77311)
@@ -1,5 +1,3 @@
-SUBDIRS = jscallglue
-
### Names ###
ASSEMBLY_NAME=jscall
Modified: trunk/jscall-sharp/src/Resources/JSCall.js
===================================================================
--- trunk/jscall-sharp/src/Resources/JSCall.js 2007-05-13 11:01:05 UTC (rev
77310)
+++ trunk/jscall-sharp/src/Resources/JSCall.js 2007-05-13 14:51:42 UTC (rev
77311)
@@ -4,7 +4,7 @@
* Authors:
* Michael Hutchinson <[EMAIL PROTECTED]>
*
- * Copyright (C) 2005 Michael Hutchinson
+ * Copyright (C) 2005-2007 Michael Hutchinson
*
* This sourcecode is licenced under The MIT License:
*
@@ -27,67 +27,11 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-
-var JSCallFunctions;
-var delimiter = unescape ("%ea");
-function JSCallInit()
-{
- JSCallFunctions = Array();
-
- if (document.getElementsByTagName("jscall").length == 0) {
- el = document.createElement("jscall");
- document.documentElement.appendChild(el);
- }
-
- if (document.getElementsByTagName("jscall").length != 1) {
- throw "Error: the document already contains a <jscall> element";
- }
-
- var el = document.getElementsByTagName("jscall")[0];
- el.addEventListener( "DOMNodeInserted", JSCallHandler, false );
-
- //JSCallRegisterClrHandler("Redo", Redo);
-}
-
-//function Redo()
-//{
-// alert("Yay!");
-//}
-
-
-function JSCallHandler(e)
-{
- if ( e.target.nodeName == "infunction" && e.target.nodeType == 1 ){
- fn = e.target.attributes[0].value;
- returnTo = e.target.attributes[1].value;
- args = e.target.attributes[2].value.split(delimiter);
-
- try {
- if(JSCallFunctions[fn]) {
- f = JSCallFunctions[fn];
- result = f(args);
- }
- else {
- throw "JSCall: The '"+fn+"' function has not been
registered";
- }
-
-
- if (returnTo.length != 0) {
- JSCallPlaceClrCall(returnTo, "", new Array(result));
- }
-
- }
- catch(e) {
- alert(e)
- }
- e.target.parentNode.removeChild(e.target);
- }
-}
-
-
-function JSCallPlaceClrCall(fn, returnTo, args) {
+function JSCallPlaceClrCall(fn, returnTo, args) {
+ var delimiter = unescape ("%ea");
+
var str = "JSCall" + delimiter + fn + delimiter + returnTo + delimiter;
if (args && args.length > 0)
@@ -99,26 +43,3 @@
document.title = str;
document.title = oldTitle;
}
-
-
-function JSCallUnregisterClrHandler() {
- if(JSCallFunctions[n]) {
- delete JSCallFunctions[n];
- }
- else {
- throw "Function with that name not registered";
- }
-}
-
-
-function JSCallRegisterClrHandler(n, fn) {
- if((typeof fn) != "function") {
- throw "The fn argument must be a function";
- }
- if(JSCallFunctions[n]) {
- throw "Function with that name already registered";
- }
- else {
- JSCallFunctions[n] = fn;
- }
-}
Modified: trunk/jscall-sharp/src/jscall.dll.config.in
===================================================================
--- trunk/jscall-sharp/src/jscall.dll.config.in 2007-05-13 11:01:05 UTC (rev
77310)
+++ trunk/jscall-sharp/src/jscall.dll.config.in 2007-05-13 14:51:42 UTC (rev
77311)
@@ -1,3 +1,2 @@
<configuration>
- <dllmap dll="jscallglue.dll" target="[EMAIL PROTECTED]@.so"/>
</configuration>
Modified: trunk/jscall-sharp/src/jscall.mdp
===================================================================
--- trunk/jscall-sharp/src/jscall.mdp 2007-05-13 11:01:05 UTC (rev 77310)
+++ trunk/jscall-sharp/src/jscall.mdp 2007-05-13 14:51:42 UTC (rev 77311)
@@ -13,18 +13,6 @@
<CodeGeneration compiler="Csc" warninglevel="4" optimize="True"
unsafecodeallowed="False" generateoverflowchecks="True" mainclass=""
generatexmldocumentation="False" ctype="CSharpCompilerParameters" />
</Configuration>
</Configurations>
- <DeployTargets />
- <DeploymentInformation strategy="File">
- <excludeFiles>
- <ExcludeFile file="./AssemblyInfo.cs.in" />
- <ExcludeFile file="./ChangeLog" />
- <ExcludeFile file="./Resources/ChangeLog" />
- <ExcludeFile file="./jscallglue/ChangeLog" />
- <ExcludeFile file="./AspNetEdit.JSCall/ChangeLog" />
- <ExcludeFile file="./jscall.dll.mdb" />
- <ExcludeFile file="./libjscallglue.dll.so" />
- </excludeFiles>
- </DeploymentInformation>
<Contents>
<File name="./AssemblyInfo.cs.in" subtype="Code" buildaction="Exclude" />
<File name="./AspNetEdit.JSCall/CommandManager.cs" subtype="Code"
buildaction="Compile" />
@@ -42,4 +30,16 @@
<ProjectReference type="Gac" localcopy="True" refto="gecko-sharp,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=ccf7d78a55e9f021" />
<ProjectReference type="Gac" localcopy="True" refto="atk-sharp,
Version=2.6.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
</References>
+ <DeployTargets />
+ <DeploymentInformation strategy="File">
+ <excludeFiles>
+ <ExcludeFile file="./AssemblyInfo.cs.in" />
+ <ExcludeFile file="./ChangeLog" />
+ <ExcludeFile file="./Resources/ChangeLog" />
+ <ExcludeFile file="./jscallglue/ChangeLog" />
+ <ExcludeFile file="./AspNetEdit.JSCall/ChangeLog" />
+ <ExcludeFile file="./jscall.dll.mdb" />
+ <ExcludeFile file="./libjscallglue.dll.so" />
+ </excludeFiles>
+ </DeploymentInformation>
</Project>
\ No newline at end of file
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches