diff options
Diffstat (limited to 'dom/xul/templates/nsContentSupportMap.h')
-rw-r--r-- | dom/xul/templates/nsContentSupportMap.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/dom/xul/templates/nsContentSupportMap.h b/dom/xul/templates/nsContentSupportMap.h new file mode 100644 index 000000000..aef7de83e --- /dev/null +++ b/dom/xul/templates/nsContentSupportMap.h @@ -0,0 +1,62 @@ +/* -*- 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/. */ + +#ifndef nsContentSupportMap_h__ +#define nsContentSupportMap_h__ + +#include "PLDHashTable.h" +#include "nsTemplateMatch.h" + +/** + * The nsContentSupportMap maintains a mapping from a "resource element" + * in the content tree to the nsTemplateMatch that was used to instantiate it. This + * is necessary to allow the XUL content to be built lazily. Specifically, + * when building "resumes" on a partially-built content element, the builder + * will walk upwards in the content tree to find the first element with an + * 'id' attribute. This element is assumed to be the "resource element", + * and allows the content builder to access the nsTemplateMatch (variable assignments + * and rule information). + */ +class nsContentSupportMap { +public: + nsContentSupportMap() : mMap(PLDHashTable::StubOps(), sizeof(Entry)) { } + ~nsContentSupportMap() { } + + nsresult Put(nsIContent* aElement, nsTemplateMatch* aMatch) { + PLDHashEntryHdr* hdr = mMap.Add(aElement, mozilla::fallible); + if (!hdr) + return NS_ERROR_OUT_OF_MEMORY; + + Entry* entry = static_cast<Entry*>(hdr); + NS_ASSERTION(entry->mMatch == nullptr, "over-writing entry"); + entry->mContent = aElement; + entry->mMatch = aMatch; + return NS_OK; + } + + bool Get(nsIContent* aElement, nsTemplateMatch** aMatch) { + PLDHashEntryHdr* hdr = mMap.Search(aElement); + if (!hdr) + return false; + + Entry* entry = static_cast<Entry*>(hdr); + *aMatch = entry->mMatch; + return true; + } + + void Remove(nsIContent* aElement); + + void Clear() { mMap.Clear(); } + +protected: + PLDHashTable mMap; + + struct Entry : public PLDHashEntryHdr { + nsIContent* mContent; + nsTemplateMatch* mMatch; + }; +}; + +#endif |