diff -r 000000000000 -r 6474c204b198 content/xul/templates/src/nsContentSupportMap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/xul/templates/src/nsContentSupportMap.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,70 @@ +/* -*- 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 "pldhash.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() { Init(); } + ~nsContentSupportMap() { Finish(); } + + nsresult Put(nsIContent* aElement, nsTemplateMatch* aMatch) { + if (!mMap.ops) + return NS_ERROR_NOT_INITIALIZED; + + PLDHashEntryHdr* hdr = PL_DHashTableOperate(&mMap, aElement, PL_DHASH_ADD); + if (!hdr) + return NS_ERROR_OUT_OF_MEMORY; + + Entry* entry = reinterpret_cast(hdr); + NS_ASSERTION(entry->mMatch == nullptr, "over-writing entry"); + entry->mContent = aElement; + entry->mMatch = aMatch; + return NS_OK; } + + bool Get(nsIContent* aElement, nsTemplateMatch** aMatch) { + if (!mMap.ops) + return false; + + PLDHashEntryHdr* hdr = PL_DHashTableOperate(&mMap, aElement, PL_DHASH_LOOKUP); + if (PL_DHASH_ENTRY_IS_FREE(hdr)) + return false; + + Entry* entry = reinterpret_cast(hdr); + *aMatch = entry->mMatch; + return true; } + + nsresult Remove(nsIContent* aElement); + + void Clear() { Finish(); Init(); } + +protected: + PLDHashTable mMap; + + void Init(); + void Finish(); + + struct Entry { + PLDHashEntryHdr mHdr; + nsIContent* mContent; + nsTemplateMatch* mMatch; + }; +}; + +#endif