// https://html.spec.whatwg.org/multipage/scripting.html#dom-customelementsregistry-get ScriptValue CustomElementRegistry::get(const AtomicString& name) { CustomElementDefinition* definition = definitionForName(name); if (!definition) { // Binding layer converts |ScriptValue()| to script specific value, // e.g. |undefined| for v8. return ScriptValue(); } return definition->getConstructorForScript(); }
CustomElementDefinition* CustomElementRegistry::definitionFor( const CustomElementDescriptor& desc) const { CustomElementDefinition* definition = definitionForName(desc.name()); if (!definition) return nullptr; // The definition for a customized built-in element, such as // <button is="my-button"> should not be provided for an // autonomous element, such as <my-button>, even though the // name "my-button" matches. return definition->descriptor() == desc ? definition : nullptr; }
HTMLElement* CustomElement::createCustomElementAsync(Document& document, const QualifiedName& tagName) { CHECK(shouldCreateCustomElement(document, tagName)); // To create an element: // https://dom.spec.whatwg.org/#concept-create-element // 6. If definition is non-null, then: // 6.2. If the synchronous custom elements flag is not set: if (CustomElementDefinition* definition = definitionForName(document, tagName)) return definition->createElementAsync(document, tagName); return createUndefinedElement(document, tagName); }
HTMLElement* CustomElement::createCustomElementSync(Document& document, const QualifiedName& tagName) { CHECK(shouldCreateCustomElement(document, tagName)); // When invoked from "create an element for a token": // https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token // 7. If this step throws an exception, then report the exception, // and let element be instead a new element that implements // HTMLUnknownElement. if (CustomElementDefinition* definition = definitionForName(document, tagName)) return definition->createElementSync(document, tagName); return createUndefinedElement(document, tagName); }
// https://html.spec.whatwg.org/multipage/scripting.html#dom-customelementsregistry-whendefined ScriptPromise CustomElementRegistry::whenDefined( ScriptState* scriptState, const AtomicString& name, ExceptionState& exceptionState) { if (throwIfInvalidName(name, exceptionState)) return ScriptPromise(); CustomElementDefinition* definition = definitionForName(name); if (definition) return ScriptPromise::castUndefined(scriptState); ScriptPromiseResolver* resolver = m_whenDefinedPromiseMap.get(name); if (resolver) return resolver->promise(); ScriptPromiseResolver* newResolver = ScriptPromiseResolver::create(scriptState); m_whenDefinedPromiseMap.add(name, newResolver); return newResolver->promise(); }