xforms bug 258472 - Add the XPath functions needed for XForms, r=sicking,sr=peterv

This commit is contained in:
doronr%us.ibm.com 2005-01-27 23:02:27 +00:00
parent d94c0df713
commit c4d30bcb1a
11 changed files with 105 additions and 49 deletions

View File

@ -59,6 +59,10 @@
#include "txXSLTProcessor.h"
#include "nsXPath1Scheme.h"
#ifndef DISABLE_XFORMS_HOOKS
#include "nsXFormsXPathEvaluator.h"
#endif
NS_GENERIC_FACTORY_CONSTRUCTOR(nsXPath1SchemeProcessor)
/* 1c1a3c01-14f6-11d6-a7f2-ea502af815dc */
@ -111,6 +115,9 @@ NS_DOMCI_EXTENSION_END
// Factory Constructor
NS_GENERIC_FACTORY_CONSTRUCTOR(txMozillaXSLTProcessor)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsXPathEvaluator)
#ifndef DISABLE_XFORMS_HOOKS
NS_GENERIC_FACTORY_CONSTRUCTOR(nsXFormsXPathEvaluator)
#endif
NS_DECL_DOM_CLASSINFO(XSLTProcessor)
NS_DECL_DOM_CLASSINFO(XPathEvaluator)
@ -295,6 +302,12 @@ static const nsModuleComponentInfo gComponents[] = {
TRANSFORMIIX_XPATH_EVALUATOR_CID,
NS_XPATH_EVALUATOR_CONTRACTID,
nsXPathEvaluatorConstructor },
#ifndef DISABLE_XFORMS_HOOKS
{ "XFormsXPathEvaluator",
TRANSFORMIIX_XFORMS_XPATH_EVALUATOR_CID,
NS_XFORMS_XPATH_EVALUATOR_CONTRACTID,
nsXFormsXPathEvaluatorConstructor },
#endif
{ "Transformiix DOMCI Extender",
TRANSFORMIIX_DOMCI_EXTENSION_CID,
TRANSFORMIIX_DOMCI_EXTENSION_CONTRACTID,

View File

@ -104,6 +104,14 @@ else
CPPSRCS += txStandaloneXPathTreeWalker.cpp
endif
ifndef DISABLE_XFORMS_HOOKS
EXPORTS = nsIXFormsUtilityService.h \
nsIXFormsXPathEvaluator.h
CPPSRCS += nsXFormsXPathEvaluator.cpp \
XFormsFunctionCall.cpp
endif
# we don't want the shared lib, but we want to force the creation of a
# static lib.
FORCE_STATIC_LIB = 1

View File

@ -90,3 +90,21 @@ TX_ATOM(parent, "parent")
TX_ATOM(preceding, "preceding")
TX_ATOM(precedingSibling, "preceding-sibling")
TX_ATOM(self, "self")
#ifndef DISABLE_XFORMS_HOOKS
// XForms XPath Extensions
TX_ATOM(avg, "avg")
TX_ATOM(booleanFromString, "boolean-from-string")
TX_ATOM(countNonEmpty, "count-non-empty")
TX_ATOM(daysFromDate, "days-from-date")
TX_ATOM(ifFunc, "if")
TX_ATOM(index, "index")
TX_ATOM(instance, "instance")
TX_ATOM(min, "min")
TX_ATOM(max, "max")
TX_ATOM(months, "months")
TX_ATOM(now, "now")
TX_ATOM(property, "property")
TX_ATOM(seconds, "seconds")
TX_ATOM(secondsFromDateTime, "seconds-from-dateTime")
#endif

View File

@ -65,6 +65,7 @@ REQUIRES = \
xpconnect \
js \
layout \
transformiix \
schemavalidation \
$(NULL)
@ -129,6 +130,7 @@ CPPSRCS = \
nsXFormsSchemaValidator.cpp \
nsXFormsNodeState.cpp \
nsXFormsControlStub.cpp \
nsXFormsUtilityService.cpp \
$(NULL)
EXTRA_DSO_LDOPTS = $(MOZ_COMPONENT_LIBS)

View File

@ -55,7 +55,7 @@
#include "nsIDOMXMLDocument.h"
#include "nsIDOMEventReceiver.h"
#include "nsIDOMXPathResult.h"
#include "nsIDOMXPathEvaluator.h"
#include "nsIXFormsXPathEvaluator.h"
#include "nsIDOMXPathNSResolver.h"
#include "nsIDOMXPathExpression.h"
#include "nsIScriptGlobalObject.h"
@ -856,7 +856,10 @@ nsXFormsModelElement::FinishConstruction()
nsCOMPtr<nsIDOMElement> firstInstanceRoot;
firstInstanceDoc->GetDocumentElement(getter_AddRefs(firstInstanceRoot));
nsCOMPtr<nsIDOMXPathEvaluator> xpath = do_QueryInterface(firstInstanceDoc);
nsresult rv;
nsCOMPtr<nsIXFormsXPathEvaluator> xpath =
do_CreateInstance("@mozilla.org/dom/xforms-xpath-evaluator;1", &rv);
NS_ENSURE_TRUE(xpath, rv);
nsCOMPtr<nsIDOMNodeList> children;
mElement->GetChildNodes(getter_AddRefs(children));
@ -866,7 +869,6 @@ nsXFormsModelElement::FinishConstruction()
children->GetLength(&childCount);
nsAutoString namespaceURI, localName;
nsresult rv;
for (PRUint32 i = 0; i < childCount; ++i) {
nsCOMPtr<nsIDOMNode> child;
children->Item(i, getter_AddRefs(child));
@ -929,11 +931,11 @@ nsXFormsModelElement::MaybeNotifyCompletion()
}
nsresult
nsXFormsModelElement::ProcessBind(nsIDOMXPathEvaluator *aEvaluator,
nsIDOMNode *aContextNode,
PRInt32 aContextPosition,
PRInt32 aContextSize,
nsIDOMElement *aBindElement)
nsXFormsModelElement::ProcessBind(nsIXFormsXPathEvaluator *aEvaluator,
nsIDOMNode *aContextNode,
PRInt32 aContextPosition,
PRInt32 aContextSize,
nsIDOMElement *aBindElement)
{
// Get the model item properties specified by this \<bind\>.
nsCOMPtr<nsIDOMXPathExpression> props[eModel__count];
@ -941,9 +943,6 @@ nsXFormsModelElement::ProcessBind(nsIDOMXPathEvaluator *aEvaluator,
nsresult rv;
nsAutoString attrStr;
nsCOMPtr<nsIDOMXPathNSResolver> resolver;
aEvaluator->CreateNSResolver(aBindElement, getter_AddRefs(resolver));
for (int i = 0; i < eModel__count; ++i) {
sModelPropsList[i]->ToString(attrStr);
@ -951,7 +950,7 @@ nsXFormsModelElement::ProcessBind(nsIDOMXPathEvaluator *aEvaluator,
if (!propStrings[i].IsEmpty() &&
i != eModel_type &&
i != eModel_p3ptype) {
rv = aEvaluator->CreateExpression(propStrings[i], resolver,
rv = aEvaluator->CreateExpression(propStrings[i], aBindElement,
getter_AddRefs(props[i]));
if (NS_FAILED(rv)) {
nsXFormsUtils::DispatchEvent(mElement, eEvent_ComputeException);
@ -970,7 +969,7 @@ nsXFormsModelElement::ProcessBind(nsIDOMXPathEvaluator *aEvaluator,
}
///
/// @todo use aContextSize and aContextPosition in evaluation (XXX)
rv = aEvaluator->Evaluate(expr, aContextNode, resolver,
rv = aEvaluator->Evaluate(expr, aContextNode, aBindElement,
nsIDOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE,
nsnull, getter_AddRefs(result));
if (NS_FAILED(rv)) {
@ -1001,7 +1000,7 @@ nsXFormsModelElement::ProcessBind(nsIDOMXPathEvaluator *aEvaluator,
// Apply MIPs
nsXFormsXPathParser parser;
nsXFormsXPathAnalyzer analyzer(aEvaluator, resolver);
nsXFormsXPathAnalyzer analyzer(aEvaluator, aBindElement);
PRBool multiMIP = PR_FALSE;
for (int j = 0; j < eModel__count; ++j) {
if (propStrings[j].IsEmpty())

View File

@ -54,7 +54,7 @@
class nsIDOMElement;
class nsIDOMNode;
class nsIDOMXPathEvaluator;
class nsIXFormsXPathEvaluator;
class nsIDOMXPathResult;
class nsXFormsControl;
@ -104,11 +104,11 @@ private:
NS_HIDDEN_(nsresult) FinishConstruction();
NS_HIDDEN_(void) MaybeNotifyCompletion();
NS_HIDDEN_(nsresult) ProcessBind(nsIDOMXPathEvaluator *aEvaluator,
nsIDOMNode *aContextNode,
PRInt32 aContextPosition,
PRInt32 aContextSize,
nsIDOMElement *aBindElement);
NS_HIDDEN_(nsresult) ProcessBind(nsIXFormsXPathEvaluator *aEvaluator,
nsIDOMNode *aContextNode,
PRInt32 aContextPosition,
PRInt32 aContextSize,
nsIDOMElement *aBindElement);
NS_HIDDEN_(void) RemoveModelFromDocument();

View File

@ -38,13 +38,20 @@
#include "nsIGenericFactory.h"
#include "nsXFormsElementFactory.h"
#include "nsXFormsUtilityService.h"
#include "nsXFormsAtoms.h"
#include "nsXFormsModelElement.h"
#include "nsXFormsUtils.h"
#include "nsICategoryManager.h"
#include "nsIServiceManager.h"
// bb0d9c8b-3096-4b66-92a0-6c1ddf80e65f
#define NS_XFORMSUTILITYSERVICE_CID \
{ 0xbb0d9c8b, 0x3096, 0x4b66, { 0x92, 0xa0, 0x6c, 0x1d, 0xdf, 0x80, 0xe6, 0x5f }}
NS_GENERIC_FACTORY_CONSTRUCTOR(nsXFormsElementFactory)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsXFormsUtilityService)
static NS_IMETHODIMP
RegisterXFormsModule(nsIComponentManager *aCompMgr,
@ -89,7 +96,11 @@ static const nsModuleComponentInfo components[] = {
nsXFormsElementFactoryConstructor,
RegisterXFormsModule,
UnregisterXFormsModule
}
},
{ "XForms Utility Service",
NS_XFORMSUTILITYSERVICE_CID,
NS_XFORMS_UTILITY_CONTRACTID,
nsXFormsUtilityServiceConstructor }
};
PR_STATIC_CALLBACK(nsresult)

View File

@ -46,7 +46,7 @@
#include "nsINameSpaceManager.h"
#include "nsINodeInfo.h"
#include "nsIDOMNodeList.h"
#include "nsIDOMXPathEvaluator.h"
#include "nsIXFormsXPathEvaluator.h"
#include "nsIDOMXPathResult.h"
#include "nsIDOMXPathNSResolver.h"
#include "nsIDOMDocument.h"
@ -72,6 +72,7 @@
#include "nsIScriptSecurityManager.h"
#include "nsIPermissionManager.h"
#include "nsServiceManagerUtils.h"
#include "nsIXFormsUtilityService.h"
#define CANCELABLE 0x01
#define BUBBLES 0x02
@ -349,46 +350,49 @@ nsXFormsUtils::EvaluateXPath(const nsAString &aExpression,
aContextNode->GetOwnerDocument(getter_AddRefs(doc));
NS_ENSURE_TRUE(doc, nsnull);
nsCOMPtr<nsIDOMXPathEvaluator> eval = do_QueryInterface(doc);
nsCOMPtr<nsIXFormsXPathEvaluator> eval =
do_CreateInstance("@mozilla.org/dom/xforms-xpath-evaluator;1");
NS_ENSURE_TRUE(eval, nsnull);
nsCOMPtr<nsIDOMXPathNSResolver> resolver;
eval->CreateNSResolver(aResolverNode, getter_AddRefs(resolver));
NS_ENSURE_TRUE(resolver, nsnull);
nsCOMPtr<nsIDOMXPathExpression> expression;
eval->CreateExpression(aExpression,
resolver,
aResolverNode,
getter_AddRefs(expression));
NS_ENSURE_TRUE(expression, nsnull);
///
/// @todo Evaluate() should use aContextPosition and aContextSize
nsCOMPtr<nsISupports> supResult;
expression->Evaluate(aContextNode,
aResultType,
nsnull,
getter_AddRefs(supResult));
nsresult rv = expression->Evaluate(aContextNode,
aResultType,
nsnull,
getter_AddRefs(supResult));
nsIDOMXPathResult *result = nsnull;
if (supResult) {
if (NS_SUCCEEDED(rv) && supResult) {
/// @todo beaufour: This is somewhat "hackish". Hopefully, this will
/// improve when we integrate properly with Transformiix (XXX)
/// @see http://bugzilla.mozilla.org/show_bug.cgi?id=265212
if (aSet) {
nsXFormsXPathParser parser;
nsXFormsXPathAnalyzer analyzer(eval, resolver);
nsXFormsXPathAnalyzer analyzer(eval, aResolverNode);
nsAutoPtr<nsXFormsXPathNode> xNode(parser.Parse(aExpression));
nsresult rv = analyzer.Analyze(aContextNode,
xNode,
expression,
&aExpression,
aSet);
rv = analyzer.Analyze(aContextNode,
xNode,
expression,
&aExpression,
aSet);
NS_ENSURE_SUCCESS(rv, nsnull);
}
CallQueryInterface(supResult, &result); // addrefs
}
else if(rv == NS_ERROR_XFORMS_CALCUATION_EXCEPTION){
nsCOMPtr<nsIDOMElement> resolverElement = do_QueryInterface(aResolverNode);
nsCOMPtr<nsIModelElementPrivate> modelPriv = nsXFormsUtils::GetModel(resolverElement);
nsCOMPtr<nsIDOMNode> model = do_QueryInterface(modelPriv);
DispatchEvent(model, eEvent_ComputeException);
}
return result;
}

View File

@ -199,7 +199,7 @@ public:
* and returned (addrefed) in |aModel|
*
* The return value is an XPathResult as returned from
* nsIDOMXPathEvaluator::Evaluate().
* nsIXFormsXPathEvaluator::Evaluate().
*/
static NS_HIDDEN_(nsresult)
EvaluateNodeBinding(nsIDOMElement *aElement,
@ -223,8 +223,8 @@ public:
/**
* Convenience method for doing XPath evaluations. This gets a
* nsIDOMXPathEvaluator from |aContextNode|'s ownerDocument, and calls
* nsIDOMXPathEvaluator::Evalute using the given expression, context node,
* nsIXFormsXPathEvaluator from |aContextNode|'s ownerDocument, and calls
* nsIXFormsXPathEvaluator::Evalute using the given expression, context node,
* namespace resolver, and result type.
*/
static NS_HIDDEN_(already_AddRefed<nsIDOMXPathResult>)

View File

@ -46,8 +46,9 @@
MOZ_DECL_CTOR_COUNTER(nsXFormsXPathAnalyzer)
nsXFormsXPathAnalyzer::nsXFormsXPathAnalyzer(nsIDOMXPathEvaluator *aEvaluator,
nsIDOMXPathNSResolver *aResolver)
nsXFormsXPathAnalyzer::nsXFormsXPathAnalyzer(
nsIXFormsXPathEvaluator *aEvaluator,
nsIDOMNode *aResolver)
: mEvaluator(aEvaluator),
mResolver(aResolver)
{

View File

@ -41,7 +41,7 @@
#include "nsCOMPtr.h"
#include "nsXFormsXPathNode.h"
#include "nsIDOMXPathExpression.h"
#include "nsIDOMXPathEvaluator.h"
#include "nsIXFormsXPathEvaluator.h"
#include "nsIDOMXPathNSResolver.h"
#include "nsXFormsMDGSet.h"
#include "nsIDOMNode.h"
@ -57,8 +57,8 @@
*/
class nsXFormsXPathAnalyzer {
private:
nsCOMPtr<nsIDOMXPathEvaluator> mEvaluator;
nsCOMPtr<nsIDOMXPathNSResolver> mResolver;
nsCOMPtr<nsIXFormsXPathEvaluator> mEvaluator;
nsCOMPtr<nsIDOMNode> mResolver;
nsXFormsMDGSet *mCurSet;
nsCOMPtr<nsIDOMXPathExpression> mCurExpression;
@ -69,8 +69,8 @@ private:
PRUint32 aIndent);
public:
nsXFormsXPathAnalyzer(nsIDOMXPathEvaluator *aEvaluator,
nsIDOMXPathNSResolver *aResolver);
nsXFormsXPathAnalyzer(nsIXFormsXPathEvaluator *aEvaluator,
nsIDOMNode *aResolver);
~nsXFormsXPathAnalyzer();
nsresult Analyze(nsIDOMNode *aContextNode,