AppCenter-Skript liefert statt Elementen jxbrowser.Proxy
Author: Anonymous
Publication Date: 3/20/2012 15:51
Hallo FS-Community,
langsam bin ich ziemlich am verzweifeln. Wir versuchen hier nun schon fast den ganzen Tag eine einfachste (!!!) AppCenter-Application zu erstellen. Hierbei sollen lediglich alle Teaser der zeit.de-Startseite mit einem Mouseover hinterlegt werden.
Das Problem ist jedoch, dass ich mich nicht durch den DOM-Baum bis zu den entsprechenden Elementen hangeln kann, da JEDES Element, dass ich vom BrowserHandler zurückbekomme ein class de.espirit.firstspirit.client.gui.applications.jxbrowser.Proxy-Objekt ist, mit dem man aber auch mal gerade gar nichts anfangen kann ...
Folgendes Skript verwenden wir (vom Wikipedia-Showcase geklaut und leicht abgewandelt):
import de.espirit.firstspirit.client.gui.applications.ApplicationService;
import de.espirit.firstspirit.client.gui.applications.browser.BrowserApplicationConfiguration;
import de.espirit.firstspirit.client.gui.applications.browser.EngineType;
import de.espirit.firstspirit.client.gui.applications.browser.BrowserApplication;
import de.espirit.firstspirit.access.ServicesBroker;
import de.espirit.firstspirit.agency.StoreAgent;
import de.espirit.firstspirit.agency.ResolutionAgent;
import de.espirit.firstspirit.access.store.Store;
import de.espirit.firstspirit.access.store.mediastore.Media;
import de.espirit.common.function.UnaryProcedure;
import javax.swing.ImageIcon;
import java.awt.datatransfer.DataFlavor;
import javax.swing.Action;
import de.espirit.firstspirit.agency.TransferAgent;
import de.espirit.common.crypto.Base64;
/* --- ElementDecorator --- */
onRegister(element, node) {
element.setAttribute("onmouseout", "this.style.backgroundColor='';");
element.setAttribute("onmouseover", "this.style.backgroundColor='#EAB9CC';");
}
/* --- Browser Listener --- */
onDocumentComplete(String url) {
nodeHandlerBuilder = browserApp.createNodeHandlerBuilder();
nodeHandlerBuilder.setElementDecorator(this);
doc = browserApp.getCurrentDocument(); //ist laut Logging bereits ein $Proxy88
mainElement = doc.getElementById("main");
nodeHandler = nodeHandlerBuilder.bind();
if (mainElement != null) {
childList = mainElement.getChildNodes();
for(int i = 0; i < childList.getLength(); i++) {
nodeHandler.register(childList.item(i), url); //jedes Item ist ein $Proxy93 und kann damit nicht an die register(Element, Node)-Methode weitergegeben werden...
}
}
}
// fall back method for not yet implemented calls
invoke(method, args) {
buf = new StringBuilder();
for (int i = 0; i < args.length; i++) {
buf.append(args[i]).append("(").append(args[i].getClass().getName()).append(")");
buf.append(",");
}
context.logDebug("not implemented yet: '" + method + "' args=" + args.length + " [" + buf.toString() + "]");
}
/* ============================ */
/* ========== Script ========== */
/* ============================ */
services = context.requireSpecialist(ServicesBroker.TYPE);
appService = services.getService(ApplicationService.class);
APP_IDENT = "ZEIT_APPCENTER";
// search url combined with text field value passed via FS_BUTTON in sectiontemplate: "Zeit_test"
url = "http://www.zeit.de/index";
// is there already a wikipedia search tab
existing = appService.getApplication(BrowserApplication.TYPE, APP_IDENT);
if (existing != null && !existing.isClosed()) {
// reuse existing tab
existing.setSelected();
existing.getApplication().openUrl(url);
} else {
// browser configuration
configuration = BrowserApplicationConfiguration.GENERATOR.invoke().
//icon(icon).
identifier(APP_IDENT).
title("Zeit App");
appTab = appService.openApplication(BrowserApplication.TYPE, configuration);
browserApp = appTab.getApplication();
browserApp.addBrowserListener(this);
browserApp.openUrl(url);
}
Was mache ich oder was läuft hier falsch? Warum kann ich nicht so etwas simples mittels Skript erledigen? Ich würde hierfür nicht unbedingt so gern ein eigenes Modul schreiben müssen. Und gibt es eine Möglichkeit Skript irgendwie zu debuggen? Es ist ein Krux sich selbst Error-Logs einzubauen, nur um dann zu merken, dass ein Skript in irgendeiner alten Version von vor 10min gestartet wurde obwohl es gespeichert, zurückgegeben und mind. 2min mit F5 bearbeitet wurde.
Viele Grüße aus Hamburg
Tags: 4.2.461.48921, appcenter, casting, document, element, jxbrowser, problem, proxy
-
Author: gockel - 3/21/2012 11:28
if (mainElement != null) {
childList = mainElement.getChildNodes();
for(int i = 0; i < childList.getLength(); i++) {
nodeHandler.register(childList.item(i), url); //jedes Item ist ein $Proxy93 und kann damit nicht an die register(Element, Node)-Methode weitergegeben werden...
}
}
Das Problem ist hier nicht, dass dort ein Proxy von uns drumliegt, sondern dass sie ungeprüft Objekte vom Typ org.w3c.dom.Node an eine Methode (#register) weitergeben, die nur org.w3c.dom.Element als Parameter erlaubt.
In Java hätten sie dabei einen Compile-Error erhalten. In Beanshell natürlich nicht.
So sollte es funktionieren:
if (mainElement != null) {
childList = mainElement.getChildNodes(); // liefert NodeList zurück
for(int i = 0; i < childList.getLength(); i++) {
childNode = childList.item(i); // liefert Node zurück
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
nodeHandler.register(childNode, url);
}
}
}
0
Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.
Kommentare
1 Kommentar