зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1392891 - Part 1: Make it possible to create nsContentList objects that don't observe DOM mutations; r=smaug
This commit is contained in:
Родитель
ebaa749322
Коммит
d4f7cc1e85
|
@ -422,7 +422,8 @@ nsContentList::nsContentList(nsINode* aRootNode,
|
|||
int32_t aMatchNameSpaceId,
|
||||
nsIAtom* aHTMLMatchAtom,
|
||||
nsIAtom* aXMLMatchAtom,
|
||||
bool aDeep)
|
||||
bool aDeep,
|
||||
bool aLiveList)
|
||||
: nsBaseContentList(),
|
||||
mRootNode(aRootNode),
|
||||
mMatchNameSpaceId(aMatchNameSpaceId),
|
||||
|
@ -434,7 +435,8 @@ nsContentList::nsContentList(nsINode* aRootNode,
|
|||
mState(LIST_DIRTY),
|
||||
mDeep(aDeep),
|
||||
mFuncMayDependOnAttr(false),
|
||||
mIsHTMLDocument(aRootNode->OwnerDoc()->IsHTMLDocument())
|
||||
mIsHTMLDocument(aRootNode->OwnerDoc()->IsHTMLDocument()),
|
||||
mIsLiveList(aLiveList)
|
||||
{
|
||||
NS_ASSERTION(mRootNode, "Must have root");
|
||||
if (nsGkAtoms::_asterisk == mHTMLMatchAtom) {
|
||||
|
@ -444,7 +446,9 @@ nsContentList::nsContentList(nsINode* aRootNode,
|
|||
else {
|
||||
mMatchAll = false;
|
||||
}
|
||||
mRootNode->AddMutationObserver(this);
|
||||
if (mIsLiveList) {
|
||||
mRootNode->AddMutationObserver(this);
|
||||
}
|
||||
|
||||
// We only need to flush if we're in an non-HTML document, since the
|
||||
// HTML5 parser doesn't need flushing. Further, if we're not in a
|
||||
|
@ -462,7 +466,8 @@ nsContentList::nsContentList(nsINode* aRootNode,
|
|||
bool aDeep,
|
||||
nsIAtom* aMatchAtom,
|
||||
int32_t aMatchNameSpaceId,
|
||||
bool aFuncMayDependOnAttr)
|
||||
bool aFuncMayDependOnAttr,
|
||||
bool aLiveList)
|
||||
: nsBaseContentList(),
|
||||
mRootNode(aRootNode),
|
||||
mMatchNameSpaceId(aMatchNameSpaceId),
|
||||
|
@ -475,10 +480,13 @@ nsContentList::nsContentList(nsINode* aRootNode,
|
|||
mMatchAll(false),
|
||||
mDeep(aDeep),
|
||||
mFuncMayDependOnAttr(aFuncMayDependOnAttr),
|
||||
mIsHTMLDocument(false)
|
||||
mIsHTMLDocument(false),
|
||||
mIsLiveList(aLiveList)
|
||||
{
|
||||
NS_ASSERTION(mRootNode, "Must have root");
|
||||
mRootNode->AddMutationObserver(this);
|
||||
if (mIsLiveList) {
|
||||
mRootNode->AddMutationObserver(this);
|
||||
}
|
||||
|
||||
// We only need to flush if we're in an non-HTML document, since the
|
||||
// HTML5 parser doesn't need flushing. Further, if we're not in a
|
||||
|
@ -492,7 +500,7 @@ nsContentList::nsContentList(nsINode* aRootNode,
|
|||
nsContentList::~nsContentList()
|
||||
{
|
||||
RemoveFromHashtable();
|
||||
if (mRootNode) {
|
||||
if (mIsLiveList && mRootNode) {
|
||||
mRootNode->RemoveMutationObserver(this);
|
||||
}
|
||||
|
||||
|
@ -646,7 +654,7 @@ void
|
|||
nsContentList::LastRelease()
|
||||
{
|
||||
RemoveFromCaches();
|
||||
if (mRootNode) {
|
||||
if (mIsLiveList && mRootNode) {
|
||||
mRootNode->RemoveMutationObserver(this);
|
||||
mRootNode = nullptr;
|
||||
}
|
||||
|
@ -1246,6 +1254,7 @@ nsLabelsNodeList::MaybeResetRoot(nsINode* aRootNode)
|
|||
return;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(mIsLiveList, "nsLabelsNodeList is always a live list");
|
||||
if (mRootNode) {
|
||||
mRootNode->RemoveMutationObserver(this);
|
||||
}
|
||||
|
|
|
@ -251,8 +251,8 @@ struct nsContentListKey
|
|||
#define LIST_LAZY 2
|
||||
|
||||
/**
|
||||
* Class that implements a live NodeList that matches Elements in the
|
||||
* tree based on some criterion.
|
||||
* Class that implements a possibly live NodeList that matches Elements
|
||||
* in the tree based on some criterion.
|
||||
*/
|
||||
class nsContentList : public nsBaseContentList,
|
||||
public nsIHTMLCollection,
|
||||
|
@ -276,12 +276,15 @@ public:
|
|||
* @param aDeep If false, then look only at children of the root, nothing
|
||||
* deeper. If true, then look at the whole subtree rooted at
|
||||
* our root.
|
||||
* @param aLiveList Whether the created list should be a live list observing
|
||||
* mutations to the DOM tree.
|
||||
*/
|
||||
nsContentList(nsINode* aRootNode,
|
||||
int32_t aMatchNameSpaceId,
|
||||
nsIAtom* aHTMLMatchAtom,
|
||||
nsIAtom* aXMLMatchAtom,
|
||||
bool aDeep = true);
|
||||
bool aDeep = true,
|
||||
bool aLiveList = true);
|
||||
|
||||
/**
|
||||
* @param aRootNode The node under which to limit our search.
|
||||
|
@ -298,6 +301,8 @@ public:
|
|||
* @param aMatchNameSpaceId a namespace id to be passed back to aFunc
|
||||
* @param aFuncMayDependOnAttr a boolean that indicates whether this list is
|
||||
* sensitive to attribute changes.
|
||||
* @param aLiveList Whether the created list should be a live list observing
|
||||
* mutations to the DOM tree.
|
||||
*/
|
||||
nsContentList(nsINode* aRootNode,
|
||||
nsContentListMatchFunc aFunc,
|
||||
|
@ -306,7 +311,8 @@ public:
|
|||
bool aDeep = true,
|
||||
nsIAtom* aMatchAtom = nullptr,
|
||||
int32_t aMatchNameSpaceId = kNameSpaceID_None,
|
||||
bool aFuncMayDependOnAttr = true);
|
||||
bool aFuncMayDependOnAttr = true,
|
||||
bool aLiveList = true);
|
||||
|
||||
// nsWrapperCache
|
||||
using nsWrapperCache::GetWrapperPreserveColor;
|
||||
|
@ -517,6 +523,10 @@ protected:
|
|||
* when doing function matching, always false otherwise.
|
||||
*/
|
||||
uint8_t mIsHTMLDocument : 1;
|
||||
/**
|
||||
* Whether the list observes mutations to the DOM tree.
|
||||
*/
|
||||
const uint8_t mIsLiveList : 1;
|
||||
|
||||
#ifdef DEBUG_CONTENT_LIST
|
||||
void AssertInSync();
|
||||
|
|
Загрузка…
Ссылка в новой задаче