Bug 1444580: Devirtualize a few other things. r=smaug
SetScriptHandlingObject / GetScopeObject / GetWindowInternal /
GetScriptHandlingObjectInternal / GetScriptHandlingObject
MozReview-Commit-ID: Bx7cCo7wc0Y
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -4692,24 +4692,24 @@ nsIDocument::RemoveAdditionalStyleSheet(
NotifyStyleSheetRemoved(sheetRef, false);
EndUpdate(UPDATE_STYLE);
sheetRef->ClearAssociatedDocument();
}
}
nsIGlobalObject*
-nsDocument::GetScopeObject() const
+nsIDocument::GetScopeObject() const
{
nsCOMPtr<nsIGlobalObject> scope(do_QueryReferent(mScopeObject));
return scope;
}
void
-nsDocument::SetScopeObject(nsIGlobalObject* aGlobal)
+nsIDocument::SetScopeObject(nsIGlobalObject* aGlobal)
{
mScopeObject = do_GetWeakReference(aGlobal);
if (aGlobal) {
mHasHadScriptHandlingObject = true;
nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal);
if (window) {
// We want to get the tabgroup unconditionally, such that we can make
@@ -5004,17 +5004,17 @@ nsDocument::SetScriptGlobalObject(nsIScr
return;
}
mMaybeServiceWorkerControlled = true;
}
}
nsIScriptGlobalObject*
-nsDocument::GetScriptHandlingObjectInternal() const
+nsIDocument::GetScriptHandlingObjectInternal() const
{
MOZ_ASSERT(!mScriptGlobalObject,
"Do not call this when mScriptGlobalObject is set!");
if (mHasHadDefaultView) {
return nullptr;
}
nsCOMPtr<nsIScriptGlobalObject> scriptHandlingObject =
@@ -5025,29 +5025,29 @@ nsDocument::GetScriptHandlingObjectInter
if (!outer || outer->GetCurrentInnerWindow() != win) {
NS_WARNING("Wrong inner/outer window combination!");
return nullptr;
}
}
return scriptHandlingObject;
}
void
-nsDocument::SetScriptHandlingObject(nsIScriptGlobalObject* aScriptObject)
+nsIDocument::SetScriptHandlingObject(nsIScriptGlobalObject* aScriptObject)
{
NS_ASSERTION(!mScriptGlobalObject ||
mScriptGlobalObject == aScriptObject,
"Wrong script object!");
if (aScriptObject) {
SetScopeObject(aScriptObject);
mHasHadDefaultView = false;
}
}
nsPIDOMWindowOuter*
-nsDocument::GetWindowInternal() const
+nsIDocument::GetWindowInternal() const
{
MOZ_ASSERT(!mWindow, "This should not be called when mWindow is not null!");
// Let's use mScriptGlobalObject. Even if the document is already removed from
// the docshell, the outer window might be still obtainable from the it.
nsCOMPtr<nsPIDOMWindowOuter> win;
if (mRemovedFromDocShell) {
// The docshell returns the outer window we are done.
nsCOMPtr<nsIDocShell> kungFuDeathGrip(mDocumentContainer);
--- a/dom/base/nsDocument.h
+++ b/dom/base/nsDocument.h
@@ -380,20 +380,16 @@ public:
return mFailedChannel;
}
virtual void SetFailedChannel(nsIChannel* aChannel) override {
mFailedChannel = aChannel;
}
virtual void SetScriptGlobalObject(nsIScriptGlobalObject* aGlobalObject) override;
- virtual void SetScriptHandlingObject(nsIScriptGlobalObject* aScriptObject) override;
-
- virtual nsIGlobalObject* GetScopeObject() const override;
- void SetScopeObject(nsIGlobalObject* aGlobal) override;
/**
* Get the script loader for this document
*/
virtual mozilla::dom::ScriptLoader* ScriptLoader() override;
/**
* Add/Remove an element to the document's id and name hashes
*/
@@ -820,19 +816,16 @@ public:
bool ContainsMSEContent();
protected:
void DispatchPageTransition(mozilla::dom::EventTarget* aDispatchTarget,
const nsAString& aType,
bool aPersisted);
- virtual nsPIDOMWindowOuter* GetWindowInternal() const override;
- virtual nsIScriptGlobalObject* GetScriptHandlingObjectInternal() const override;
-
void UpdateScreenOrientation();
#define NS_DOCUMENT_NOTIFY_OBSERVERS(func_, params_) do { \
NS_OBSERVER_ARRAY_NOTIFY_XPCOM_OBSERVERS(mObservers, nsIDocumentObserver, \
func_, params_); \
/* FIXME(emilio): Apparently we can keep observing from the BFCache? That \
looks bogus. */ \
if (nsIPresShell* shell = GetObservingShell()) { \
@@ -860,21 +853,16 @@ protected:
// Array of intersection observers
nsTHashtable<nsPtrHashKey<mozilla::dom::DOMIntersectionObserver>>
mIntersectionObservers;
// Tracker for animations that are waiting to start.
// nullptr until GetOrCreatePendingAnimationTracker is called.
RefPtr<mozilla::PendingAnimationTracker> mPendingAnimationTracker;
- // Weak reference to the scope object (aka the script global object)
- // that, unlike mScriptGlobalObject, is never unset once set. This
- // is a weak reference to avoid leaks due to circular references.
- nsWeakPtr mScopeObject;
-
// Stack of full-screen elements. When we request full-screen we push the
// full-screen element onto this stack, and when we cancel full-screen we
// pop one off this stack, restoring the previous full-screen state
nsTArray<nsWeakPtr> mFullScreenStack;
// The root of the doc tree in which this document is in. This is only
// non-null when this document is in fullscreen mode.
nsWeakPtr mFullscreenRoot;
--- a/dom/base/nsIDocument.h
+++ b/dom/base/nsIDocument.h
@@ -1534,27 +1534,27 @@ public:
*/
nsIScriptGlobalObject*
GetScriptHandlingObject(bool& aHasHadScriptHandlingObject) const
{
aHasHadScriptHandlingObject = mHasHadScriptHandlingObject;
return mScriptGlobalObject ? mScriptGlobalObject.get() :
GetScriptHandlingObjectInternal();
}
- virtual void SetScriptHandlingObject(nsIScriptGlobalObject* aScriptObject) = 0;
+ void SetScriptHandlingObject(nsIScriptGlobalObject* aScriptObject);
/**
* Get the object that is used as the scope for all of the content
* wrappers whose owner document is this document. Unlike the script global
* object, this will only return null when the global object for this
* document is truly gone. Use this object when you're trying to find a
* content wrapper in XPConnect.
*/
- virtual nsIGlobalObject* GetScopeObject() const = 0;
- virtual void SetScopeObject(nsIGlobalObject* aGlobal) = 0;
+ nsIGlobalObject* GetScopeObject() const;
+ void SetScopeObject(nsIGlobalObject* aGlobal);
/**
* Return the window containing the document (the outer window).
*/
nsPIDOMWindowOuter *GetWindow() const
{
return mWindow ? mWindow->GetOuterWindow() : GetWindowInternal();
}
@@ -3384,20 +3384,20 @@ protected:
NS_RELEASE_THIS();
}
}
~nsIDocument();
nsPropertyTable* GetExtraPropertyTable(uint16_t aCategory);
// Never ever call this. Only call GetWindow!
- virtual nsPIDOMWindowOuter* GetWindowInternal() const = 0;
+ nsPIDOMWindowOuter* GetWindowInternal() const;
// Never ever call this. Only call GetScriptHandlingObject!
- virtual nsIScriptGlobalObject* GetScriptHandlingObjectInternal() const = 0;
+ nsIScriptGlobalObject* GetScriptHandlingObjectInternal() const;
// Never ever call this. Only call AllowXULXBL!
bool InternalAllowXULXBL();
/**
* These methods should be called before and after dispatching
* a mutation event.
* To make this easy and painless, use the mozAutoSubtreeModified helper class.
@@ -3979,16 +3979,21 @@ protected:
RefPtr<nsDOMNavigationTiming> mTiming;
// Recorded time of change to 'loading' state.
mozilla::TimeStamp mLoadingTimeStamp;
nsWeakPtr mAutoFocusElement;
+ // Weak reference to the scope object (aka the script global object)
+ // that, unlike mScriptGlobalObject, is never unset once set. This
+ // is a weak reference to avoid leaks due to circular references.
+ nsWeakPtr mScopeObject;
+
nsTArray<RefPtr<mozilla::StyleSheet>> mOnDemandBuiltInUASheets;
nsTArray<RefPtr<mozilla::StyleSheet>> mAdditionalSheets[AdditionalSheetTypeCount];
// Member to store out last-selected stylesheet set.
nsString mLastStyleSheetSet;
RefPtr<nsDOMStyleSheetSetList> mStyleSheetSetList;
// We lazily calculate declaration blocks for SVG elements with mapped