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

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

Issue 2060753002: Implement script-side of callback reactions for Custom Elements V1 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@callback-ce
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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "bindings/core/v8/ScriptCustomElementDefinitionBuilder.h" 5 #include "bindings/core/v8/ScriptCustomElementDefinitionBuilder.h"
6 6
7 #include "bindings/core/v8/DOMWrapperWorld.h" 7 #include "bindings/core/v8/DOMWrapperWorld.h"
8 #include "bindings/core/v8/ExceptionState.h" 8 #include "bindings/core/v8/ExceptionState.h"
9 #include "bindings/core/v8/ScriptCustomElementDefinition.h" 9 #include "bindings/core/v8/ScriptCustomElementDefinition.h"
10 #include "bindings/core/v8/ScriptState.h" 10 #include "bindings/core/v8/ScriptState.h"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 "constructor prototype is not an object"); 106 "constructor prototype is not an object");
107 return false; 107 return false;
108 } 108 }
109 m_prototype = prototypeValue.As<v8::Object>(); 109 m_prototype = prototypeValue.As<v8::Object>();
110 // If retrieving the prototype destroyed the context, indicate that 110 // If retrieving the prototype destroyed the context, indicate that
111 // defining the element should not proceed. 111 // defining the element should not proceed.
112 return true; 112 return true;
113 } 113 }
114 114
115 bool ScriptCustomElementDefinitionBuilder::callableForName(const String& name, 115 bool ScriptCustomElementDefinitionBuilder::callableForName(const String& name,
116 v8::Local<v8::Object>& callback) const 116 v8::Local<v8::Function>& callback) const
117 { 117 {
118 v8::Local<v8::Value> value; 118 v8::Local<v8::Value> value;
119 if (!valueForName(m_prototype, name, value)) 119 if (!valueForName(m_prototype, name, value))
120 return false; 120 return false;
121 // "undefined" means "omitted", so return true. 121 // "undefined" means "omitted", so return true.
122 if (value->IsUndefined()) 122 if (value->IsUndefined())
123 return true; 123 return true;
124 if (!value->IsObject()) { 124 if (!value->IsFunction()) {
125 m_exceptionState.throwTypeError( 125 m_exceptionState.throwTypeError(
126 String::format("\"%s\" is not an object", name.ascii().data())); 126 String::format("\"%s\" is not a callable object", name.ascii().data( )));
127 return false; 127 return false;
128 } 128 }
129 callback = value.As<v8::Object>(); 129 callback = value.As<v8::Function>();
130 if (!callback->IsCallable()) {
131 m_exceptionState.throwTypeError(
132 String::format("\"%s\" is not callable", name.ascii().data()));
133 return false;
134 }
135 return true; 130 return true;
136 } 131 }
137 132
138 bool ScriptCustomElementDefinitionBuilder::retrieveObservedAttributes() 133 bool ScriptCustomElementDefinitionBuilder::retrieveObservedAttributes()
139 { 134 {
140 const String kObservedAttributes = "observedAttributes"; 135 const String kObservedAttributes = "observedAttributes";
141 v8::Local<v8::Value> observedAttributesValue; 136 v8::Local<v8::Value> observedAttributesValue;
142 if (!valueForName(m_constructor, kObservedAttributes, observedAttributesValu e)) 137 if (!valueForName(m_constructor, kObservedAttributes, observedAttributesValu e))
143 return false; 138 return false;
144 if (observedAttributesValue->IsUndefined()) 139 if (observedAttributesValue->IsUndefined())
(...skipping 10 matching lines...) Expand all
155 return true; 150 return true;
156 } 151 }
157 152
158 bool ScriptCustomElementDefinitionBuilder::rememberOriginalProperties() 153 bool ScriptCustomElementDefinitionBuilder::rememberOriginalProperties()
159 { 154 {
160 // Spec requires to use values of these properties at the point 155 // Spec requires to use values of these properties at the point
161 // CustomElementDefinition is built, even if JS changes them afterwards. 156 // CustomElementDefinition is built, even if JS changes them afterwards.
162 const String kConnectedCallback = "connectedCallback"; 157 const String kConnectedCallback = "connectedCallback";
163 const String kDisconnectedCallback = "disconnectedCallback"; 158 const String kDisconnectedCallback = "disconnectedCallback";
164 const String kAttributeChangedCallback = "attributeChangedCallback"; 159 const String kAttributeChangedCallback = "attributeChangedCallback";
165 return retrieveObservedAttributes() 160 return callableForName(kConnectedCallback, m_connectedCallback)
166 && callableForName(kConnectedCallback, m_connectedCallback)
167 && callableForName(kDisconnectedCallback, m_disconnectedCallback) 161 && callableForName(kDisconnectedCallback, m_disconnectedCallback)
168 && callableForName(kAttributeChangedCallback, m_attributeChangedCallback ); 162 && callableForName(kAttributeChangedCallback, m_attributeChangedCallback )
163 && (m_attributeChangedCallback.IsEmpty() || retrieveObservedAttributes() );
169 } 164 }
170 165
171 CustomElementDefinition* ScriptCustomElementDefinitionBuilder::build( 166 CustomElementDefinition* ScriptCustomElementDefinitionBuilder::build(
172 const CustomElementDescriptor& descriptor) 167 const CustomElementDescriptor& descriptor)
173 { 168 {
174 return ScriptCustomElementDefinition::create( 169 return ScriptCustomElementDefinition::create(
175 m_scriptState.get(), 170 m_scriptState.get(),
176 m_registry, 171 m_registry,
177 descriptor, 172 descriptor,
178 m_constructor, 173 m_constructor,
179 m_prototype, 174 m_prototype,
180 m_connectedCallback, 175 m_connectedCallback,
181 m_disconnectedCallback, 176 m_disconnectedCallback,
182 m_attributeChangedCallback, 177 m_attributeChangedCallback,
183 m_observedAttributes); 178 m_observedAttributes);
184 } 179 }
185 180
186 } // namespace blink 181 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698