Home | History | Annotate | Download | only in xml
      1 /**
      2  * Copyright (C) 2001-2002 Thomas Broyer, Charlie Bozeman and Daniel Veillard.
      3  * Copyright (C) 2007 Alexey Proskuryakov <ap (at) webkit.org>
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a copy
      6  * of this software and associated documentation files (the "Software"), to deal
      7  * in the Software without restriction, including without limitation the rights
      8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      9  * copies of the Software, and to permit persons to whom the Software is fur-
     10  * nished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice shall be included in
     13  * all copies or substantial portions of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
     17  * NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
     18  * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
     19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
     20  * NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     21  *
     22  * Except as contained in this notice, the name of the authors shall not
     23  * be used in advertising or otherwise to promote the sale, use or other deal-
     24  * ings in this Software without prior written authorization from him.
     25  */
     26 
     27 #include "config.h"
     28 #include "core/xml/XSLTExtensions.h"
     29 
     30 #include "platform/RuntimeEnabledFeatures.h"
     31 #include "wtf/Assertions.h"
     32 #include <libxml/xpathInternals.h>
     33 #include <libxslt/extensions.h>
     34 #include <libxslt/extra.h>
     35 #include <libxslt/xsltutils.h>
     36 
     37 namespace blink {
     38 
     39 // FIXME: This code is taken from libexslt 1.1.11; should sync with newer
     40 // versions.
     41 static void exsltNodeSetFunction(xmlXPathParserContextPtr ctxt, int nargs)
     42 {
     43     xmlChar* strval;
     44     xmlNodePtr retNode;
     45     xmlXPathObjectPtr ret;
     46 
     47     if (nargs != 1) {
     48         xmlXPathSetArityError(ctxt);
     49         return;
     50     }
     51 
     52     if (xmlXPathStackIsNodeSet(ctxt)) {
     53         xsltFunctionNodeSet(ctxt, nargs);
     54         return;
     55     }
     56 
     57     strval = xmlXPathPopString(ctxt);
     58     retNode = xmlNewDocText(0, strval);
     59     ret = xmlXPathNewValueTree(retNode);
     60 
     61     // FIXME: It might be helpful to push any errors from xmlXPathNewValueTree
     62     // up to the Javascript Console.
     63     if (ret)
     64         ret->type = XPATH_NODESET;
     65 
     66     if (strval)
     67         xmlFree(strval);
     68 
     69     valuePush(ctxt, ret);
     70 }
     71 
     72 void registerXSLTExtensions(xsltTransformContextPtr ctxt)
     73 {
     74     ASSERT(RuntimeEnabledFeatures::xsltEnabled());
     75     xsltRegisterExtFunction(ctxt, (const xmlChar*)"node-set", (const xmlChar*)"http://exslt.org/common", exsltNodeSetFunction);
     76 }
     77 
     78 } // namespace blink
     79