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

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: fix tests Created 4 years, 1 month 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 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 428
429 {##############################################################################} 429 {##############################################################################}
430 {% macro generate_post_message_impl(method) %} 430 {% macro generate_post_message_impl(method) %}
431 static void postMessageImpl(const char* interfaceName, {{cpp_class}}* instance, const v8::FunctionCallbackInfo<v8::Value>& info) 431 static void postMessageImpl(const char* interfaceName, {{cpp_class}}* instance, const v8::FunctionCallbackInfo<v8::Value>& info)
432 { 432 {
433 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCo ntext, interfaceName, "postMessage"); 433 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCo ntext, interfaceName, "postMessage");
434 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { 434 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) {
435 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments({{me thod.number_of_required_arguments}}, info.Length())); 435 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments({{me thod.number_of_required_arguments}}, info.Length()));
436 return; 436 return;
437 } 437 }
438
438 Transferables transferables; 439 Transferables transferables;
439 if (info.Length() > 1) { 440 if (info.Length() > 1) {
440 const int transferablesArgIndex = 1; 441 const int transferablesArgIndex = 1;
441 if (!SerializedScriptValue::extractTransferables(info.GetIsolate(), info [transferablesArgIndex], transferablesArgIndex, transferables, exceptionState)) { 442 if (!SerializedScriptValue::extractTransferables(info.GetIsolate(), info [transferablesArgIndex], transferablesArgIndex, transferables, exceptionState)) {
442 return; 443 return;
443 } 444 }
444 } 445 }
445 RefPtr<SerializedScriptValue> message = SerializedScriptValue::serialize(inf o.GetIsolate(), info[0], &transferables, nullptr, exceptionState); 446
446 if (exceptionState.hadException()) 447 RefPtr<SerializedScriptValue> message;
447 return; 448 if (instance->canTransferArrayBuffer()) {
449 // This instance supports sending array buffers by move semantics.
450 message = SerializedScriptValue::serialize(info.GetIsolate(), info[0], & transferables, nullptr, exceptionState);
451 if (exceptionState.hadException())
452 return;
453 } else {
454 // This instance doesn't support sending array buffers by move
455 // semantics. Emulate it by copy-and-neuter semantics that sends array
456 // buffers by copy semantics and then neuters the original array
457 // buffers.
458
459 // Clear references to array buffers from transferables so that the
460 // serializer can consider the array buffers as non-transferable and
461 // copy them into the message.
462 ArrayBufferArray transferableArrayBuffers = transferables.arrayBuffers;
463 transferables.arrayBuffers.clear();
464 message = SerializedScriptValue::serialize(info.GetIsolate(), info[0], & transferables, nullptr, exceptionState);
465 if (exceptionState.hadException())
466 return;
467
468 // Neuter the original array buffers on the sender context.
469 SerializedScriptValue::transferArrayBufferContents(info.GetIsolate(), tr ansferableArrayBuffers, exceptionState);
470 if (exceptionState.hadException())
471 return;
472 }
473
448 // FIXME: Only pass context/exceptionState if instance really requires it. 474 // FIXME: Only pass context/exceptionState if instance really requires it.
449 ExecutionContext* context = currentExecutionContext(info.GetIsolate()); 475 ExecutionContext* context = currentExecutionContext(info.GetIsolate());
450 instance->postMessage(context, message.release(), transferables.messagePorts , exceptionState); 476 instance->postMessage(context, message.release(), transferables.messagePorts , exceptionState);
451 } 477 }
452 {% endmacro %} 478 {% endmacro %}
453 479
454 480
455 {##############################################################################} 481 {##############################################################################}
456 {% macro method_callback(method, world_suffix) %} 482 {% macro method_callback(method, world_suffix) %}
457 void {{method.name}}MethodCallback{{world_suffix}}(const v8::FunctionCallbackInf o<v8::Value>& info) 483 void {{method.name}}MethodCallback{{world_suffix}}(const v8::FunctionCallbackInf o<v8::Value>& info)
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 if method.overloads else 678 if method.overloads else
653 method.runtime_enabled_function) %} 679 method.runtime_enabled_function) %}
654 const V8DOMConfiguration::MethodConfiguration {{method.name}}MethodConfiguration = {{method_configuration(method)}}; 680 const V8DOMConfiguration::MethodConfiguration {{method.name}}MethodConfiguration = {{method_configuration(method)}};
655 V8DOMConfiguration::installMethod(isolate, world, v8::Local<v8::Object>(), proto typeObject, interfaceObject, signature, {{method.name}}MethodConfiguration); 681 V8DOMConfiguration::installMethod(isolate, world, v8::Local<v8::Object>(), proto typeObject, interfaceObject, signature, {{method.name}}MethodConfiguration);
656 {% endfilter %}{# runtime_enabled() #} 682 {% endfilter %}{# runtime_enabled() #}
657 {% endfilter %}{# exposed() #} 683 {% endfilter %}{# exposed() #}
658 {% endfilter %}{# secure_context() #} 684 {% endfilter %}{# secure_context() #}
659 {% endfor %} 685 {% endfor %}
660 {% endif %} 686 {% endif %}
661 {%- endmacro %} 687 {%- endmacro %}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698