| Index: third_party/WebKit/Source/bindings/core/v8/custom/V8HTMLElementCustom.cpp
|
| diff --git a/third_party/WebKit/Source/bindings/core/v8/custom/V8HTMLElementCustom.cpp b/third_party/WebKit/Source/bindings/core/v8/custom/V8HTMLElementCustom.cpp
|
| index 2f9ed0437bfe3009ccf01fea01046813b08efb51..3e6ed3363ae61864cca9e4b4b45bd7c8cf196917 100644
|
| --- a/third_party/WebKit/Source/bindings/core/v8/custom/V8HTMLElementCustom.cpp
|
| +++ b/third_party/WebKit/Source/bindings/core/v8/custom/V8HTMLElementCustom.cpp
|
| @@ -12,6 +12,7 @@
|
| #include "bindings/core/v8/V8DOMWrapper.h"
|
| #include "bindings/core/v8/V8ThrowException.h"
|
| #include "core/dom/Document.h"
|
| +#include "core/dom/ExceptionCode.h"
|
| #include "core/dom/custom/CustomElementsRegistry.h"
|
| #include "core/frame/LocalDOMWindow.h"
|
| #include "platform/RuntimeEnabledFeatures.h"
|
| @@ -28,48 +29,65 @@ void V8HTMLElement::constructorCustom(
|
|
|
| if (!RuntimeEnabledFeatures::customElementsV1Enabled()
|
| || !scriptState->world().isMainWorld()) {
|
| - V8ThrowException::throwTypeError(info.GetIsolate(), "Illegal constructor");
|
| + V8ThrowException::throwTypeError(
|
| + info.GetIsolate(),
|
| + "Illegal constructor");
|
| return;
|
| }
|
|
|
| LocalDOMWindow* window = scriptState->domWindow();
|
| - ScriptCustomElementDefinition* def =
|
| + ScriptCustomElementDefinition* definition =
|
| ScriptCustomElementDefinition::forConstructor(
|
| scriptState,
|
| window->customElements(),
|
| info.NewTarget());
|
| - if (!def) {
|
| + if (!definition) {
|
| V8ThrowException::throwTypeError(isolate, "Illegal constructor");
|
| return;
|
| }
|
|
|
| - // TODO(dominicc): Implement cases where the definition's
|
| - // construction stack is not empty when parser-creation is
|
| - // implemented.
|
| -
|
| ExceptionState exceptionState(
|
| ExceptionState::ConstructionContext,
|
| "HTMLElement",
|
| info.Holder(),
|
| isolate);
|
| - Element* element = window->document()->createElement(
|
| - def->descriptor().localName(),
|
| - AtomicString(),
|
| - exceptionState);
|
| - if (exceptionState.throwIfNeeded())
|
| +
|
| + Element* element;
|
| + if (definition->constructionStack().isEmpty()) {
|
| + // This is an element being created with 'new' from script
|
| + element = window->document()->createElement(
|
| + definition->descriptor().localName(),
|
| + AtomicString(),
|
| + exceptionState);
|
| + if (exceptionState.throwIfNeeded())
|
| + return;
|
| + } else if ((element = definition->constructionStack().last())) {
|
| + // This is an element being upgraded that has called super
|
| + definition->constructionStack().last().clear();
|
| + } else {
|
| + // During upgrade an element has invoked the same constructor
|
| + // before calling 'super' and that invocation has poached the
|
| + // element.
|
| + exceptionState.throwDOMException(
|
| + InvalidStateError,
|
| + "this instance is already constructed");
|
| + exceptionState.throwIfNeeded();
|
| return;
|
| + }
|
| const WrapperTypeInfo* wrapperType = element->wrapperTypeInfo();
|
| v8::Local<v8::Object> wrapper = V8DOMWrapper::associateObjectWithWrapper(
|
| isolate,
|
| element,
|
| wrapperType,
|
| info.This());
|
| + // If the element had a wrapper, we now update and return that
|
| + // instead.
|
| + v8SetReturnValue(info, wrapper);
|
|
|
| - if (!v8CallBoolean(wrapper->SetPrototype(
|
| + bool setPrototype = v8CallOrCrash(wrapper->SetPrototype(
|
| scriptState->context(),
|
| - def->prototype(scriptState)))) {
|
| - return;
|
| - }
|
| + definition->prototype(scriptState)));
|
| + CHECK(setPrototype);
|
| }
|
|
|
| } // namespace blink
|
|
|