Bug 470455 - test_database_sync_embed_visits.js leaks, r=sdwilsh
[wine-gecko.git] / content / xul / templates / src / nsXULTemplateResultRDF.cpp
blobc329773a63364dc91d2333ca350be0cc4f009cc0
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
13 * License.
15 * The Original Code is mozilla.org code.
17 * The Initial Developer of the Original Code is Neil Deakin
18 * Portions created by the Initial Developer are Copyright (C) 2005
19 * the Initial Developer. All Rights Reserved.
21 * Contributor(s):
23 * Alternatively, the contents of this file may be used under the terms of
24 * either of the GNU General Public License Version 2 or later (the "GPL"),
25 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
35 * ***** END LICENSE BLOCK ***** */
37 #include "nsXULTemplateResultRDF.h"
38 #include "nsXULContentUtils.h"
40 // XXXndeakin for some reason, making this class have classinfo breaks trees.
41 //#include "nsIDOMClassInfo.h"
43 NS_IMPL_CYCLE_COLLECTION_1(nsXULTemplateResultRDF, mQuery)
45 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsXULTemplateResultRDF)
46 NS_INTERFACE_MAP_ENTRY(nsIXULTemplateResult)
47 NS_INTERFACE_MAP_ENTRY(nsISupports)
48 NS_INTERFACE_MAP_END
50 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsXULTemplateResultRDF)
51 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsXULTemplateResultRDF)
53 nsXULTemplateResultRDF::nsXULTemplateResultRDF(nsIRDFResource* aNode)
54 : mQuery(nsnull),
55 mNode(aNode)
59 nsXULTemplateResultRDF::nsXULTemplateResultRDF(nsRDFQuery* aQuery,
60 const Instantiation& aInst,
61 nsIRDFResource *aNode)
62 : mQuery(aQuery),
63 mNode(aNode),
64 mInst(aInst)
68 nsXULTemplateResultRDF::~nsXULTemplateResultRDF()
72 NS_IMETHODIMP
73 nsXULTemplateResultRDF::GetIsContainer(PRBool* aIsContainer)
75 *aIsContainer = PR_FALSE;
77 if (mNode) {
78 nsXULTemplateQueryProcessorRDF* processor = GetProcessor();
79 if (processor)
80 return processor->CheckContainer(mNode, aIsContainer);
83 return NS_OK;
86 NS_IMETHODIMP
87 nsXULTemplateResultRDF::GetIsEmpty(PRBool* aIsEmpty)
89 *aIsEmpty = PR_TRUE;
91 if (mNode) {
92 nsXULTemplateQueryProcessorRDF* processor = GetProcessor();
93 if (processor)
94 return processor->CheckEmpty(mNode, aIsEmpty);
97 return NS_OK;
100 NS_IMETHODIMP
101 nsXULTemplateResultRDF::GetMayProcessChildren(PRBool* aMayProcessChildren)
103 // RDF always allows recursion
104 *aMayProcessChildren = PR_TRUE;
105 return NS_OK;
108 NS_IMETHODIMP
109 nsXULTemplateResultRDF::GetId(nsAString& aId)
111 if (! mNode)
112 return NS_ERROR_FAILURE;
114 const char* uri;
115 mNode->GetValueConst(&uri);
117 CopyUTF8toUTF16(uri, aId);
119 return NS_OK;
122 NS_IMETHODIMP
123 nsXULTemplateResultRDF::GetResource(nsIRDFResource** aResource)
125 *aResource = mNode;
126 NS_IF_ADDREF(*aResource);
127 return NS_OK;
130 NS_IMETHODIMP
131 nsXULTemplateResultRDF::GetType(nsAString& aType)
133 aType.Truncate();
135 nsresult rv = NS_OK;
137 nsXULTemplateQueryProcessorRDF* processor = GetProcessor();
138 if (processor) {
139 PRBool found;
140 rv = processor->CheckIsSeparator(mNode, &found);
141 if (NS_SUCCEEDED(rv) && found)
142 aType.AssignLiteral("separator");
145 return rv;
148 NS_IMETHODIMP
149 nsXULTemplateResultRDF::GetBindingFor(nsIAtom* aVar, nsAString& aValue)
151 nsCOMPtr<nsIRDFNode> val;
152 GetAssignment(aVar, getter_AddRefs(val));
154 return nsXULContentUtils::GetTextForNode(val, aValue);
157 NS_IMETHODIMP
158 nsXULTemplateResultRDF::GetBindingObjectFor(nsIAtom* aVar, nsISupports** aValue)
160 GetAssignment(aVar, (nsIRDFNode **)aValue);
162 return NS_OK;
165 NS_IMETHODIMP
166 nsXULTemplateResultRDF::RuleMatched(nsISupports* aQuery, nsIDOMNode* aRuleNode)
168 // when a rule matches, set the bindings that must be used.
169 nsXULTemplateQueryProcessorRDF* processor = GetProcessor();
170 if (processor) {
171 RDFBindingSet* bindings = processor->GetBindingsForRule(aRuleNode);
172 if (bindings) {
173 nsresult rv = mBindingValues.SetBindingSet(bindings);
174 if (NS_FAILED(rv))
175 return rv;
177 bindings->AddDependencies(mNode, this);
181 return NS_OK;
184 NS_IMETHODIMP
185 nsXULTemplateResultRDF::HasBeenRemoved()
187 // when a result is no longer used, clean up the dependencies and
188 // memory elements that refer to it
189 mBindingValues.RemoveDependencies(mNode, this);
191 nsXULTemplateQueryProcessorRDF* processor = GetProcessor();
192 if (processor)
193 processor->RemoveMemoryElements(mInst, this);
195 return NS_OK;
199 void
200 nsXULTemplateResultRDF::GetAssignment(nsIAtom* aVar, nsIRDFNode** aValue)
202 // look up a variable in the assignments map
203 *aValue = nsnull;
204 mInst.mAssignments.GetAssignmentFor(aVar, aValue);
206 // if not found, look up the variable in the bindings
207 if (! *aValue)
208 mBindingValues.GetAssignmentFor(this, aVar, aValue);
212 PRBool
213 nsXULTemplateResultRDF::SyncAssignments(nsIRDFResource* aSubject,
214 nsIRDFResource* aPredicate,
215 nsIRDFNode* aTarget)
217 // synchronize the bindings when an assertion is added or removed
218 RDFBindingSet* bindingset = mBindingValues.GetBindingSet();
219 if (bindingset) {
220 return bindingset->SyncAssignments(aSubject, aPredicate, aTarget,
221 (aSubject == mNode) ? mQuery->GetMemberVariable() : nsnull,
222 this, mBindingValues);
225 return PR_FALSE;
228 PRBool
229 nsXULTemplateResultRDF::HasMemoryElement(const MemoryElement& aMemoryElement)
231 MemoryElementSet::ConstIterator last = mInst.mSupport.Last();
232 for (MemoryElementSet::ConstIterator element = mInst.mSupport.First();
233 element != last; ++element) {
234 if ((*element).Equals(aMemoryElement))
235 return PR_TRUE;
238 return PR_FALSE;