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

Side by Side Diff: client/dom/scripts/systemnative.py

Issue 9694042: Support CallWith on attributes. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
3 # for details. All rights reserved. Use of this source code is governed by a 3 # for details. All rights reserved. Use of this source code is governed by a
4 # BSD-style license that can be found in the LICENSE file. 4 # BSD-style license that can be found in the LICENSE file.
5 5
6 """This module provides shared functionality for the systems to generate 6 """This module provides shared functionality for the systems to generate
7 native binding from the IDL database.""" 7 native binding from the IDL database."""
8 8
9 import emitter 9 import emitter
10 import os 10 import os
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 WEBCORE_CLASS_NAME=self._interface_type_info.native_type()) 348 WEBCORE_CLASS_NAME=self._interface_type_info.native_type())
349 349
350 self._cpp_header_emitter.Emit( 350 self._cpp_header_emitter.Emit(
351 self._templates.Load('cpp_header.template'), 351 self._templates.Load('cpp_header.template'),
352 INTERFACE=self._interface.id, 352 INTERFACE=self._interface.id,
353 WEBCORE_INCLUDES=webcore_includes, 353 WEBCORE_INCLUDES=webcore_includes,
354 WEBCORE_CLASS_NAME=self._interface_type_info.native_type(), 354 WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
355 TO_DART_VALUE=to_dart_value_emitter.Fragments(), 355 TO_DART_VALUE=to_dart_value_emitter.Fragments(),
356 DECLARATIONS=self._cpp_declarations_emitter.Fragments()) 356 DECLARATIONS=self._cpp_declarations_emitter.Fragments())
357 357
358 def _GenerateCallWithHandling(self, node, parameter_definitions_emitter, argum ents):
359 if 'CallWith' not in node.ext_attrs:
360 return False
361
362 call_with = node.ext_attrs['CallWith']
363 if call_with == 'ScriptExecutionContext':
364 parameter_definitions_emitter.Emit(
365 '\n'
366 ' ScriptExecutionContext* context = DartUtilities::scriptExecut ionContext();\n'
367 ' if (!context)\n'
368 ' return;\n')
369 arguments.append('context')
370 return False
371
372 if call_with == 'ScriptArguments|CallStack':
373 self._cpp_impl_includes.add('DOMWindow')
374 self._cpp_impl_includes.add('ScriptArguments')
375 self._cpp_impl_includes.add('ScriptCallStack')
376 self._cpp_impl_includes.add('V8Proxy')
377 self._cpp_impl_includes.add('v8')
378 parameter_definitions_emitter.Emit(
379 '\n'
380 ' v8::HandleScope handleScope;\n'
381 ' v8::Context::Scope scope(V8Proxy::mainWorldContext(DartUtilit ies::domWindowForCurrentIsolate()->frame()));\n'
382 ' Dart_Handle customArgument = Dart_GetNativeArgument(args, $IN DEX);\n'
383 ' RefPtr<ScriptArguments> scriptArguments(DartUtilities::create ScriptArguments(customArgument, exception));\n'
384 ' if (!scriptArguments)\n'
385 ' goto fail;\n'
386 ' RefPtr<ScriptCallStack> scriptCallStack(DartUtilities::create ScriptCallStack());\n'
387 ' if (!scriptCallStack->size())\n'
388 ' return;\n',
389 INDEX=len(node.arguments))
390 arguments.extend(['scriptArguments', 'scriptCallStack'])
391 return True
392
393 return False
394
358 def AddAttribute(self, getter, setter): 395 def AddAttribute(self, getter, setter):
359 # FIXME: Dartium does not support attribute event listeners. However, JS 396 # FIXME: Dartium does not support attribute event listeners. However, JS
360 # implementation falls back to them when addEventListener is not available. 397 # implementation falls back to them when addEventListener is not available.
361 # Make sure addEventListener is available in all EventTargets and remove 398 # Make sure addEventListener is available in all EventTargets and remove
362 # this check. 399 # this check.
363 if (getter or setter).type.id == 'EventListener': 400 if (getter or setter).type.id == 'EventListener':
364 return 401 return
365 402
366 if 'CheckSecurityForNode' in (getter or setter).ext_attrs: 403 if 'CheckSecurityForNode' in (getter or setter).ext_attrs:
367 # FIXME: exclude from interface as well. 404 # FIXME: exclude from interface as well.
(...skipping 18 matching lines...) Expand all
386 type_info = GetIDLTypeInfo(attr.type.id) 423 type_info = GetIDLTypeInfo(attr.type.id)
387 dart_declaration = '%s get %s()' % ( 424 dart_declaration = '%s get %s()' % (
388 type_info.dart_type(), DartDomNameOfAttribute(attr)) 425 type_info.dart_type(), DartDomNameOfAttribute(attr))
389 is_custom = 'Custom' in attr.ext_attrs or 'CustomGetter' in attr.ext_attrs 426 is_custom = 'Custom' in attr.ext_attrs or 'CustomGetter' in attr.ext_attrs
390 cpp_callback_name = self._GenerateNativeBinding(attr.id, 1, 427 cpp_callback_name = self._GenerateNativeBinding(attr.id, 1,
391 dart_declaration, 'Getter', is_custom) 428 dart_declaration, 'Getter', is_custom)
392 if is_custom: 429 if is_custom:
393 return 430 return
394 431
395 arguments = [] 432 arguments = []
433 parameter_definitions_emitter = emitter.Emitter()
434 raises_exceptions = self._GenerateCallWithHandling(attr, parameter_definitio ns_emitter, arguments)
435 raises_exceptions = raises_exceptions or attr.get_raises
436
396 if 'Reflect' in attr.ext_attrs: 437 if 'Reflect' in attr.ext_attrs:
397 webcore_function_name = GetIDLTypeInfo(attr.type.id).webcore_getter_name() 438 webcore_function_name = GetIDLTypeInfo(attr.type.id).webcore_getter_name()
398 if 'URL' in attr.ext_attrs: 439 if 'URL' in attr.ext_attrs:
399 if 'NonEmpty' in attr.ext_attrs: 440 if 'NonEmpty' in attr.ext_attrs:
400 webcore_function_name = 'getNonEmptyURLAttribute' 441 webcore_function_name = 'getNonEmptyURLAttribute'
401 else: 442 else:
402 webcore_function_name = 'getURLAttribute' 443 webcore_function_name = 'getURLAttribute'
403 arguments.append(self._GenerateWebCoreReflectionAttributeName(attr)) 444 arguments.append(self._GenerateWebCoreReflectionAttributeName(attr))
404 else: 445 else:
405 webcore_function_name = CppSafeName(attr.id) 446 webcore_function_name = CppSafeName(attr.id)
406 if attr.id == 'target' and attr.type.id == 'SVGAnimatedString': 447 if attr.id == 'target' and attr.type.id == 'SVGAnimatedString':
407 webcore_function_name = 'svgTarget' 448 webcore_function_name = 'svgTarget'
408 else: 449 else:
409 webcore_function_name = re.sub(r'^(HTML|URL|JS|XML|XSLT|\w)', 450 webcore_function_name = re.sub(r'^(HTML|URL|JS|XML|XSLT|\w)',
410 lambda s: s.group(1).lower(), 451 lambda s: s.group(1).lower(),
411 webcore_function_name) 452 webcore_function_name)
412 webcore_function_name = re.sub(r'^(create|exclusive)', 453 webcore_function_name = re.sub(r'^(create|exclusive)',
413 lambda s: 'is' + s.group(1).capitalize(), 454 lambda s: 'is' + s.group(1).capitalize(),
414 webcore_function_name) 455 webcore_function_name)
415 if attr.type.id.startswith('SVGAnimated'): 456 if attr.type.id.startswith('SVGAnimated'):
416 webcore_function_name += 'Animated' 457 webcore_function_name += 'Animated'
417 458
418 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr) 459 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr)
419 invocation = self._GenerateWebCoreInvocation(function_expression, 460 invocation = self._GenerateWebCoreInvocation(function_expression,
420 arguments, attr.type.id, attr.ext_attrs, attr.get_raises) 461 arguments, attr.type.id, attr.ext_attrs, attr.get_raises)
421 self._GenerateNativeCallback(cpp_callback_name, '', True, invocation, 462 self._GenerateNativeCallback(cpp_callback_name, parameter_definitions_emitte r.Fragments(),
422 raises_exceptions=attr.get_raises) 463 True, invocation, raises_exceptions=raises_exceptions)
423 464
424 def _AddSetter(self, attr): 465 def _AddSetter(self, attr):
425 type_info = GetIDLTypeInfo(attr.type.id) 466 type_info = GetIDLTypeInfo(attr.type.id)
426 dart_declaration = 'void set %s(%s)' % ( 467 dart_declaration = 'void set %s(%s)' % (
427 DartDomNameOfAttribute(attr), type_info.dart_type()) 468 DartDomNameOfAttribute(attr), type_info.dart_type())
428 is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext _attrs) 469 is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext _attrs)
429 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, 470 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2,
430 dart_declaration, 'Setter', is_custom) 471 dart_declaration, 'Setter', is_custom)
431 if is_custom: 472 if is_custom:
432 return 473 return
433 474
434 arguments = [] 475 arguments = []
476 parameter_definitions_emitter = emitter.Emitter()
477 self._GenerateCallWithHandling(attr, parameter_definitions_emitter, argument s)
478
435 if 'Reflect' in attr.ext_attrs: 479 if 'Reflect' in attr.ext_attrs:
436 webcore_function_name = GetIDLTypeInfo(attr.type.id).webcore_setter_name() 480 webcore_function_name = GetIDLTypeInfo(attr.type.id).webcore_setter_name()
437 arguments.append(self._GenerateWebCoreReflectionAttributeName(attr)) 481 arguments.append(self._GenerateWebCoreReflectionAttributeName(attr))
438 else: 482 else:
439 webcore_function_name = re.sub(r'^(xml(?=[A-Z])|\w)', 483 webcore_function_name = re.sub(r'^(xml(?=[A-Z])|\w)',
440 lambda s: s.group(1).upper(), 484 lambda s: s.group(1).upper(),
441 attr.id) 485 attr.id)
442 webcore_function_name = 'set%s' % webcore_function_name 486 webcore_function_name = 'set%s' % webcore_function_name
443 if attr.type.id.startswith('SVGAnimated'): 487 if attr.type.id.startswith('SVGAnimated'):
444 webcore_function_name += 'Animated' 488 webcore_function_name += 'Animated'
445 489
446 cpp_arg_name = CppSafeName(attr.id) 490 cpp_arg_name = CppSafeName(attr.id)
447 arguments.append(cpp_arg_name) 491 arguments.append(cpp_arg_name)
448 492
449 parameter_definitions_emitter = emitter.Emitter()
450 self._GenerateParameterAdapter( 493 self._GenerateParameterAdapter(
451 parameter_definitions_emitter, attr, cpp_arg_name, 0) 494 parameter_definitions_emitter, attr, cpp_arg_name, 0)
452 parameter_definitions = parameter_definitions_emitter.Fragments()
453 495
454 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr) 496 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr)
455 invocation = self._GenerateWebCoreInvocation(function_expression, 497 invocation = self._GenerateWebCoreInvocation(function_expression,
456 arguments, 'void', attr.ext_attrs, attr.set_raises) 498 arguments, 'void', attr.ext_attrs, attr.set_raises)
457 499
458 self._GenerateNativeCallback(cpp_callback_name, parameter_definitions, 500 self._GenerateNativeCallback(cpp_callback_name, parameter_definitions_emitte r.Fragments(),
459 True, invocation, raises_exceptions=True) 501 True, invocation, raises_exceptions=True)
460 502
461 def _HasNativeIndexGetter(self, interface): 503 def _HasNativeIndexGetter(self, interface):
462 return ('CustomIndexedGetter' in interface.ext_attrs or 504 return ('CustomIndexedGetter' in interface.ext_attrs or
463 'NumericIndexedGetter' in interface.ext_attrs) 505 'NumericIndexedGetter' in interface.ext_attrs)
464 506
465 def _EmitNativeIndexGetter(self, interface, element_type): 507 def _EmitNativeIndexGetter(self, interface, element_type):
466 dart_declaration = '%s operator[](int index)' % element_type 508 dart_declaration = '%s operator[](int index)' % element_type
467 self._GenerateNativeBinding('numericIndexGetter', 2, dart_declaration, 509 self._GenerateNativeBinding('numericIndexGetter', 2, dart_declaration,
468 'Callback', True) 510 'Callback', True)
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 cpp_callback_name = self._GenerateNativeBinding( 586 cpp_callback_name = self._GenerateNativeBinding(
545 native_name, 1 + len(operation.arguments), dart_declaration, 'Callback', 587 native_name, 1 + len(operation.arguments), dart_declaration, 'Callback',
546 is_custom) 588 is_custom)
547 if is_custom: 589 if is_custom:
548 return 590 return
549 591
550 # Generate callback. 592 # Generate callback.
551 webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.i d) 593 webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.i d)
552 594
553 parameter_definitions_emitter = emitter.Emitter() 595 parameter_definitions_emitter = emitter.Emitter()
554 raises_dart_exceptions = len(operation.arguments) > 0 or operation.raises
555 arguments = [] 596 arguments = []
556 597 raises_dart_exceptions = self._GenerateCallWithHandling(
podivilov 2012/03/14 12:28:58 Please rename to raises_exceptions.
Anton Muhin 2012/03/14 17:49:22 Sorry, it was the original name. I'll leave it fo
557 # Process 'CallWith' argument. 598 operation, parameter_definitions_emitter, arguments)
558 if 'CallWith' in operation.ext_attrs: 599 raises_dart_exceptions = raises_dart_exceptions or len(operation.arguments) > 0 or operation.raises
559 call_with = operation.ext_attrs['CallWith']
560 if call_with == 'ScriptExecutionContext':
561 parameter_definitions_emitter.Emit(
562 ' ScriptExecutionContext* context = DartUtilities::scriptExec utionContext();\n'
563 ' if (!context)\n'
564 ' return;\n')
565 arguments.append('context')
566 elif call_with == 'ScriptArguments|CallStack':
567 raises_dart_exceptions = True
568 self._cpp_impl_includes.add('DOMWindow')
569 self._cpp_impl_includes.add('ScriptArguments')
570 self._cpp_impl_includes.add('ScriptCallStack')
571 self._cpp_impl_includes.add('V8Proxy')
572 self._cpp_impl_includes.add('v8')
573 parameter_definitions_emitter.Emit(
574 ' v8::HandleScope handleScope;\n'
575 ' v8::Context::Scope scope(V8Proxy::mainWorldContext(DartUtil ities::domWindowForCurrentIsolate()->frame()));\n'
576 ' Dart_Handle customArgument = Dart_GetNativeArgument(args, $ INDEX);\n'
577 ' RefPtr<ScriptArguments> scriptArguments(DartUtilities::crea teScriptArguments(customArgument, exception));\n'
578 ' if (!scriptArguments)\n'
579 ' goto fail;\n'
580 ' RefPtr<ScriptCallStack> scriptCallStack(DartUtilities::crea teScriptCallStack());\n'
581 ' if (!scriptCallStack->size())\n'
582 ' return;\n',
583 INDEX=len(operation.arguments))
584 arguments.extend(['scriptArguments', 'scriptCallStack'])
585 600
586 # Process Dart arguments. 601 # Process Dart arguments.
587 for (i, argument) in enumerate(operation.arguments): 602 for (i, argument) in enumerate(operation.arguments):
588 if (i == len(operation.arguments) - 1 and 603 if (i == len(operation.arguments) - 1 and
589 self._interface.id == 'Console' and 604 self._interface.id == 'Console' and
590 argument.id == 'arg'): 605 argument.id == 'arg'):
591 # FIXME: we are skipping last argument here because it was added in 606 # FIXME: we are skipping last argument here because it was added in
592 # supplemental dart.idl. Cleanup dart.idl and remove this check. 607 # supplemental dart.idl. Cleanup dart.idl and remove this check.
593 break 608 break
594 cpp_arg_name = CppSafeName(argument.id) 609 cpp_arg_name = CppSafeName(argument.id)
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 788
774 if 'ImplementedBy' in attributes: 789 if 'ImplementedBy' in attributes:
775 arguments.insert(0, 'receiver') 790 arguments.insert(0, 'receiver')
776 self._cpp_impl_includes.add(attributes['ImplementedBy']) 791 self._cpp_impl_includes.add(attributes['ImplementedBy'])
777 792
778 return emitter.Format(invocation_template, 793 return emitter.Format(invocation_template,
779 FUNCTION_CALL='%s(%s)' % (function_expression, ', '.join(arguments))) 794 FUNCTION_CALL='%s(%s)' % (function_expression, ', '.join(arguments)))
780 795
781 def _GenerateCPPIncludes(includes): 796 def _GenerateCPPIncludes(includes):
782 return ''.join(['#include "%s.h"\n' % include for include in includes]) 797 return ''.join(['#include "%s.h"\n' % include for include in includes])
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698