зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1444580: Devirtualize GetRootElementInternal, and move nsINode overrides to nsIDocument. r=smaug
MozReview-Commit-ID: IlgHXhETOIa
This commit is contained in:
Родитель
f73bf76b95
Коммит
288a10bc0b
|
@ -4184,9 +4184,9 @@ nsIDocument::FindContentForSubDocument(nsIDocument *aDocument) const
|
|||
}
|
||||
|
||||
bool
|
||||
nsDocument::IsNodeOfType(uint32_t aFlags) const
|
||||
nsIDocument::IsNodeOfType(uint32_t aFlags) const
|
||||
{
|
||||
return !(aFlags & ~eDOCUMENT);
|
||||
return !(aFlags & ~eDOCUMENT);
|
||||
}
|
||||
|
||||
Element*
|
||||
|
@ -4203,7 +4203,7 @@ nsIDocument::GetUnfocusedKeyEventTarget()
|
|||
}
|
||||
|
||||
Element*
|
||||
nsDocument::GetRootElementInternal() const
|
||||
nsIDocument::GetRootElementInternal() const
|
||||
{
|
||||
// We invoke GetRootElement() immediately before the servo traversal, so we
|
||||
// should always have a cache hit from Servo.
|
||||
|
@ -4215,36 +4215,19 @@ nsDocument::GetRootElementInternal() const
|
|||
for (i = mChildren.ChildCount(); i > 0; --i) {
|
||||
nsIContent* child = mChildren.ChildAt(i - 1);
|
||||
if (child->IsElement()) {
|
||||
const_cast<nsDocument*>(this)->mCachedRootElement = child->AsElement();
|
||||
const_cast<nsIDocument*>(this)->mCachedRootElement = child->AsElement();
|
||||
return child->AsElement();
|
||||
}
|
||||
}
|
||||
|
||||
const_cast<nsDocument*>(this)->mCachedRootElement = nullptr;
|
||||
const_cast<nsIDocument*>(this)->mCachedRootElement = nullptr;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsIContent *
|
||||
nsDocument::GetChildAt_Deprecated(uint32_t aIndex) const
|
||||
{
|
||||
return mChildren.GetSafeChildAt(aIndex);
|
||||
}
|
||||
|
||||
int32_t
|
||||
nsDocument::ComputeIndexOf(const nsINode* aPossibleChild) const
|
||||
{
|
||||
return mChildren.IndexOfChild(aPossibleChild);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
nsDocument::GetChildCount() const
|
||||
{
|
||||
return mChildren.ChildCount();
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDocument::InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
|
||||
bool aNotify)
|
||||
nsIDocument::InsertChildBefore(nsIContent* aKid,
|
||||
nsIContent* aBeforeThis,
|
||||
bool aNotify)
|
||||
{
|
||||
if (aKid->IsElement() && GetRootElement()) {
|
||||
NS_WARNING("Inserting root element when we already have one");
|
||||
|
@ -4258,8 +4241,9 @@ nsDocument::InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
|
|||
}
|
||||
|
||||
nsresult
|
||||
nsDocument::InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
|
||||
bool aNotify)
|
||||
nsIDocument::InsertChildAt_Deprecated(nsIContent* aKid,
|
||||
uint32_t aIndex,
|
||||
bool aNotify)
|
||||
{
|
||||
if (aKid->IsElement() && GetRootElement()) {
|
||||
NS_WARNING("Inserting root element when we already have one");
|
||||
|
@ -4270,7 +4254,7 @@ nsDocument::InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
|
|||
}
|
||||
|
||||
void
|
||||
nsDocument::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
|
||||
nsIDocument::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
|
||||
{
|
||||
nsCOMPtr<nsIContent> oldKid = GetChildAt_Deprecated(aIndex);
|
||||
if (!oldKid) {
|
||||
|
@ -4297,7 +4281,7 @@ nsDocument::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
|
|||
}
|
||||
|
||||
void
|
||||
nsDocument::RemoveChildNode(nsIContent* aKid, bool aNotify)
|
||||
nsIDocument::RemoveChildNode(nsIContent* aKid, bool aNotify)
|
||||
{
|
||||
if (aKid->IsElement()) {
|
||||
// Destroy the link map up front before we mess with the child list.
|
||||
|
@ -8763,7 +8747,7 @@ nsDocument::MutationEventDispatched(nsINode* aTarget)
|
|||
}
|
||||
|
||||
void
|
||||
nsDocument::DestroyElementMaps()
|
||||
nsIDocument::DestroyElementMaps()
|
||||
{
|
||||
#ifdef DEBUG
|
||||
mStyledLinksCleared = true;
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
#include "nsIApplicationCacheContainer.h"
|
||||
#include "mozilla/StyleSetHandle.h"
|
||||
#include "PLDHashTable.h"
|
||||
#include "nsAttrAndChildArray.h"
|
||||
#include "nsDOMAttributeMap.h"
|
||||
#include "nsIContentViewer.h"
|
||||
#include "nsIInterfaceRequestor.h"
|
||||
|
@ -369,8 +368,6 @@ public:
|
|||
return mTimelines;
|
||||
}
|
||||
|
||||
virtual Element* GetRootElementInternal() const override;
|
||||
|
||||
virtual nsIChannel* GetChannel() const override {
|
||||
return mChannel;
|
||||
}
|
||||
|
@ -407,23 +404,6 @@ public:
|
|||
virtual void WillDispatchMutationEvent(nsINode* aTarget) override;
|
||||
virtual void MutationEventDispatched(nsINode* aTarget) override;
|
||||
|
||||
// nsINode
|
||||
virtual bool IsNodeOfType(uint32_t aFlags) const override;
|
||||
virtual nsIContent *GetChildAt_Deprecated(uint32_t aIndex) const override;
|
||||
virtual int32_t ComputeIndexOf(const nsINode* aPossibleChild) const override;
|
||||
virtual uint32_t GetChildCount() const override;
|
||||
virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
|
||||
bool aNotify) override;
|
||||
virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
|
||||
bool aNotify) override;
|
||||
virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
|
||||
virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
|
||||
virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
|
||||
bool aPreallocateChildren) const override
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
// nsIRadioGroupContainer
|
||||
NS_IMETHOD WalkRadioGroup(const nsAString& aName,
|
||||
nsIRadioVisitor* aVisitor,
|
||||
|
@ -695,10 +675,6 @@ protected:
|
|||
NotNull<const Encoding*>& aEncoding,
|
||||
nsHtml5TreeOpExecutor* aExecutor);
|
||||
|
||||
// Call this before the document does something that will unbind all content.
|
||||
// That will stop us from doing a lot of work as each element is removed.
|
||||
void DestroyElementMaps();
|
||||
|
||||
nsIContent* GetFirstBaseNodeWithHref();
|
||||
nsresult SetFirstBaseNodeWithHref(nsIContent *node);
|
||||
|
||||
|
@ -735,9 +711,6 @@ protected:
|
|||
|
||||
void EnsureOnloadBlocker();
|
||||
|
||||
// Array of owning references to all children
|
||||
nsAttrAndChildArray mChildren;
|
||||
|
||||
// Tracker for animations that are waiting to start.
|
||||
// nullptr until GetOrCreatePendingAnimationTracker is called.
|
||||
RefPtr<mozilla::PendingAnimationTracker> mPendingAnimationTracker;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include "jsfriendapi.h"
|
||||
#include "mozilla/FlushType.h" // for enum
|
||||
#include "nsAttrAndChildArray.h"
|
||||
#include "nsAutoPtr.h" // for member
|
||||
#include "nsCOMArray.h" // for member
|
||||
#include "nsCompatibility.h" // for member
|
||||
|
@ -336,6 +337,36 @@ public:
|
|||
virtual void SetSuppressParserErrorConsoleMessages(bool aSuppress) {}
|
||||
virtual bool SuppressParserErrorConsoleMessages() { return false; }
|
||||
|
||||
// nsINode
|
||||
bool IsNodeOfType(uint32_t aFlags) const final;
|
||||
nsIContent* GetChildAt_Deprecated(uint32_t aIndex) const final
|
||||
{
|
||||
return mChildren.GetSafeChildAt(aIndex);
|
||||
}
|
||||
|
||||
int32_t ComputeIndexOf(const nsINode* aPossibleChild) const final
|
||||
{
|
||||
return mChildren.IndexOfChild(aPossibleChild);
|
||||
}
|
||||
|
||||
uint32_t GetChildCount() const final
|
||||
{
|
||||
return mChildren.ChildCount();
|
||||
}
|
||||
|
||||
nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
|
||||
bool aNotify) override;
|
||||
nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
|
||||
bool aNotify) override;
|
||||
void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) final;
|
||||
void RemoveChildNode(nsIContent* aKid, bool aNotify) final;
|
||||
nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo,
|
||||
nsINode **aResult,
|
||||
bool aPreallocateChildren) const override
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Signal that the document title may have changed
|
||||
* (see nsDocument::GetTitle).
|
||||
|
@ -1180,7 +1211,11 @@ public:
|
|||
mozilla::Maybe<mozilla::dom::ServiceWorkerDescriptor> GetController() const;
|
||||
|
||||
protected:
|
||||
virtual Element* GetRootElementInternal() const = 0;
|
||||
// Call this before the document does something that will unbind all content.
|
||||
// That will stop us from doing a lot of work as each element is removed.
|
||||
void DestroyElementMaps();
|
||||
|
||||
Element* GetRootElementInternal() const;
|
||||
void DoNotifyPossibleTitleChange();
|
||||
|
||||
void SetPageUnloadingEventTimeStamp()
|
||||
|
@ -4075,6 +4110,9 @@ protected:
|
|||
// A set of responsive images keyed by address pointer.
|
||||
nsTHashtable<nsPtrHashKey<mozilla::dom::HTMLImageElement>> mResponsiveContent;
|
||||
|
||||
// Array of owning references to all children
|
||||
nsAttrAndChildArray mChildren;
|
||||
|
||||
public:
|
||||
js::ExpandoAndGeneration mExpandoAndGeneration;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче