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

Side by Side Diff: third_party/WebKit/Source/bindings/templates/methods.cpp.tmpl

Issue 2414333003: WebMessaging: Send transferable ArrayBuffers by copy-and-neuter semantics (Closed)
Patch Set: remake Created 4 years, 2 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 {% from 'utilities.cpp.tmpl' import declare_enum_validation_variable, v8_value_t o_local_cpp_value %} 1 {% from 'utilities.cpp.tmpl' import declare_enum_validation_variable, v8_value_t o_local_cpp_value %}
2 2
3 {##############################################################################} 3 {##############################################################################}
4 {% macro generate_method(method, world_suffix) %} 4 {% macro generate_method(method, world_suffix) %}
5 static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) 5 static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info)
6 {% filter format_remove_duplicates([ 6 {% filter format_remove_duplicates([
7 'ExceptionState exceptionState', 7 'ExceptionState exceptionState',
8 'ScriptState* scriptState = ']) %} 8 'ScriptState* scriptState = ']) %}
9 { 9 {
10 {% set define_exception_state -%} 10 {% set define_exception_state -%}
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 438
439 {##############################################################################} 439 {##############################################################################}
440 {% macro generate_post_message_impl(method) %} 440 {% macro generate_post_message_impl(method) %}
441 static void postMessageImpl(const char* interfaceName, {{cpp_class}}* instance, const v8::FunctionCallbackInfo<v8::Value>& info) 441 static void postMessageImpl(const char* interfaceName, {{cpp_class}}* instance, const v8::FunctionCallbackInfo<v8::Value>& info)
442 { 442 {
443 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCo ntext, interfaceName, "postMessage"); 443 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCo ntext, interfaceName, "postMessage");
444 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { 444 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) {
445 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments({{me thod.number_of_required_arguments}}, info.Length())); 445 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments({{me thod.number_of_required_arguments}}, info.Length()));
446 return; 446 return;
447 } 447 }
448
448 Transferables transferables; 449 Transferables transferables;
449 if (info.Length() > 1) { 450 if (info.Length() > 1) {
450 const int transferablesArgIndex = 1; 451 const int transferablesArgIndex = 1;
451 if (!SerializedScriptValue::extractTransferables(info.GetIsolate(), info [transferablesArgIndex], transferablesArgIndex, transferables, exceptionState)) { 452 if (!SerializedScriptValue::extractTransferables(info.GetIsolate(), info [transferablesArgIndex], transferablesArgIndex, transferables, exceptionState)) {
452 return; 453 return;
453 } 454 }
454 } 455 }
455 RefPtr<SerializedScriptValue> message = SerializedScriptValue::serialize(inf o.GetIsolate(), info[0], &transferables, nullptr, exceptionState); 456
456 if (exceptionState.hadException()) 457 RefPtr<SerializedScriptValue> message;
457 return; 458 if (instance->canTransferArrayBuffer()) {
459 // This instance supports sending array buffers by move semantics.
460 message = SerializedScriptValue::serialize(info.GetIsolate(), info[0], & transferables, nullptr, exceptionState);
461 if (exceptionState.hadException())
462 return;
463 } else {
464 // This instance doesn't support sending array buffers by move
465 // semantics. Emulate it by copy-and-neuter semantics that sends array
466 // buffers by copy semantics and then neuters the original array
467 // buffers.
468
469 // Clear transferable array buffers so that the serializer can handle
470 // them by copy semantics.
471 ArrayBufferArray transferableArrayBuffers = transferables.arrayBuffers;
472 transferables.arrayBuffers.clear();
473 message = SerializedScriptValue::serialize(info.GetIsolate(), info[0], & transferables, nullptr, exceptionState);
474 if (exceptionState.hadException())
475 return;
476
477 // Neuter the original array buffers on the sender context.
478 SerializedScriptValue::transferArrayBufferContents(info.GetIsolate(), tr ansferableArrayBuffers, exceptionState);
479 if (exceptionState.hadException())
480 return;
481 }
482
458 // FIXME: Only pass context/exceptionState if instance really requires it. 483 // FIXME: Only pass context/exceptionState if instance really requires it.
459 ExecutionContext* context = currentExecutionContext(info.GetIsolate()); 484 ExecutionContext* context = currentExecutionContext(info.GetIsolate());
460 instance->postMessage(context, message.release(), transferables.messagePorts , exceptionState); 485 instance->postMessage(context, message.release(), transferables.messagePorts , exceptionState);
461 } 486 }
462 {% endmacro %} 487 {% endmacro %}
463 488
464 489
465 {##############################################################################} 490 {##############################################################################}
466 {% macro method_callback(method, world_suffix) %} 491 {% macro method_callback(method, world_suffix) %}
467 static void {{method.name}}MethodCallback{{world_suffix}}(const v8::FunctionCall backInfo<v8::Value>& info) 492 static void {{method.name}}MethodCallback{{world_suffix}}(const v8::FunctionCall backInfo<v8::Value>& info)
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 if method.overloads else 687 if method.overloads else
663 method.runtime_enabled_function) %} 688 method.runtime_enabled_function) %}
664 const V8DOMConfiguration::MethodConfiguration {{method.name}}MethodConfiguration = {{method_configuration(method)}}; 689 const V8DOMConfiguration::MethodConfiguration {{method.name}}MethodConfiguration = {{method_configuration(method)}};
665 V8DOMConfiguration::installMethod(isolate, world, v8::Local<v8::Object>(), proto typeObject, interfaceObject, signature, {{method.name}}MethodConfiguration); 690 V8DOMConfiguration::installMethod(isolate, world, v8::Local<v8::Object>(), proto typeObject, interfaceObject, signature, {{method.name}}MethodConfiguration);
666 {% endfilter %}{# runtime_enabled() #} 691 {% endfilter %}{# runtime_enabled() #}
667 {% endfilter %}{# exposed() #} 692 {% endfilter %}{# exposed() #}
668 {% endfilter %}{# secure_context() #} 693 {% endfilter %}{# secure_context() #}
669 {% endfor %} 694 {% endfor %}
670 {% endif %} 695 {% endif %}
671 {%- endmacro %} 696 {%- endmacro %}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698