summaryrefslogtreecommitdiffstats
path: root/dom/base/nsDOMMutationObserver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/nsDOMMutationObserver.cpp')
-rw-r--r--dom/base/nsDOMMutationObserver.cpp46
1 files changed, 45 insertions, 1 deletions
diff --git a/dom/base/nsDOMMutationObserver.cpp b/dom/base/nsDOMMutationObserver.cpp
index 4c4731c11..fbd64dc20 100644
--- a/dom/base/nsDOMMutationObserver.cpp
+++ b/dom/base/nsDOMMutationObserver.cpp
@@ -12,6 +12,7 @@
#include "mozilla/dom/Animation.h"
#include "mozilla/dom/KeyframeEffectReadOnly.h"
+#include "mozilla/dom/DocGroup.h"
#include "nsContentUtils.h"
#include "nsCSSPseudoElements.h"
@@ -609,6 +610,28 @@ public:
}
};
+/* static */ void
+nsDOMMutationObserver::QueueMutationObserverMicroTask()
+{
+ CycleCollectedJSContext* ccjs = CycleCollectedJSContext::Get();
+ if (!ccjs) {
+ return;
+ }
+
+ RefPtr<MutationObserverMicroTask> momt =
+ new MutationObserverMicroTask();
+ ccjs->DispatchMicroTaskRunnable(momt.forget());
+}
+
+void
+nsDOMMutationObserver::HandleMutations(mozilla::AutoSlowOperation& aAso)
+{
+ if (sScheduledMutationObservers ||
+ mozilla::dom::DocGroup::sPendingDocGroups) {
+ HandleMutationsInternal(aAso);
+ }
+}
+
void
nsDOMMutationObserver::RescheduleForRun()
{
@@ -887,7 +910,23 @@ nsDOMMutationObserver::HandleMutationsInternal(AutoSlowOperation& aAso)
{
nsTArray<RefPtr<nsDOMMutationObserver> >* suppressedObservers = nullptr;
- while (sScheduledMutationObservers) {
+ // Let signalList be a copy of unit of related similar-origin browsing
+ // contexts' signal slot list.
+ nsTArray<RefPtr<HTMLSlotElement>> signalList;
+ if (DocGroup::sPendingDocGroups) {
+ for (uint32_t i = 0; i < DocGroup::sPendingDocGroups->Length(); ++i) {
+ DocGroup* docGroup = DocGroup::sPendingDocGroups->ElementAt(i);
+ signalList.AppendElements(docGroup->SignalSlotList());
+
+ // Empty unit of related similar-origin browsing contexts' signal slot
+ // list.
+ docGroup->ClearSignalSlotList();
+ }
+ delete DocGroup::sPendingDocGroups;
+ DocGroup::sPendingDocGroups = nullptr;
+ }
+
+ if (sScheduledMutationObservers) {
AutoTArray<RefPtr<nsDOMMutationObserver>, 4>* observers =
sScheduledMutationObservers;
sScheduledMutationObservers = nullptr;
@@ -917,6 +956,11 @@ nsDOMMutationObserver::HandleMutationsInternal(AutoSlowOperation& aAso)
delete suppressedObservers;
suppressedObservers = nullptr;
}
+
+ // Fire slotchange event for each slot in signalList.
+ for (uint32_t i = 0; i < signalList.Length(); ++i) {
+ signalList[i]->FireSlotChangeEvent();
+ }
}
nsDOMMutationRecord*