package client.net.sf.saxon.ce.js; import client.net.sf.saxon.ce.expr.Container; import client.net.sf.saxon.ce.expr.Expression; import client.net.sf.saxon.ce.expr.StaticContext; import client.net.sf.saxon.ce.expr.StringLiteral; import client.net.sf.saxon.ce.value.StringValue; import client.net.sf.saxon.ce.functions.FunctionLibrary; import client.net.sf.saxon.ce.lib.NamespaceConstant; import client.net.sf.saxon.ce.om.StructuredQName; import client.net.sf.saxon.ce.trans.XPathException; /** * Library of Saxon-defined extension functions for the browser environment */ public class IXSLFunctionLibrary implements FunctionLibrary { public boolean hasFunctionSignature(StructuredQName functionName, int arity) { String uri = functionName.getNamespaceURI(); if (NamespaceConstant.IXSL.equals(uri)) { return true; // TODO: implement this more accurately! } else if (NamespaceConstant.JS.equals(uri)) { return exists(functionName.getLocalName()); } return false; } private static native boolean exists(String member) /*-{ return !!$wnd[member]; }-*/; public Expression bind(StructuredQName functionName, Expression[] staticArgs, StaticContext env, Container container) throws XPathException { String uri = functionName.getNamespaceURI(); if (NamespaceConstant.IXSL.equals(uri)) { if (!hasFunctionSignature(functionName, staticArgs.length)) { return null; } String local = functionName.getLocalName(); return new IXSLFunction(local, staticArgs); } else if (NamespaceConstant.JS.equals(uri)) { String local = functionName.getLocalName(); // if (!exists(local)) { // return null; // } Expression[] args = new Expression[staticArgs.length + 2]; System.arraycopy(staticArgs, 0, args, 2, staticArgs.length); args[0] = new IXSLFunction("window", new Expression[0]); args[1] = StringLiteral.makeLiteral(new StringValue(local)); return new IXSLFunction("call", args); } else { return null; } } } // This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. // If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. // This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.