Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(294)

Unified Diff: third_party/WebKit/Source/core/dom/custom/CustomElementReactionStack.cpp

Issue 2097463002: Add backup element queue to CustomElementReactionStack (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: dominicc nits Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/dom/custom/CustomElementReactionStack.cpp
diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementReactionStack.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementReactionStack.cpp
index 1ec77952d5ed56cb36c22416618391f4e158ec23..e05f34bf1a3922f8973f59dca0c1bf9cd37bde8f 100644
--- a/third_party/WebKit/Source/core/dom/custom/CustomElementReactionStack.cpp
+++ b/third_party/WebKit/Source/core/dom/custom/CustomElementReactionStack.cpp
@@ -4,8 +4,11 @@
#include "core/dom/custom/CustomElementReactionStack.h"
+#include "bindings/core/v8/Microtask.h"
#include "core/dom/Element.h"
+#include "core/dom/custom/CEReactionsScope.h"
#include "core/dom/custom/CustomElementReactionQueue.h"
+#include "core/frame/FrameHost.h"
namespace blink {
@@ -20,6 +23,7 @@ DEFINE_TRACE(CustomElementReactionStack)
{
visitor->trace(m_map);
visitor->trace(m_stack);
+ visitor->trace(m_backupQueue);
}
void CustomElementReactionStack::push()
@@ -30,30 +34,37 @@ void CustomElementReactionStack::push()
void CustomElementReactionStack::popInvokingReactions()
{
ElementQueue* queue = m_stack.last();
- if (!queue) {
- m_stack.removeLast();
- return;
- }
+ if (queue)
+ invokeReactions(*queue);
+ m_stack.removeLast();
+}
- for (size_t i = 0; i < queue->size(); ++i) {
- Element* element = (*queue)[i];
+void CustomElementReactionStack::invokeReactions(ElementQueue& queue)
+{
+ for (size_t i = 0; i < queue.size(); ++i) {
+ Element* element = queue[i];
if (CustomElementReactionQueue* reactions = m_map.get(element)) {
reactions->invokeReactions(element);
CHECK(reactions->isEmpty());
m_map.remove(element);
}
}
+}
- m_stack.removeLast();
+void CustomElementReactionStack::enqueueToCurrentQueue(
+ Element* element,
+ CustomElementReaction* reaction)
+{
+ enqueue(m_stack.last(), element, reaction);
}
void CustomElementReactionStack::enqueue(
+ Member<ElementQueue>& queue,
Element* element,
CustomElementReaction* reaction)
{
- ElementQueue* queue = m_stack.last();
if (!queue)
- m_stack.last() = queue = new ElementQueue();
+ queue = new ElementQueue();
queue->append(element);
CustomElementReactionQueue* reactions = m_map.get(element);
@@ -65,4 +76,31 @@ void CustomElementReactionStack::enqueue(
reactions->add(reaction);
}
+void CustomElementReactionStack::enqueueToBackupQueue(
+ Element* element,
+ CustomElementReaction* reaction)
+{
+ // https://html.spec.whatwg.org/multipage/scripting.html#backup-element-queue
+
+ DCHECK(!CEReactionsScope::current());
+ DCHECK(m_stack.isEmpty());
+ DCHECK(isMainThread());
+
+ // If the processing the backup element queue is not set:
+ if (!m_backupQueue || m_backupQueue->isEmpty()) {
+ Microtask::enqueueMicrotask(WTF::bind(
+ &CustomElementReactionStack::invokeBackupQueue,
+ Persistent<CustomElementReactionStack>(this)));
+ }
+
+ enqueue(m_backupQueue, element, reaction);
+}
+
+void CustomElementReactionStack::invokeBackupQueue()
+{
+ DCHECK(isMainThread());
+ invokeReactions(*m_backupQueue);
+ m_backupQueue->clear();
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698