gecko-dev/dom/xul/templates/nsContentSupportMap.h
Nicholas Nethercote 3a7b0a9f57 Bug 1131901 (part 1) - Make PL_DHashTableAdd() infallible by default, and add a fallible alternative. r=froydnj.
I kept all the existing PL_DHashTableAdd() calls fallible, in order to be
conservative, except for the ones in nsAtomTable.cpp which already were
followed immediately by an abort on failure.

--HG--
extra : rebase_source : 526d96ab65e4d7d71197b90d086d19fbdd79b7b5
2015-02-02 14:48:58 -08:00

73 lines
2.2 KiB
C++

/* -*- 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.IsInitialized())
return NS_ERROR_NOT_INITIALIZED;
PLDHashEntryHdr* hdr =
PL_DHashTableAdd(&mMap, 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) {
if (!mMap.IsInitialized())
return false;
PLDHashEntryHdr* hdr = PL_DHashTableSearch(&mMap, aElement);
if (!hdr)
return false;
Entry* entry = static_cast<Entry*>(hdr);
*aMatch = entry->mMatch;
return true;
}
nsresult Remove(nsIContent* aElement);
void Clear() { Finish(); Init(); }
protected:
PLDHashTable mMap;
void Init();
void Finish();
struct Entry : public PLDHashEntryHdr {
nsIContent* mContent;
nsTemplateMatch* mMatch;
};
};
#endif