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

Unified Diff: third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp

Issue 2029923003: Recursively defining custom elements should not lead to redefinition (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. 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/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp
index 39da9922a20331c868b3889186b2f20796ec9a0a..3a4d686dc4ef14b2ab0168d66e18eb396a6650ae 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp
@@ -15,16 +15,26 @@
namespace blink {
+ScriptCustomElementDefinitionBuilder* ScriptCustomElementDefinitionBuilder
+ ::s_stack = nullptr;
+
ScriptCustomElementDefinitionBuilder::ScriptCustomElementDefinitionBuilder(
ScriptState* scriptState,
CustomElementsRegistry* registry,
const ScriptValue& constructor,
ExceptionState& exceptionState)
- : m_scriptState(scriptState)
+ : m_prev(s_stack)
+ , m_scriptState(scriptState)
, m_registry(registry)
, m_constructorValue(constructor.v8Value())
, m_exceptionState(exceptionState)
{
+ s_stack = this;
+}
+
+ScriptCustomElementDefinitionBuilder::~ScriptCustomElementDefinitionBuilder()
+{
+ s_stack = m_prev;
}
bool ScriptCustomElementDefinitionBuilder::checkConstructorIntrinsics()
@@ -57,6 +67,17 @@ bool ScriptCustomElementDefinitionBuilder::checkConstructorNotRegistered()
"this constructor has already been used with this registry");
return false;
}
+ for (auto builder = m_prev; builder; builder = builder->m_prev) {
+ CHECK(!builder->m_constructor.IsEmpty());
+ if (m_registry != builder->m_registry
+ || m_constructor != builder->m_constructor) {
+ continue;
+ }
+ m_exceptionState.throwDOMException(
+ NotSupportedError,
+ "this constructor is already being defined in this registry");
+ return false;
+ }
return true;
}

Powered by Google App Engine
This is Rietveld 408576698