summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2020-09-16 19:39:33 +0000
committerMoonchild <moonchild@palemoon.org>2020-09-16 19:39:33 +0000
commitb6b868b1bda0d82b85647f3e9ff2ab1f788eeb46 (patch)
tree3ef85068d06334887dbe9a3656e26e1837d1114c
parenta53a2a3a38d03721b19768480dbdb0bccb4616d9 (diff)
downloaduxp-b6b868b1bda0d82b85647f3e9ff2ab1f788eeb46.tar.gz
Issue #1643 - Part 4: Hook up all the plumbing.
-rw-r--r--dom/base/ResizeObserver.cpp4
-rw-r--r--dom/base/nsDocument.cpp26
-rw-r--r--dom/base/nsDocument.h8
-rw-r--r--dom/base/nsIDocument.h5
-rw-r--r--layout/base/nsPresShell.cpp5
5 files changed, 46 insertions, 2 deletions
diff --git a/dom/base/ResizeObserver.cpp b/dom/base/ResizeObserver.cpp
index aefcddd9d4..37d940c2b3 100644
--- a/dom/base/ResizeObserver.cpp
+++ b/dom/base/ResizeObserver.cpp
@@ -61,7 +61,7 @@ ResizeObserver::Constructor(const GlobalObject& aGlobal,
}
RefPtr<ResizeObserver> observer = new ResizeObserver(window.forget(), aCb);
- // TODO: Add the new ResizeObserver to document here in the later patch.
+ document->AddResizeObserver(observer);
return observer.forget();
}
@@ -86,7 +86,7 @@ ResizeObserver::Observe(Element* aTarget,
// Per the spec, we need to trigger notification in event loop that
// contains ResizeObserver observe call even when resize/reflow does
// not happen.
- // TODO: Implement the notification scheduling in the later patch.
+ aTarget->OwnerDoc()->ScheduleResizeObserversNotification();
}
}
diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp
index 76490e6b44..5bf89f26ae 100644
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -1681,6 +1681,10 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsDocument)
cb.NoteXPCOMChild(mql);
}
}
+
+ if (tmp->mResizeObserverController) {
+ tmp->mResizeObserverController->Traverse(cb);
+ }
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_CLASS(nsDocument)
@@ -1786,6 +1790,10 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsDocument)
}
tmp->mInUnlinkOrDeletion = false;
+
+ if (tmp->mResizeObserverController) {
+ tmp->mResizeObserverController->Unlink();
+ }
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
nsresult
@@ -11823,6 +11831,24 @@ nsDocument::QuerySelectorAll(const nsAString& aSelector, nsIDOMNodeList **aRetur
return nsINode::QuerySelectorAll(aSelector, aReturn);
}
+void
+nsDocument::AddResizeObserver(ResizeObserver* aResizeObserver)
+{
+ if (!mResizeObserverController) {
+ mResizeObserverController = MakeUnique<ResizeObserverController>(this);
+ }
+
+ mResizeObserverController->AddResizeObserver(aResizeObserver);
+}
+
+void
+nsDocument::ScheduleResizeObserversNotification() const
+{
+ if (mResizeObserverController) {
+ mResizeObserverController->ScheduleNotification();
+ }
+}
+
already_AddRefed<nsIDocument>
nsIDocument::Constructor(const GlobalObject& aGlobal,
ErrorResult& rv)
diff --git a/dom/base/nsDocument.h b/dom/base/nsDocument.h
index 502ba0f133..017879b1fb 100644
--- a/dom/base/nsDocument.h
+++ b/dom/base/nsDocument.h
@@ -60,6 +60,7 @@
#include "mozilla/MemoryReporting.h"
#include "mozilla/PendingAnimationTracker.h"
#include "mozilla/dom/DOMImplementation.h"
+#include "mozilla/dom/ResizeObserverController.h"
#include "mozilla/dom/ScriptLoader.h"
#include "mozilla/dom/StyleSheetList.h"
#include "nsDataHashtable.h"
@@ -1024,6 +1025,10 @@ public:
virtual void UnblockDOMContentLoaded() override;
+ void AddResizeObserver(mozilla::dom::ResizeObserver* aResizeObserver) override;
+
+ void ScheduleResizeObserversNotification() const override;
+
protected:
friend class nsNodeUtils;
friend class nsDocumentOnStack;
@@ -1160,6 +1165,9 @@ protected:
nsTArray<nsIObserver*> mCharSetObservers;
+ mozilla::UniquePtr<mozilla::dom::ResizeObserverController>
+ mResizeObserverController;
+
PLDHashTable *mSubDocuments;
// Array of owning references to all children
diff --git a/dom/base/nsIDocument.h b/dom/base/nsIDocument.h
index 21cd0aaf7c..5684490aa5 100644
--- a/dom/base/nsIDocument.h
+++ b/dom/base/nsIDocument.h
@@ -153,6 +153,7 @@ class ProcessingInstruction;
class Promise;
class Selection;
class ScriptLoader;
+class ResizeObserver;
class StyleSheetList;
class SVGDocument;
class SVGSVGElement;
@@ -2853,6 +2854,10 @@ public:
bool ModuleScriptsEnabled();
+ virtual void AddResizeObserver(mozilla::dom::ResizeObserver* aResizeObserver) = 0;
+
+ virtual void ScheduleResizeObserversNotification() const = 0;
+
protected:
bool GetUseCounter(mozilla::UseCounter aUseCounter)
{
diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp
index e8670ff3bf..de3dc1a256 100644
--- a/layout/base/nsPresShell.cpp
+++ b/layout/base/nsPresShell.cpp
@@ -9060,6 +9060,11 @@ PresShell::DidDoReflow(bool aInterruptible)
docShell->NotifyReflowObservers(aInterruptible, mLastReflowStart, now);
}
+ // Notify resize observers on reflow.
+ if (!mPresContext->HasPendingInterrupt()) {
+ mDocument->ScheduleResizeObserversNotification();
+ }
+
if (sSynthMouseMove) {
SynthesizeMouseMove(false);
}