| Index: Source/core/dom/Document.cpp
|
| diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp
|
| index b4b03dc399c7a823140d09f506fff9e6541c712c..0b0414e3eb79e690c30ee739b46997a4b9003193 100644
|
| --- a/Source/core/dom/Document.cpp
|
| +++ b/Source/core/dom/Document.cpp
|
| @@ -509,8 +509,10 @@ Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC
|
| initSecurityContext(initializer);
|
| initDNSPrefetch();
|
|
|
| - for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); i++)
|
| +#if !ENABLE(OILPAN)
|
| + for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); ++i)
|
| m_nodeListCounts[i] = 0;
|
| +#endif
|
|
|
| InspectorCounters::incrementCounter(InspectorCounters::DocumentCounter);
|
|
|
| @@ -592,12 +594,12 @@ Document::~Document()
|
| // as well as Node. See a comment on TreeScope.h for the reason.
|
| if (hasRareData())
|
| clearRareData();
|
| -#endif
|
|
|
| - ASSERT(!m_listsInvalidatedAtDocument.size());
|
| + ASSERT(m_listsInvalidatedAtDocument.isEmpty());
|
|
|
| - for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); i++)
|
| + for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); ++i)
|
| ASSERT(!m_nodeListCounts[i]);
|
| +#endif
|
|
|
| setClient(0);
|
|
|
| @@ -3695,22 +3697,51 @@ void Document::setCSSTarget(Element* n)
|
| n->didAffectSelector(AffectedSelectorTarget);
|
| }
|
|
|
| -void Document::registerNodeList(LiveNodeListBase* list)
|
| +void Document::registerNodeList(const LiveNodeListBase* list)
|
| {
|
| +#if ENABLE(OILPAN)
|
| + m_nodeLists[list->invalidationType()].add(list);
|
| +#else
|
| m_nodeListCounts[list->invalidationType()]++;
|
| +#endif
|
| if (list->isRootedAtDocument())
|
| m_listsInvalidatedAtDocument.add(list);
|
| }
|
|
|
| -void Document::unregisterNodeList(LiveNodeListBase* list)
|
| +void Document::unregisterNodeList(const LiveNodeListBase* list)
|
| {
|
| +#if ENABLE(OILPAN)
|
| + ASSERT(m_nodeLists[list->invalidationType()].contains(list));
|
| + m_nodeLists[list->invalidationType()].remove(list);
|
| +#else
|
| m_nodeListCounts[list->invalidationType()]--;
|
| +#endif
|
| if (list->isRootedAtDocument()) {
|
| ASSERT(m_listsInvalidatedAtDocument.contains(list));
|
| m_listsInvalidatedAtDocument.remove(list);
|
| }
|
| }
|
|
|
| +void Document::registerNodeListWithIdNameCache(const LiveNodeListBase* list)
|
| +{
|
| +#if ENABLE(OILPAN)
|
| + m_nodeLists[InvalidateOnIdNameAttrChange].add(list);
|
| +#else
|
| + m_nodeListCounts[InvalidateOnIdNameAttrChange]++;
|
| +#endif
|
| +}
|
| +
|
| +void Document::unregisterNodeListWithIdNameCache(const LiveNodeListBase* list)
|
| +{
|
| +#if ENABLE(OILPAN)
|
| + ASSERT(m_nodeLists[InvalidateOnIdNameAttrChange].contains(list));
|
| + m_nodeLists[InvalidateOnIdNameAttrChange].remove(list);
|
| +#else
|
| + ASSERT(m_nodeListCounts[InvalidateOnIdNameAttrChange] > 0);
|
| + m_nodeListCounts[InvalidateOnIdNameAttrChange]--;
|
| +#endif
|
| +}
|
| +
|
| void Document::attachNodeIterator(NodeIterator* ni)
|
| {
|
| m_nodeIterators.add(ni);
|
| @@ -4514,63 +4545,63 @@ bool Document::hasSVGRootNode() const
|
| return isSVGSVGElement(documentElement());
|
| }
|
|
|
| -PassRefPtr<HTMLCollection> Document::ensureCachedCollection(CollectionType type)
|
| +PassRefPtrWillBeRawPtr<HTMLCollection> Document::ensureCachedCollection(CollectionType type)
|
| {
|
| return ensureRareData().ensureNodeLists().addCache<HTMLCollection>(*this, type);
|
| }
|
|
|
| -PassRefPtr<HTMLCollection> Document::images()
|
| +PassRefPtrWillBeRawPtr<HTMLCollection> Document::images()
|
| {
|
| return ensureCachedCollection(DocImages);
|
| }
|
|
|
| -PassRefPtr<HTMLCollection> Document::applets()
|
| +PassRefPtrWillBeRawPtr<HTMLCollection> Document::applets()
|
| {
|
| return ensureCachedCollection(DocApplets);
|
| }
|
|
|
| -PassRefPtr<HTMLCollection> Document::embeds()
|
| +PassRefPtrWillBeRawPtr<HTMLCollection> Document::embeds()
|
| {
|
| return ensureCachedCollection(DocEmbeds);
|
| }
|
|
|
| -PassRefPtr<HTMLCollection> Document::scripts()
|
| +PassRefPtrWillBeRawPtr<HTMLCollection> Document::scripts()
|
| {
|
| return ensureCachedCollection(DocScripts);
|
| }
|
|
|
| -PassRefPtr<HTMLCollection> Document::links()
|
| +PassRefPtrWillBeRawPtr<HTMLCollection> Document::links()
|
| {
|
| return ensureCachedCollection(DocLinks);
|
| }
|
|
|
| -PassRefPtr<HTMLCollection> Document::forms()
|
| +PassRefPtrWillBeRawPtr<HTMLCollection> Document::forms()
|
| {
|
| return ensureCachedCollection(DocForms);
|
| }
|
|
|
| -PassRefPtr<HTMLCollection> Document::anchors()
|
| +PassRefPtrWillBeRawPtr<HTMLCollection> Document::anchors()
|
| {
|
| return ensureCachedCollection(DocAnchors);
|
| }
|
|
|
| -PassRefPtr<HTMLAllCollection> Document::allForBinding()
|
| +PassRefPtrWillBeRawPtr<HTMLAllCollection> Document::allForBinding()
|
| {
|
| UseCounter::count(*this, UseCounter::DocumentAll);
|
| return all();
|
| }
|
|
|
| -PassRefPtr<HTMLAllCollection> Document::all()
|
| +PassRefPtrWillBeRawPtr<HTMLAllCollection> Document::all()
|
| {
|
| return ensureRareData().ensureNodeLists().addCache<HTMLAllCollection>(*this, DocAll);
|
| }
|
|
|
| -PassRefPtr<HTMLCollection> Document::windowNamedItems(const AtomicString& name)
|
| +PassRefPtrWillBeRawPtr<HTMLCollection> Document::windowNamedItems(const AtomicString& name)
|
| {
|
| return ensureRareData().ensureNodeLists().addCache<HTMLNameCollection>(*this, WindowNamedItems, name);
|
| }
|
|
|
| -PassRefPtr<HTMLCollection> Document::documentNamedItems(const AtomicString& name)
|
| +PassRefPtrWillBeRawPtr<HTMLCollection> Document::documentNamedItems(const AtomicString& name)
|
| {
|
| return ensureRareData().ensureNodeLists().addCache<HTMLNameCollection>(*this, DocumentNamedItems, name);
|
| }
|
| @@ -5648,27 +5679,29 @@ bool Document::hasFocus() const
|
| return false;
|
| }
|
|
|
| -template<unsigned type>
|
| -bool shouldInvalidateNodeListCachesForAttr(const unsigned nodeListCounts[], const QualifiedName& attrName)
|
| -{
|
| - if (nodeListCounts[type] && LiveNodeListBase::shouldInvalidateTypeOnAttributeChange(static_cast<NodeListInvalidationType>(type), attrName))
|
| - return true;
|
| - return shouldInvalidateNodeListCachesForAttr<type + 1>(nodeListCounts, attrName);
|
| -}
|
| -
|
| -template<>
|
| -bool shouldInvalidateNodeListCachesForAttr<numNodeListInvalidationTypes>(const unsigned[], const QualifiedName&)
|
| -{
|
| - return false;
|
| -}
|
| -
|
| bool Document::shouldInvalidateNodeListCaches(const QualifiedName* attrName) const
|
| {
|
| - if (attrName)
|
| - return shouldInvalidateNodeListCachesForAttr<DoNotInvalidateOnAttributeChanges + 1>(m_nodeListCounts, *attrName);
|
| + if (attrName) {
|
| + for (int type = 1; type < numNodeListInvalidationTypes; ++type) {
|
| +#if ENABLE(OILPAN)
|
| + if (m_nodeLists[type].isEmpty()) {
|
| +#else
|
| + if (!m_nodeListCounts[type]) {
|
| +#endif
|
| + continue;
|
| + }
|
| +
|
| + if (LiveNodeListBase::shouldInvalidateTypeOnAttributeChange(static_cast<NodeListInvalidationType>(type), *attrName))
|
| + return true;
|
| + }
|
| + }
|
|
|
| - for (int type = 0; type < numNodeListInvalidationTypes; type++) {
|
| + for (int type = 0; type < numNodeListInvalidationTypes; ++type) {
|
| +#if ENABLE(OILPAN)
|
| + if (!m_nodeLists[type].isEmpty())
|
| +#else
|
| if (m_nodeListCounts[type])
|
| +#endif
|
| return true;
|
| }
|
|
|
| @@ -5677,8 +5710,8 @@ bool Document::shouldInvalidateNodeListCaches(const QualifiedName* attrName) con
|
|
|
| void Document::invalidateNodeListCaches(const QualifiedName* attrName)
|
| {
|
| - HashSet<LiveNodeListBase*>::iterator end = m_listsInvalidatedAtDocument.end();
|
| - for (HashSet<LiveNodeListBase*>::iterator it = m_listsInvalidatedAtDocument.begin(); it != end; ++it)
|
| + WillBeHeapHashSet<RawPtrWillBeWeakMember<const LiveNodeListBase> >::const_iterator end = m_listsInvalidatedAtDocument.end();
|
| + for (WillBeHeapHashSet<RawPtrWillBeWeakMember<const LiveNodeListBase> >::const_iterator it = m_listsInvalidatedAtDocument.begin(); it != end; ++it)
|
| (*it)->invalidateCacheForAttribute(attrName);
|
| }
|
|
|
| @@ -5712,6 +5745,11 @@ void Document::trace(Visitor* visitor)
|
| visitor->trace(m_markers);
|
| visitor->trace(m_currentScriptStack);
|
| visitor->trace(m_transformSourceDocument);
|
| + visitor->trace(m_listsInvalidatedAtDocument);
|
| +#if ENABLE(OILPAN)
|
| + for (int i = 0; i < numNodeListInvalidationTypes; ++i)
|
| + visitor->trace(m_nodeLists[i]);
|
| +#endif
|
| visitor->trace(m_cssCanvasElements);
|
| visitor->trace(m_topLayerElements);
|
| visitor->trace(m_elemSheet);
|
|
|