xforms bug 258472 - Add the XPath functions needed for XForms, r=sicking,sr=peterv
git-svn-id: svn://10.0.0.236/trunk@168424 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
3437ee229a
commit
b28fe0f967
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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())
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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>)
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user