Bug 160731 - Move document.defineElement to customElements.define
Summary: Move document.defineElement to customElements.define
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: DOM (show other bugs)
Version: WebKit Nightly Build
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Ryosuke Niwa
URL:
Keywords: InRadar
Depends on:
Blocks: 154907
  Show dependency treegraph
 
Reported: 2016-08-09 23:10 PDT by Ryosuke Niwa
Modified: 2016-09-01 16:16 PDT (History)
14 users (show)

See Also:


Attachments
Updates the implementation (93.72 KB, patch)
2016-08-09 23:39 PDT, Ryosuke Niwa
no flags Details | Formatted Diff | Diff
Fix GTK+/EFL builds (94.61 KB, patch)
2016-08-09 23:53 PDT, Ryosuke Niwa
no flags Details | Formatted Diff | Diff
Archive of layout-test-results from ews103 for mac-yosemite (864.61 KB, application/zip)
2016-08-10 00:50 PDT, Build Bot
no flags Details
Archive of layout-test-results from ews105 for mac-yosemite-wk2 (1009.80 KB, application/zip)
2016-08-10 00:56 PDT, Build Bot
no flags Details
Archive of layout-test-results from ews117 for mac-yosemite (1.49 MB, application/zip)
2016-08-10 01:00 PDT, Build Bot
no flags Details
Fixed builds and addressed review comments (101.93 KB, patch)
2016-08-10 14:40 PDT, Ryosuke Niwa
no flags Details | Formatted Diff | Diff
Updated for TOT (103.09 KB, patch)
2016-08-10 14:47 PDT, Ryosuke Niwa
no flags Details | Formatted Diff | Diff
Another build fix (103.13 KB, patch)
2016-08-10 15:18 PDT, Ryosuke Niwa
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Ryosuke Niwa 2016-08-09 23:10:19 PDT
The latest custom elements specification (now merged into HTML spec) moved document.defineElement
to window.customElements.define. Update our implementation to match this change.
Comment 1 Ryosuke Niwa 2016-08-09 23:39:29 PDT
Created attachment 285716 [details]
Updates the implementation
Comment 2 Ryosuke Niwa 2016-08-09 23:53:56 PDT
Created attachment 285717 [details]
Fix GTK+/EFL builds
Comment 3 Build Bot 2016-08-10 00:49:58 PDT
Comment on attachment 285717 [details]
Fix GTK+/EFL builds

Attachment 285717 [details] did not pass mac-ews (mac):
Output: http://webkit-queues.webkit.org/results/1844564

New failing tests:
js/dom/global-constructors-attributes.html
Comment 4 Build Bot 2016-08-10 00:50:03 PDT
Created attachment 285720 [details]
Archive of layout-test-results from ews103 for mac-yosemite

The attached test failures were seen while running run-webkit-tests on the mac-ews.
Bot: ews103  Port: mac-yosemite  Platform: Mac OS X 10.10.5
Comment 5 Build Bot 2016-08-10 00:56:13 PDT
Comment on attachment 285717 [details]
Fix GTK+/EFL builds

Attachment 285717 [details] did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-queues.webkit.org/results/1844574

New failing tests:
js/dom/global-constructors-attributes.html
Comment 6 Build Bot 2016-08-10 00:56:17 PDT
Created attachment 285722 [details]
Archive of layout-test-results from ews105 for mac-yosemite-wk2

The attached test failures were seen while running run-webkit-tests on the mac-wk2-ews.
Bot: ews105  Port: mac-yosemite-wk2  Platform: Mac OS X 10.10.5
Comment 7 Build Bot 2016-08-10 01:00:03 PDT
Comment on attachment 285717 [details]
Fix GTK+/EFL builds

Attachment 285717 [details] did not pass mac-debug-ews (mac):
Output: http://webkit-queues.webkit.org/results/1844572

New failing tests:
js/dom/global-constructors-attributes.html
Comment 8 Build Bot 2016-08-10 01:00:08 PDT
Created attachment 285723 [details]
Archive of layout-test-results from ews117 for mac-yosemite

