Subj : Re: Rhino and Java browser To : Carlos Barrera From : Igor Bukanov Date : Wed Jun 09 2004 04:57 pm Carlos Barrera wrote: > Hello > > IŽd like to known if you can help me with information about How > integrated > javacripts support to a simple browser using Rhino. > [ This is also posted to netscape.public.mozilla.jseng newsgroup ] It is a long shot but if you need to display simple html/JavaScript mixture that you fully control, you may start with the following: 1. Create java class that would represent your window object for each frame: public class MyWindow { org.w3c.dom.Document document; MyWindow(org.w3c.dom.Document document) { this.document = document; } public void alert(String message) { System.out.println(message); } public org.w3c.dom.Document getDocument() { return document; } } 2. Create Java class for you navigator object: public class MyNavigator { public String getAppName() { return "My Browser"; } // other properties... } 2. Initialize scope for the standard libraries and add navigator object to it: Scriptable libraryScope; Context cx = Context.enter(); try { libraryScope = cx.initStandardObjects(); MyNavigator n = new MyNavigator(); ScriptableObject.putProperty(libraryScope, "navigator", Context.toObject(n, libraryScope)); } finally { Context.exit(); } 3. For each document that can potentially contain scripts before document parsing create DOM document object and then create MyWindow instance and create top level JavaScript scope based on it with properly initialized prototype chain: Scriptable documentScope; MyWindow window = new MyWindow(domDocument); Context cx = Context.enter(); try { Scriptable windowJS = Context.toObject(window, libraryScope); windowJS.setParent(null); windowJS.setPrototype(libraryScope); documentScope = cx.newObject(windowJS); documentScope.setParent(null); documentScope.setPrototype(windowJS); ScriptableObject.putProperty(documentScope, "window", documentScope); ScriptableObject.putProperty(documentScope, "self", documentScope); } finally { Context.exit(); } In this way you creates documentScope that will be used to store script-specific variables that contain 2 properties window and self which can be used as an alias for "this" during script execution which is the defacto-standard since NetscapeNavigator 2.0. The prototype chain of this scope points to JS wrapper of MyWindow which in turns points to libraryScope with all standard objects. In this way all methods defined in window are visible to scripts. 4. During DOM building for each script tag extract its JS source and execute it in the following way: String script_text = ...; Context cx = Context.enter(); try { // Force pure interpretation mode to avoid class generation. // This is the fastest way to run vast majority of scripts cx.setOptimizationLevel(-1); cx.evaluateString(documentScope, script_text, "script_url", number_of_the_line_with_script_tag_or_0, null); } finally { Context.exit(); } With this setup you should be able to run scripts like:
....
5. Add the rest of necessary properties ... If you are going to evaluate untrusted scripts, do NOT forget to setup proper security (SecurityController is your friend here). Regards, Igor .