/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* 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/. */ #include "nsGkAtoms.h" #include "txIXPathContext.h" #include "txNodeSet.h" #include "txXPathTreeWalker.h" #include "txXSLTFunctions.h" #include "txExecutionState.h" /* Implementation of XSLT 1.0 extension function: generate-id */ /** * Creates a new generate-id function call **/ GenerateIdFunctionCall::GenerateIdFunctionCall() = default; /** * Evaluates this Expr based on the given context node and processor state * @param context the context node for evaluation of this Expr * @param ps the ContextState containing the stack information needed * for evaluation * @return the result of the evaluation * @see FunctionCall.h **/ nsresult GenerateIdFunctionCall::evaluate(txIEvalContext* aContext, txAExprResult** aResult) { *aResult = nullptr; if (!requireParams(0, 1, aContext)) return NS_ERROR_XPATH_BAD_ARGUMENT_COUNT; txExecutionState* es = static_cast(aContext->getPrivateContext()); if (!es) { NS_ERROR( "called xslt extension function \"generate-id\" with wrong context"); return NS_ERROR_UNEXPECTED; } nsresult rv = NS_OK; if (mParams.IsEmpty()) { StringResult* strRes; rv = aContext->recycler()->getStringResult(&strRes); NS_ENSURE_SUCCESS(rv, rv); txXPathNodeUtils::getXSLTId(aContext->getContextNode(), es->getSourceDocument(), strRes->mValue); *aResult = strRes; return NS_OK; } RefPtr nodes; rv = evaluateToNodeSet(mParams[0], aContext, getter_AddRefs(nodes)); NS_ENSURE_SUCCESS(rv, rv); if (nodes->isEmpty()) { aContext->recycler()->getEmptyStringResult(aResult); return NS_OK; } StringResult* strRes; rv = aContext->recycler()->getStringResult(&strRes); NS_ENSURE_SUCCESS(rv, rv); txXPathNodeUtils::getXSLTId(nodes->get(0), es->getSourceDocument(), strRes->mValue); *aResult = strRes; return NS_OK; } Expr::ResultType GenerateIdFunctionCall::getReturnType() { return STRING_RESULT; } bool GenerateIdFunctionCall::isSensitiveTo(ContextSensitivity aContext) { if (aContext & PRIVATE_CONTEXT) { return true; } if (mParams.IsEmpty()) { return !!(aContext & NODE_CONTEXT); } return argsSensitiveTo(aContext); } #ifdef TX_TO_STRING void GenerateIdFunctionCall::appendName(nsAString& aDest) { aDest.Append(nsGkAtoms::generateId->GetUTF16String()); } #endif