394 def _GenerateCPPHeader(self):
395 to_native_emitter = emitter.Emitter()
396 if self._interface_type_info.custom_to_native():
397 return_type = 'PassRefPtr<NativeType>'
398 to_native_body = ';'
399 to_native_arg_body = ';'
400 else:
401 return_type = 'NativeType*'
402 to_native_body = emitter.Format(
403 '\n'
404 ' {\n'
405 ' DartDOMData* domData = DartDOMData::current();\n'
406 ' return DartDOMWrapper::unwrapDartWrapper<Dart$INTERFACE>(domData, handle, exception);\n'
407 ' }',
408 INTERFACE=self._interface.id)
409 to_native_arg_body = emitter.Format(
410 '\n'
411 ' {\n'
412 ' return DartDOMWrapper::unwrapDartWrapper<Dart$INTERFACE>(args, index, exception);\n'
413 ' }',
414 INTERFACE=self._interface.id)
415
416 to_native_emitter.Emit(
417 ' static $RETURN_TYPE toNative(Dart_Handle handle, Dart_Handle& exception)$TO_NATIVE_BODY\n'
418 '\n'
419 ' static $RETURN_TYPE toNativeWithNullCheck(Dart_Handle handle, Dart_Handle& exception)\n'
420 ' {\n'
421 ' return Dart_IsNull(handle) ? 0 : toNative(handle, exception);\n'
422 ' }\n'
423 '\n'
424 ' static $RETURN_TYPE toNative(Dart_NativeArguments args, int index, Dart_Handle& exception)$TO_NATIVE_ARG_BODY\n'
425 '\n'
426 ' static $RETURN_TYPE toNativeWithNullCheck(Dart_NativeArguments args, int index, Dart_Handle& exception)\n'
427 ' {\n'
428 ' // toNative accounts for Null objects also.\n'
429 ' return toNative(args, index, exception);\n'
430 ' }\n',
431 RETURN_TYPE=return_type,
432 TO_NATIVE_BODY=to_native_body,
433 TO_NATIVE_ARG_BODY=to_native_arg_body,
434 INTERFACE=self._interface.id)
435
436 to_dart_emitter = emitter.Emitter()
437
438 ext_attrs = self._interface.ext_attrs
439
440 to_dart_emitter.Emit(
441 ' static Dart_Handle toDart(NativeType* value)\n'
442 ' {\n'
443 ' if (!value)\n'
444 ' return Dart_Null();\n'
445 ' DartDOMData* domData = DartDOMData::current();\n'
446 ' Dart_WeakPersistentHandle result =\n'
447 ' DartDOMWrapper::lookupWrapper<Dart$(INTERFACE)>(domData, value);\n'
448 ' if (result)\n'
449 ' return Dart_HandleFromWeakPersistent(result);\n'
450 ' return createWrapper(domData, value);\n'
451 ' }\n'
452 ' static void returnToDart(Dart_NativeArguments args,\n'
453 ' NativeType* value,\n'
454 ' bool autoDartScope = true)\n'
455 ' {\n'
456 ' if (value) {\n'
457 ' DartDOMData* domData = static_cast<DartDOMData*>(\n'
458 ' Dart_GetNativeIsolateData(args));\n'
459 ' Dart_WeakPersistentHandle result =\n'
460 ' DartDOMWrapper::lookupWrapper<Dart$(INTERFACE)>(domData, value);\n'
461 ' if (result)\n'
462 ' Dart_SetWeakHandleReturnValue(args, result);\n'
463 ' else {\n'
464 ' if (autoDartScope) {\n'
465 ' Dart_SetReturnValue(args, createWrapper(domData, value));\n'
466 ' } else {\n'
467 ' DartApiScope apiScope;\n'
468 ' Dart_SetReturnValue(args, createWrapper(domData, value));\n'
469 ' }\n'
470 ' }\n'
471 ' }\n'
472 ' }\n',
473 INTERFACE=self._interface.id)
474
475 if ('CustomToV8' in ext_attrs or 'PureInterface' in ext_attrs or
476 'CPPPureInterface' in ext_attrs or
477 'SpecialWrapFor' in ext_attrs or
478 ('Custom' in ext_attrs and ext_attrs['Custom'] == 'Wrap') or
479 ('Custom' in ext_attrs and ext_attrs['Custom'] == 'ToV8') or
480 self._interface_type_info.custom_to_dart()):
481 to_dart_emitter.Emit(
482 ' static Dart_Handle createWrapper(DartDOMData* domData, NativeType* value);\n'
483 )
484 else:
485 to_dart_emitter.Emit(
486 ' static Dart_Handle createWrapper(DartDOMData* domData, NativeType* value)\n'
487 ' {\n'
488 ' return DartDOMWrapper::createWrapper<Dart$(INTERFACE)>(domData, value, Dart$(INTERFACE)::dartClassId);\n'
489 ' }\n',
490 INTERFACE=self._interface.id)
491
492 webcore_includes = self._GenerateCPPIncludes(
493 self._interface_type_info.webcore_includes())
494
495 is_node_test = lambda interface: interface.id == 'Node'
496 is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs
497 is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs
498
499 def TypeCheckHelper(test):
500 return 'true' if any(
501 map(test, self._database.Hierarchy(
502 self._interface))) else 'false'
503
504 to_active_emitter = emitter.Emitter()
505 to_node_emitter = emitter.Emitter()
506 to_event_target_emitter = emitter.Emitter()
507
508 if (any(map(is_active_test,
509 self._database.Hierarchy(self._interface)))):
510 to_active_emitter.Emit('return toNative(value);')
511 else:
512 to_active_emitter.Emit('return 0;')
513
514 if (any(map(is_node_test, self._database.Hierarchy(self._interface)))):
515 to_node_emitter.Emit('return toNative(value);')
516 else:
517 to_node_emitter.Emit('return 0;')
518
519 if (any(
520 map(is_event_target_test,
521 self._database.Hierarchy(self._interface)))):
522 to_event_target_emitter.Emit('return toNative(value);')
523 else:
524 to_event_target_emitter.Emit('return 0;')
525
526 v8_interface_include = ''
527
528 if self._interface.id != 'AbstractWorker':
529
530 v8_interface_include = '#include "V8%s.h"' % (self._interface.id)
531
532 self._cpp_header_emitter.Emit(
533 self._template_loader.Load('cpp_header.template'),
534 INTERFACE=self._interface.id,
535 WEBCORE_INCLUDES=webcore_includes,
536 V8_INTERFACE_INCLUDE=v8_interface_include,
537 WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
538 WEBCORE_CLASS_NAME_ESCAPED=self._interface_type_info.native_type().
539 replace('<', '_').replace('>', '_'),
540 DECLARATIONS=self._cpp_declarations_emitter.Fragments(),
541 IS_NODE=TypeCheckHelper(is_node_test),
542 IS_ACTIVE=TypeCheckHelper(is_active_test),
543 IS_EVENT_TARGET=TypeCheckHelper(is_event_target_test),
544 TO_NODE=to_node_emitter.Fragments(),
545 TO_ACTIVE=to_active_emitter.Fragments(),
546 TO_EVENT_TARGET=to_event_target_emitter.Fragments(),
547 TO_NATIVE=to_native_emitter.Fragments(),
548 TO_DART=to_dart_emitter.Fragments())
549