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

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

Issue 2023093003: Upgrade in-document custom elements when an element is defined. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix ASAN failure in test helper. Created 4 years, 7 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/CustomElementsRegistry.cpp
diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp
index e8fbde3d03ab1a71606c0bafeef9c9d952625c0f..937f9239614f4d52d4720ad2945f010c7c3609e4 100644
--- a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp
+++ b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp
@@ -7,36 +7,40 @@
#include "bindings/core/v8/ExceptionState.h"
#include "bindings/core/v8/ScriptCustomElementDefinitionBuilder.h"
#include "core/dom/Document.h"
+#include "core/dom/Element.h"
#include "core/dom/ElementRegistrationOptions.h"
#include "core/dom/ExceptionCode.h"
+#include "core/dom/custom/CEReactionsScope.h"
#include "core/dom/custom/CustomElement.h"
#include "core/dom/custom/CustomElementDefinition.h"
#include "core/dom/custom/CustomElementDefinitionBuilder.h"
+#include "core/dom/custom/CustomElementDescriptor.h"
+#include "core/dom/custom/CustomElementUpgradeReaction.h"
+#include "core/dom/custom/CustomElementUpgradeSorter.h"
#include "core/dom/custom/V0CustomElementRegistrationContext.h"
namespace blink {
CustomElementsRegistry* CustomElementsRegistry::create(
- V0CustomElementRegistrationContext* v0)
+ Document* document)
{
- // TODO(dominicc): The window could install a new document; add a signal
- // when a window installs a new document to notify that V0 context, too.
- CustomElementsRegistry* registry = new CustomElementsRegistry(v0);
- if (v0)
- v0->setV1(registry);
+ CustomElementsRegistry* registry = new CustomElementsRegistry(document);
+ if (V0CustomElementRegistrationContext* v0Context = registry->v0())
+ v0Context->setV1(registry);
return registry;
}
-CustomElementsRegistry::CustomElementsRegistry(
- const V0CustomElementRegistrationContext* v0)
- : m_v0(v0)
+CustomElementsRegistry::CustomElementsRegistry(Document* document)
+ : m_document(document)
+ , m_upgradeCandidates(new UpgradeCandidateMap())
{
}
DEFINE_TRACE(CustomElementsRegistry)
{
visitor->trace(m_definitions);
- visitor->trace(m_v0);
+ visitor->trace(m_document);
+ visitor->trace(m_upgradeCandidates);
}
void CustomElementsRegistry::define(
@@ -61,6 +65,8 @@ void CustomElementsRegistry::define(
const ElementRegistrationOptions& options,
ExceptionState& exceptionState)
{
+ CEReactionsScope reactions;
+
if (!builder.checkConstructorIntrinsics())
return;
@@ -108,6 +114,14 @@ void CustomElementsRegistry::define(
m_definitions.add(descriptor.name(), definition);
CHECK(result.isNewEntry);
+ HeapVector<Member<Element>> candidates;
+ collectCandidates(descriptor, &candidates);
+ for (Element* candidate : candidates) {
+ reactions.enqueue(
+ candidate,
+ new CustomElementUpgradeReaction(definition));
+ }
+
// TODO(dominicc): Implement steps:
// 20: when-defined promise processing
}
@@ -124,11 +138,21 @@ ScriptValue CustomElementsRegistry::get(const AtomicString& name)
return definition->getConstructorForScript();
}
-bool CustomElementsRegistry::v0NameIsDefined(const AtomicString& name) const
+bool CustomElementsRegistry::nameIsDefined(const AtomicString& name) const
+{
+ return m_definitions.contains(name);
+}
+
+V0CustomElementRegistrationContext* CustomElementsRegistry::v0()
{
- if (!m_v0)
- return false;
- return m_v0->nameIsDefined(name);
+ return m_document->registrationContext();
+}
+
+bool CustomElementsRegistry::v0NameIsDefined(const AtomicString& name)
+{
+ if (V0CustomElementRegistrationContext* v0Context = v0())
+ return v0Context->nameIsDefined(name);
+ return false;
}
CustomElementDefinition* CustomElementsRegistry::definitionForName(
@@ -137,4 +161,39 @@ CustomElementDefinition* CustomElementsRegistry::definitionForName(
return m_definitions.get(name);
}
+void CustomElementsRegistry::addCandidate(Element* candidate)
+{
+ const AtomicString& name = candidate->localName();
+ if (nameIsDefined(name) || v0NameIsDefined(name))
+ return;
+ UpgradeCandidateMap::iterator it = m_upgradeCandidates->find(name);
+ UpgradeCandidateSet* set;
+ if (it != m_upgradeCandidates->end()) {
+ set = it->value;
+ } else {
+ set = m_upgradeCandidates->add(name, new UpgradeCandidateSet())
+ .storedValue
+ ->value;
+ }
+ set->add(candidate);
+}
+
+void CustomElementsRegistry::collectCandidates(
+ const CustomElementDescriptor& desc,
+ HeapVector<Member<Element>>* elements)
+{
+ UpgradeCandidateMap::iterator it = m_upgradeCandidates->find(desc.name());
+ if (it == m_upgradeCandidates->end())
+ return;
+ CustomElementUpgradeSorter sorter;
+ for (Element* element : *it.get()->value) {
+ if (!element || !desc.matches(*element))
+ continue;
+ sorter.add(element);
+ }
+
+ m_upgradeCandidates->remove(it);
+ sorter.sorted(elements, m_document.get());
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698