diff -r 000000000000 -r 6474c204b198 content/xul/templates/src/nsContentTestNode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/xul/templates/src/nsContentTestNode.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* 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 "nsContentTestNode.h" +#include "nsIRDFResource.h" +#include "nsIAtom.h" +#include "nsIDOMElement.h" +#include "nsXULContentUtils.h" +#include "nsIXULTemplateResult.h" +#include "nsIXULTemplateBuilder.h" +#include "nsXULTemplateQueryProcessorRDF.h" + +#include "prlog.h" +#ifdef PR_LOGGING +extern PRLogModuleInfo* gXULTemplateLog; +#endif + +nsContentTestNode::nsContentTestNode(nsXULTemplateQueryProcessorRDF* aProcessor, + nsIAtom* aRefVariable) + : TestNode(nullptr), + mProcessor(aProcessor), + mDocument(nullptr), + mRefVariable(aRefVariable), + mTag(nullptr) +{ +#ifdef PR_LOGGING + if (PR_LOG_TEST(gXULTemplateLog, PR_LOG_DEBUG)) { + nsAutoString tag(NS_LITERAL_STRING("(none)")); + if (mTag) + mTag->ToString(tag); + + nsAutoString refvar(NS_LITERAL_STRING("(none)")); + if (aRefVariable) + aRefVariable->ToString(refvar); + + PR_LOG(gXULTemplateLog, PR_LOG_DEBUG, + ("nsContentTestNode[%p]: ref-var=%s tag=%s", + this, NS_ConvertUTF16toUTF8(refvar).get(), + NS_ConvertUTF16toUTF8(tag).get())); + } +#endif +} + +nsresult +nsContentTestNode::FilterInstantiations(InstantiationSet& aInstantiations, + bool* aCantHandleYet) const + +{ + if (aCantHandleYet) + *aCantHandleYet = false; + return NS_OK; +} + +nsresult +nsContentTestNode::Constrain(InstantiationSet& aInstantiations) +{ + // contrain the matches to those that have matched in the template builder + + nsIXULTemplateBuilder* builder = mProcessor->GetBuilder(); + if (!builder) { + aInstantiations.Clear(); + return NS_OK; + } + + nsresult rv; + + InstantiationSet::Iterator last = aInstantiations.Last(); + for (InstantiationSet::Iterator inst = aInstantiations.First(); inst != last; ++inst) { + + nsCOMPtr refValue; + bool hasRefBinding = inst->mAssignments.GetAssignmentFor(mRefVariable, + getter_AddRefs(refValue)); + if (hasRefBinding) { + nsCOMPtr refResource = do_QueryInterface(refValue); + if (refResource) { + bool generated; + rv = builder->HasGeneratedContent(refResource, mTag, &generated); + if (NS_FAILED(rv)) return rv; + + if (generated) + continue; + } + } + + aInstantiations.Erase(inst--); + } + + return NS_OK; +}