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

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

Issue 2170383002: CustomElements: adopt node (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: layout test went from bad to good, deleting failure expectation Created 4 years, 4 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/ScriptCustomElementDefinition.h" 5 #include "bindings/core/v8/ScriptCustomElementDefinition.h"
6 6
7 #include "bindings/core/v8/ScriptState.h" 7 #include "bindings/core/v8/ScriptState.h"
8 #include "bindings/core/v8/V8Binding.h" 8 #include "bindings/core/v8/V8Binding.h"
9 #include "bindings/core/v8/V8BindingMacros.h" 9 #include "bindings/core/v8/V8BindingMacros.h"
10 #include "bindings/core/v8/V8CustomElementsRegistry.h" 10 #include "bindings/core/v8/V8CustomElementsRegistry.h"
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 } 100 }
101 101
102 ScriptCustomElementDefinition* ScriptCustomElementDefinition::create( 102 ScriptCustomElementDefinition* ScriptCustomElementDefinition::create(
103 ScriptState* scriptState, 103 ScriptState* scriptState,
104 CustomElementsRegistry* registry, 104 CustomElementsRegistry* registry,
105 const CustomElementDescriptor& descriptor, 105 const CustomElementDescriptor& descriptor,
106 const v8::Local<v8::Object>& constructor, 106 const v8::Local<v8::Object>& constructor,
107 const v8::Local<v8::Object>& prototype, 107 const v8::Local<v8::Object>& prototype,
108 const v8::Local<v8::Function>& connectedCallback, 108 const v8::Local<v8::Function>& connectedCallback,
109 const v8::Local<v8::Function>& disconnectedCallback, 109 const v8::Local<v8::Function>& disconnectedCallback,
110 const v8::Local<v8::Function>& adoptedCallback,
110 const v8::Local<v8::Function>& attributeChangedCallback, 111 const v8::Local<v8::Function>& attributeChangedCallback,
111 const HashSet<AtomicString>& observedAttributes) 112 const HashSet<AtomicString>& observedAttributes)
112 { 113 {
113 ScriptCustomElementDefinition* definition = 114 ScriptCustomElementDefinition* definition =
114 new ScriptCustomElementDefinition( 115 new ScriptCustomElementDefinition(
115 scriptState, 116 scriptState,
116 descriptor, 117 descriptor,
117 constructor, 118 constructor,
118 prototype, 119 prototype,
119 connectedCallback, 120 connectedCallback,
120 disconnectedCallback, 121 disconnectedCallback,
122 adoptedCallback,
121 attributeChangedCallback, 123 attributeChangedCallback,
122 observedAttributes); 124 observedAttributes);
123 125
124 // Add a constructor -> name mapping to the registry. 126 // Add a constructor -> name mapping to the registry.
125 v8::Local<v8::Value> nameValue = 127 v8::Local<v8::Value> nameValue =
126 v8String(scriptState->isolate(), descriptor.name()); 128 v8String(scriptState->isolate(), descriptor.name());
127 v8::Local<v8::Map> map = 129 v8::Local<v8::Map> map =
128 ensureCustomElementsRegistryMap(scriptState, registry); 130 ensureCustomElementsRegistryMap(scriptState, registry);
129 v8CallOrCrash(map->Set(scriptState->context(), constructor, nameValue)); 131 v8CallOrCrash(map->Set(scriptState->context(), constructor, nameValue));
130 definition->m_constructor.setPhantom(); 132 definition->m_constructor.setPhantom();
131 133
132 // We add the prototype and callbacks here to keep them alive. We use the 134 // We add the prototype and callbacks here to keep them alive. We use the
133 // name as the key because it is unique per-registry. 135 // name as the key because it is unique per-registry.
134 v8::Local<v8::Array> array = v8::Array::New(scriptState->isolate(), 4); 136 v8::Local<v8::Array> array = v8::Array::New(scriptState->isolate(), 5);
135 keepAlive(array, 0, prototype, definition->m_prototype, scriptState); 137 keepAlive(array, 0, prototype, definition->m_prototype, scriptState);
136 keepAlive(array, 1, connectedCallback, definition->m_connectedCallback, scri ptState); 138 keepAlive(array, 1, connectedCallback, definition->m_connectedCallback, scri ptState);
137 keepAlive(array, 2, disconnectedCallback, definition->m_disconnectedCallback , scriptState); 139 keepAlive(array, 2, disconnectedCallback, definition->m_disconnectedCallback , scriptState);
138 keepAlive(array, 3, attributeChangedCallback, definition->m_attributeChanged Callback, scriptState); 140 keepAlive(array, 3, attributeChangedCallback, definition->m_attributeChanged Callback, scriptState);
141 keepAlive(array, 4, adoptedCallback, definition->m_adoptedCallback, scriptSt ate);
dominicc (has gone to gerrit) 2016/08/03 07:56:56 Not important but might be nice to put these in a
139 v8CallOrCrash(map->Set(scriptState->context(), nameValue, array)); 142 v8CallOrCrash(map->Set(scriptState->context(), nameValue, array));
140 143
141 return definition; 144 return definition;
142 } 145 }
143 146
144 ScriptCustomElementDefinition::ScriptCustomElementDefinition( 147 ScriptCustomElementDefinition::ScriptCustomElementDefinition(
145 ScriptState* scriptState, 148 ScriptState* scriptState,
146 const CustomElementDescriptor& descriptor, 149 const CustomElementDescriptor& descriptor,
147 const v8::Local<v8::Object>& constructor, 150 const v8::Local<v8::Object>& constructor,
148 const v8::Local<v8::Object>& prototype, 151 const v8::Local<v8::Object>& prototype,
149 const v8::Local<v8::Function>& connectedCallback, 152 const v8::Local<v8::Function>& connectedCallback,
150 const v8::Local<v8::Function>& disconnectedCallback, 153 const v8::Local<v8::Function>& disconnectedCallback,
154 const v8::Local<v8::Function>& adoptedCallback,
151 const v8::Local<v8::Function>& attributeChangedCallback, 155 const v8::Local<v8::Function>& attributeChangedCallback,
152 const HashSet<AtomicString>& observedAttributes) 156 const HashSet<AtomicString>& observedAttributes)
153 : CustomElementDefinition(descriptor, observedAttributes) 157 : CustomElementDefinition(descriptor, observedAttributes)
154 , m_scriptState(scriptState) 158 , m_scriptState(scriptState)
155 , m_constructor(scriptState->isolate(), constructor) 159 , m_constructor(scriptState->isolate(), constructor)
156 { 160 {
157 } 161 }
158 162
159 HTMLElement* ScriptCustomElementDefinition::createElementSync( 163 HTMLElement* ScriptCustomElementDefinition::createElementSync(
160 Document& document, const QualifiedName& tagName, 164 Document& document, const QualifiedName& tagName,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 // catch it. The side effect is to report the error. 228 // catch it. The side effect is to report the error.
225 v8::TryCatch tryCatch(isolate); 229 v8::TryCatch tryCatch(isolate);
226 tryCatch.SetVerbose(true); 230 tryCatch.SetVerbose(true);
227 231
228 Element* result = runConstructor(); 232 Element* result = runConstructor();
229 233
230 // To report exception thrown from runConstructor() 234 // To report exception thrown from runConstructor()
231 if (tryCatch.HasCaught()) 235 if (tryCatch.HasCaught())
232 return false; 236 return false;
233 237
234 // To report InvalidStateError Exception, when the constructor returns some differnt object 238 // To report InvalidStateError Exception, when the constructor returns some different object
235 if (result != element) { 239 if (result != element) {
236 const String& message = "custom element constructors must call super() f irst and must " 240 const String& message = "custom element constructors must call super() f irst and must "
237 "not return a different object"; 241 "not return a different object";
238
239 std::unique_ptr<SourceLocation> location = SourceLocation::fromFunction( constructor().As<v8::Function>()); 242 std::unique_ptr<SourceLocation> location = SourceLocation::fromFunction( constructor().As<v8::Function>());
240 v8::Local<v8::Value> exception = V8ThrowException::createDOMException( 243 v8::Local<v8::Value> exception = V8ThrowException::createDOMException(
241 m_scriptState->isolate(), 244 m_scriptState->isolate(),
242 InvalidStateError, 245 InvalidStateError,
243 message, 246 message,
244 constructor()); 247 constructor());
245 fireErrorEvent(m_scriptState.get(), message, exception, std::move(locati on)); 248 fireErrorEvent(m_scriptState.get(), message, exception, std::move(locati on));
246 return false; 249 return false;
247 } 250 }
248 251
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 bool ScriptCustomElementDefinition::hasConnectedCallback() const 299 bool ScriptCustomElementDefinition::hasConnectedCallback() const
297 { 300 {
298 return !m_connectedCallback.isEmpty(); 301 return !m_connectedCallback.isEmpty();
299 } 302 }
300 303
301 bool ScriptCustomElementDefinition::hasDisconnectedCallback() const 304 bool ScriptCustomElementDefinition::hasDisconnectedCallback() const
302 { 305 {
303 return !m_disconnectedCallback.isEmpty(); 306 return !m_disconnectedCallback.isEmpty();
304 } 307 }
305 308
309 bool ScriptCustomElementDefinition::hasAdoptedCallback() const
310 {
311 return !m_adoptedCallback.isEmpty();
312 }
313
306 void ScriptCustomElementDefinition::runCallback( 314 void ScriptCustomElementDefinition::runCallback(
307 v8::Local<v8::Function> callback, 315 v8::Local<v8::Function> callback,
308 Element* element, int argc, v8::Local<v8::Value> argv[]) 316 Element* element, int argc, v8::Local<v8::Value> argv[])
309 { 317 {
310 DCHECK(ScriptState::current(m_scriptState->isolate()) == m_scriptState); 318 DCHECK(ScriptState::current(m_scriptState->isolate()) == m_scriptState);
311 v8::Isolate* isolate = m_scriptState->isolate(); 319 v8::Isolate* isolate = m_scriptState->isolate();
312 320
313 // Invoke custom element reactions 321 // Invoke custom element reactions
314 // https://html.spec.whatwg.org/multipage/scripting.html#invoke-custom-eleme nt-reactions 322 // https://html.spec.whatwg.org/multipage/scripting.html#invoke-custom-eleme nt-reactions
315 // If this throws any exception, then report the exception. 323 // If this throws any exception, then report the exception.
(...skipping 21 matching lines...) Expand all
337 345
338 void ScriptCustomElementDefinition::runDisconnectedCallback(Element* element) 346 void ScriptCustomElementDefinition::runDisconnectedCallback(Element* element)
339 { 347 {
340 if (!m_scriptState->contextIsValid()) 348 if (!m_scriptState->contextIsValid())
341 return; 349 return;
342 ScriptState::Scope scope(m_scriptState.get()); 350 ScriptState::Scope scope(m_scriptState.get());
343 v8::Isolate* isolate = m_scriptState->isolate(); 351 v8::Isolate* isolate = m_scriptState->isolate();
344 runCallback(m_disconnectedCallback.newLocal(isolate), element); 352 runCallback(m_disconnectedCallback.newLocal(isolate), element);
345 } 353 }
346 354
355 void ScriptCustomElementDefinition::runAdoptedCallback(Element* element)
356 {
357 if (!m_scriptState->contextIsValid())
358 return;
359 ScriptState::Scope scope(m_scriptState.get());
360 v8::Isolate* isolate = m_scriptState->isolate();
361 runCallback(m_adoptedCallback.newLocal(isolate), element);
362 }
363
347 void ScriptCustomElementDefinition::runAttributeChangedCallback( 364 void ScriptCustomElementDefinition::runAttributeChangedCallback(
348 Element* element, const QualifiedName& name, 365 Element* element, const QualifiedName& name,
349 const AtomicString& oldValue, const AtomicString& newValue) 366 const AtomicString& oldValue, const AtomicString& newValue)
350 { 367 {
351 if (!m_scriptState->contextIsValid()) 368 if (!m_scriptState->contextIsValid())
352 return; 369 return;
353 ScriptState::Scope scope(m_scriptState.get()); 370 ScriptState::Scope scope(m_scriptState.get());
354 v8::Isolate* isolate = m_scriptState->isolate(); 371 v8::Isolate* isolate = m_scriptState->isolate();
355 const int argc = 4; 372 const int argc = 4;
356 v8::Local<v8::Value> argv[argc] = { 373 v8::Local<v8::Value> argv[argc] = {
357 v8String(isolate, name.localName()), 374 v8String(isolate, name.localName()),
358 v8StringOrNull(isolate, oldValue), 375 v8StringOrNull(isolate, oldValue),
359 v8StringOrNull(isolate, newValue), 376 v8StringOrNull(isolate, newValue),
360 v8String(isolate, name.namespaceURI()), 377 v8String(isolate, name.namespaceURI()),
361 }; 378 };
362 runCallback(m_attributeChangedCallback.newLocal(isolate), element, 379 runCallback(m_attributeChangedCallback.newLocal(isolate), element,
363 argc, argv); 380 argc, argv);
364 } 381 }
365 382
366 } // namespace blink 383 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698