The attached test failures were seen while running run-webkit-tests on the mac-debug-ews.
Bot: ews117  Port: mac-yosemite  Platform: Mac OS X 10.10.5
Comment 9 Chris Dumez 2016-08-10 09:56:58 PDT
Comment on attachment 285717 [details]
Fix GTK+/EFL builds

View in context: https://bugs.webkit.org/attachment.cgi?id=285717&action=review

Looks like there is a test failure and that it still does build on EFL / GTK/Win.

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:42
> +{

This function should throw if given less than 2 parameters:
    if (UNLIKELY(state.argumentCount() < 2))
        return state.vm().throwException(&state, createNotEnoughArgumentsError(&state));

You can then use uncheckedArgument() below instead of argument().

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:43
> +    AtomicString tagName(state.argument(0).toString(&state)->toAtomicString(&state));

Isn't this a local name rather than a qualified name ? If so, I would suggest naming this variable localName or simply name as in the spec. tagName is a bit confusing to me because I think of a qualified name (https://dom.spec.whatwg.org/#dom-element-tagname).

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:47
> +    JSObject* object = state.argument(1).getObject();

How about we call this 'constructor' rather than 'object' ?

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:49
> +    if (!object || object->methodTable()->getConstructData(object, callData) == ConstructType::None)

Instead of all this, I think we should be able to use JSValue::isFunction(). We should probably pass a JSFunction* to the implementation instead of a JSObject* for clarity.

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:51
> +

It looks like we may be missing step 2 in the spec?
"If constructor is either an interface object or named constructor, whose corresponding interface either is HTMLElement or has HTMLElement in its set of inherited interfaces, throw a TypeError and abort these steps."

We should at least add a FIXME. I am not sure how easy it is to detect our interface objects at the moment so we can look into it separately.

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:56
> +        return throwSyntaxError(&state, "Custom element name cannot be same as one of the builtin elements");

ASCIILiteral()?

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:58
> +        return throwSyntaxError(&state, "Custom element name must contain a hyphen");

ASCIILiteral()?

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:60
> +        return throwSyntaxError(&state, "Custom element name cannot contain an upper case letter");

ASCIILiteral()?

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:65
> +        throwNotSupportedError(state, "Cannot define multiple custom elements with the same tag name");

ASCIILiteral()?

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:70
> +        throwNotSupportedError(state, "Cannot define multiple custom elements with the same class");

ASCIILiteral()?

> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:83
> +    QualifiedName name(nullAtom, tagName, HTMLNames::xhtmlNamespaceURI);

This seems to confirm tagName is a localName, not a qualifiedName.

> Source/WebCore/bindings/js/JSHTMLElementCustom.cpp:54
> +        return throwVMTypeError(&exec, "new.target is not a valid custom element constructor");

ASCIILiteral()?

> Source/WebCore/dom/CustomElementsRegistry.cpp:2
> + * Copyright (C) 2015 Apple Inc. All rights reserved.

2015 on purpose? is it just moved code?

> Source/WebCore/dom/CustomElementsRegistry.h:31
> +#pragma once

I believe this usually comes before the includes.

> Source/WebCore/dom/CustomElementsRegistry.h:33
> +#if ENABLE(CUSTOM_ELEMENTS)

Ditto.

> Source/WebCore/dom/CustomElementsRegistry.h:48
> +    WTF_MAKE_FAST_ALLOCATED;

Redundant since this subclasses RefCounted.

> Source/WebCore/dom/CustomElementsRegistry.h:53
> +    RefPtr<Element> constructElement(const AtomicString&);

I cannot find the implementation for this method? In particular, I was curious why this returned a RefPtr<> and not a Ref<>.

> Source/WebCore/dom/CustomElementsRegistry.h:66
> +    HashMap<AtomicString, Vector<RefPtr<Element>>> m_upgradeCandidatesMap;

Could this be a Vector of Ref<Element> ?

> Source/WebCore/dom/CustomElementsRegistry.h:67
> +    HashMap<AtomicString, RefPtr<JSCustomElementInterface>> m_nameMap;

Could this be a Ref<> ? I believe Sam added support for Ref<> values in HashMap a while back.

> Source/WebCore/dom/CustomElementsRegistry.idl:28
> +    JSGenerateToNativeObject,

I don't think we need this one. This is the default since the interface does not have a parent.

> Source/WebCore/dom/CustomElementsRegistry.idl:32
> +    [InvokesCustomElementLifecycleCallbacks, Custom] void define(DOMString name, Function constructor);

nit: I would omit the extra blank lines surrounding this.

> Source/WebCore/dom/Document.cpp:883
> +static ALWAYS_INLINE RefPtr<HTMLElement> createUpgradeCandidateElement(Document& document, DOMWindow* window, const QualifiedName& name)

Why ALWAYS_INLINE?

> Source/WebCore/dom/Document.cpp:891
> +    Ref<HTMLElement> element = HTMLElement::create(name, document);

auto

> Source/WebCore/dom/Document.cpp:897
>  static RefPtr<Element> createHTMLElementWithNameValidation(Document& document, const AtomicString& localName, ExceptionCode& ec)

Can this return a RefPtr<HTMLElement> ?

> Source/WebCore/dom/Document.cpp:923
>          return WTFMove(element);

No need for the WTFMove() if the function is updated to return a RefPtr<HTMLElement>.

> Source/WebCore/dom/Document.cpp:1092
> +                Ref<HTMLElement> element = HTMLElement::create(name, document);

auto

> Source/WebCore/dom/Document.cpp:1101
> +        return *element;

return element.releaseNonNull();

> Source/WebCore/page/DOMWindow.h:426
> +        mutable RefPtr<CustomElementsRegistry> m_customElementsRegistry;

Does not look like you need the mutable since your methods are non-const?
Comment 10 Ryosuke Niwa 2016-08-10 14:39:32 PDT
Comment on attachment 285717 [details]
Fix GTK+/EFL builds

View in context: https://bugs.webkit.org/attachment.cgi?id=285717&action=review

>> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:42
>> +{
> 
> This function should throw if given less than 2 parameters:
>     if (UNLIKELY(state.argumentCount() < 2))
>         return state.vm().throwException(&state, createNotEnoughArgumentsError(&state));
> 
> You can then use uncheckedArgument() below instead of argument().

Done.

>> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:43
>> +    AtomicString tagName(state.argument(0).toString(&state)->toAtomicString(&state));
> 
> Isn't this a local name rather than a qualified name ? If so, I would suggest naming this variable localName or simply name as in the spec. tagName is a bit confusing to me because I think of a qualified name (https://dom.spec.whatwg.org/#dom-element-tagname).

Fixed.

>> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:47
>> +    JSObject* object = state.argument(1).getObject();
> 
> How about we call this 'constructor' rather than 'object' ?

Sure.

>> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:49
>> +    if (!object || object->methodTable()->getConstructData(object, callData) == ConstructType::None)
> 
> Instead of all this, I think we should be able to use JSValue::isFunction(). We should probably pass a JSFunction* to the implementation instead of a JSObject* for clarity.

object being a function isn't sufficient.  We need to use JSValue::isConstructor instead.
I'm going to keep JSObject* for now since changing this would require adding a lot more code.

>> Source/WebCore/bindings/js/JSCustomElementsRegistryCustom.cpp:51
>> +
> 
> It looks like we may be missing step 2 in the spec?
> "If constructor is either an interface object or named constructor, whose corresponding interface either is HTMLElement or has HTMLElement in its set of inherited interfaces, throw a TypeError and abort these steps."
> 
> We should at least add a FIXME. I am not sure how easy it is to detect our interface objects at the moment so we can look into it separately.

Added a FIXME.  In general, I'm keeping the original behavior we had instead of updating this function to the spec
since that would require a lot of code changes.

>> Source/WebCore/dom/CustomElementsRegistry.h:48
>> +    WTF_MAKE_FAST_ALLOCATED;
> 
> Redundant since this subclasses RefCounted.

Removed.

>> Source/WebCore/dom/CustomElementsRegistry.h:53
>> +    RefPtr<Element> constructElement(const AtomicString&);
> 
> I cannot find the implementation for this method? In particular, I was curious why this returned a RefPtr<> and not a Ref<>.

Oops, I forgot to remove this. Done.

>> Source/WebCore/dom/CustomElementsRegistry.h:66
>> +    HashMap<AtomicString, Vector<RefPtr<Element>>> m_upgradeCandidatesMap;
> 
> Could this be a Vector of Ref<Element> ?

No, Vector doesn't support Ref in them.

>> Source/WebCore/dom/Document.cpp:883
>> +static ALWAYS_INLINE RefPtr<HTMLElement> createUpgradeCandidateElement(Document& document, DOMWindow* window, const QualifiedName& name)
> 
> Why ALWAYS_INLINE?

This is needed for performance.

>> Source/WebCore/dom/Document.cpp:897
>>  static RefPtr<Element> createHTMLElementWithNameValidation(Document& document, const AtomicString& localName, ExceptionCode& ec)
> 
> Can this return a RefPtr<HTMLElement> ?

This requires constructElement returning HTMLElement so I'm gonna do that in a separate patch.

>> Source/WebCore/page/DOMWindow.h:426
>> +        mutable RefPtr<CustomElementsRegistry> m_customElementsRegistry;
> 
> Does not look like you need the mutable since your methods are non-const?

Fixed.
Comment 11 Ryosuke Niwa 2016-08-10 14:40:16 PDT
Created attachment 285762 [details]
Fixed builds and addressed review comments
Comment 12 Ryosuke Niwa 2016-08-10 14:47:32 PDT
Created attachment 285765 [details]
Updated for TOT
Comment 13 Ryosuke Niwa 2016-08-10 15:18:27 PDT
Created attachment 285769 [details]
Another build fix
Comment 14 Chris Dumez 2016-08-10 18:41:32 PDT
Comment on attachment 285769 [details]
Another build fix

View in context: https://bugs.webkit.org/attachment.cgi?id=285769&action=review

r=me

> Source/WebCore/dom/CustomElementsRegistry.idl:28
> +    JSGenerateToNativeObject,

I think you missed my previous review comment about this being redundant since this interface has no parent.
Comment 15 Ryosuke Niwa 2016-08-10 18:43:59 PDT
(In reply to comment #14)
> Comment on attachment 285769 [details]
> Another build fix
> 
> View in context:
> https://bugs.webkit.org/attachment.cgi?id=285769&action=review
> 
> r=me
> 
> > Source/WebCore/dom/CustomElementsRegistry.idl:28
> > +    JSGenerateToNativeObject,
> 
> I think you missed my previous review comment about this being redundant
> since this interface has no parent.

The thing doesn't build without this.
Comment 16 Chris Dumez 2016-08-10 18:48:11 PDT
Comment on attachment 285769 [details]
Another build fix

View in context: https://bugs.webkit.org/attachment.cgi?id=285769&action=review

>>> Source/WebCore/dom/CustomElementsRegistry.idl:28
>>> +    JSGenerateToNativeObject,
>> 
>> I think you missed my previous review comment about this being redundant since this interface has no parent.
> 
> The thing doesn't build without this.

Very weird... Ok then.
Comment 17 WebKit Commit Bot 2016-08-10 19:09:48 PDT
Comment on attachment 285769 [details]
Another build fix

Clearing flags on attachment: 285769

Committed r204367: <http://trac.webkit.org/changeset/204367>
Comment 18 WebKit Commit Bot 2016-08-10 19:09:57 PDT
All reviewed patches have been landed.  Closing bug.
Comment 19 Ryosuke Niwa 2016-09-01 16:16:07 PDT
<rdar://problem/28090367>