 Chromium Code Reviews
 Chromium Code Reviews Issue 2024073002:
  Add callbacks to ScriptCustomElementDefinition  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 2024073002:
  Add callbacks to ScriptCustomElementDefinition  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| 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..005978825db3617a0feecd4d756046d61a22afc2 100644 | 
| --- a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp | 
| +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinitionBuilder.cpp | 
| @@ -60,17 +60,21 @@ bool ScriptCustomElementDefinitionBuilder::checkConstructorNotRegistered() | 
| return true; | 
| } | 
| 
haraken
2016/06/06 01:39:15
I'd change 'char*' in this file with 'String'.
 
kojii
2016/06/06 11:12:35
Done.
 | 
| -bool ScriptCustomElementDefinitionBuilder::checkPrototype() | 
| +bool ScriptCustomElementDefinitionBuilder::valueForName( | 
| + const v8::Local<v8::Object>& object, const char* name, | 
| + v8::Local<v8::Value>& value) const | 
| { | 
| v8::Isolate* isolate = m_scriptState->isolate(); | 
| v8::Local<v8::Context> context = m_scriptState->context(); | 
| - v8::Local<v8::String> prototypeString = | 
| - v8AtomicString(isolate, "prototype"); | 
| + v8::Local<v8::String> nameString = v8AtomicString(isolate, name); | 
| + return v8Call(object->Get(context, nameString), value); | 
| +} | 
| + | 
| +bool ScriptCustomElementDefinitionBuilder::checkPrototype() | 
| +{ | 
| v8::Local<v8::Value> prototypeValue; | 
| - if (!v8Call( | 
| - m_constructor->Get(context, prototypeString), prototypeValue)) { | 
| + if (!valueForName(m_constructor, "prototype", prototypeValue)) | 
| return false; | 
| - } | 
| if (!prototypeValue->IsObject()) { | 
| m_exceptionState.throwTypeError( | 
| "constructor prototype is not an object"); | 
| @@ -82,6 +86,60 @@ bool ScriptCustomElementDefinitionBuilder::checkPrototype() | 
| return true; | 
| } | 
| +bool ScriptCustomElementDefinitionBuilder::callableForName(const char* name, | 
| + v8::Local<v8::Object>& callback) const | 
| +{ | 
| + v8::Local<v8::Value> value; | 
| + if (!valueForName(m_prototype, name, value)) | 
| + return false; | 
| + if (value->IsUndefined()) | 
| + return true; | 
| 
haraken
2016/06/06 01:39:15
Just to confirm: You want to return true for undef
 
kojii
2016/06/06 11:12:34
Yes:
Undefined or IsCallable -> true (success)
Oth
 | 
| + if (!value->IsObject()) { | 
| + m_exceptionState.throwTypeError( | 
| + String::format("\"%s\" is not an object", name)); | 
| + return false; | 
| + } | 
| + callback = value.As<v8::Object>(); | 
| + if (!callback->IsCallable()) { | 
| + m_exceptionState.throwTypeError( | 
| + String::format("\"%s\" is not callable", name)); | 
| + return false; | 
| + } | 
| + return true; | 
| +} | 
| + | 
| +bool ScriptCustomElementDefinitionBuilder::cacheObservedAttributes() | 
| +{ | 
| + const char* kObservedAttributes = "observedAttributes"; | 
| + v8::Local<v8::Value> observedAttributesValue; | 
| + if (!valueForName(m_constructor, kObservedAttributes, observedAttributesValue)) | 
| + return false; | 
| + if (observedAttributesValue->IsUndefined()) | 
| + return true; | 
| + Vector<AtomicString> list = toImplArray<Vector<AtomicString>>( | 
| + observedAttributesValue, 0, m_scriptState->isolate(), m_exceptionState); | 
| + if (m_exceptionState.hadException()) | 
| + return false; | 
| + if (list.isEmpty()) | 
| + return true; | 
| + m_observedAttributes.reserveCapacityForSize(list.size()); | 
| + for (const auto& attribute : list) | 
| + m_observedAttributes.add(attribute); | 
| + return true; | 
| +} | 
| + | 
| +bool ScriptCustomElementDefinitionBuilder::cacheProperties() | 
| 
haraken
2016/06/06 01:39:15
I'm a bit confused with the name "cacheProperties"
 
kojii
2016/06/06 11:12:35
This method retrieves values and keep it in member
 
haraken
2016/06/06 11:45:52
rememberOriginalProperties ?
Also add a comment a
 | 
| +{ | 
| + | 
| + const char* kConnectedCallback = "connectedCallback"; | 
| + const char* kDisconnectedCallback = "disconnectedCallback"; | 
| + const char* kAttributeChangedCallback = "attributeChangedCallback"; | 
| + return cacheObservedAttributes() | 
| + && callableForName(kConnectedCallback, m_connectedCallback) | 
| + && callableForName(kDisconnectedCallback, m_disconnectedCallback) | 
| + && callableForName(kAttributeChangedCallback, m_attributeChangedCallback); | 
| +} | 
| + | 
| CustomElementDefinition* ScriptCustomElementDefinitionBuilder::build( | 
| const CustomElementDescriptor& descriptor) | 
| { | 
| @@ -90,7 +148,11 @@ CustomElementDefinition* ScriptCustomElementDefinitionBuilder::build( | 
| m_registry, | 
| descriptor, | 
| m_constructor, | 
| - m_prototype); | 
| + m_prototype, | 
| + m_connectedCallback, | 
| + m_disconnectedCallback, | 
| + m_attributeChangedCallback, | 
| + m_observedAttributes); | 
| } | 
| } // namespace blink |