Changeset 175479 in webkit


Ignore:
Timestamp:
Nov 3, 2014 11:36:16 AM (9 years ago)
Author:
Joseph Pecoraro
Message:

Web Inspector: ObjC Protocol Interfaces should throw exceptions for nil arguments
https://bugs.webkit.org/show_bug.cgi?id=138221

Reviewed by Timothy Hatcher.

The RWIProtocol APIs will now raise exceptions when:

  • any properties are set on a type with a nil value or key (handled by RWIProtocolJSONObject)
  • required parameters in type constructors have nil value
  • required or optional command return parameters have nil values
  • required or optional event parameters have nil values

The exceptions include the name of the field when possible.

  • inspector/scripts/codegen/generate_objective_c.py:

(ObjCGenerator.is_type_objc_pointer_type):
Provide a quick check to see if type would be a pointer or not
in the ObjC API. Enums for example are not pointers in the API
because we manage converting them to/from strings.

  • inspector/scripts/codegen/generate_objective_c_backend_dispatcher_implementation.py:

(ObjectiveCConfigurationImplementationGenerator._generate_success_block_for_command):

  • inspector/scripts/codegen/generate_objective_c_frontend_dispatcher_implementation.py:

(ObjectiveCFrontendDispatcherImplementationGenerator._generate_event):

  • inspector/scripts/codegen/generate_objective_c_types_implementation.py:

(ObjectiveCTypesImplementationGenerator._generate_init_method_for_required_members):
(ObjectiveCTypesImplementationGenerator._generate_setter_for_member):
Throw exceptions when nil values are disallowed.

  • inspector/scripts/tests/expected/commands-with-async-attribute.json-result:
  • inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result:
  • inspector/scripts/tests/expected/events-with-optional-parameters.json-result:
  • inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result:
  • inspector/scripts/tests/expected/type-declaration-object-type.json-result:
  • inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result:

Rebaseline tests which include the exception raise calls.

Location:
trunk/Source/JavaScriptCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r175478 r175479  
     12014-11-03  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Web Inspector: ObjC Protocol Interfaces should throw exceptions for nil arguments
     4        https://bugs.webkit.org/show_bug.cgi?id=138221
     5
     6        Reviewed by Timothy Hatcher.
     7
     8        The RWIProtocol APIs will now raise exceptions when:
     9
     10          - any properties are set on a type with a nil value or key (handled by RWIProtocolJSONObject)
     11          - required parameters in type constructors have nil value
     12          - required or optional command return parameters have nil values
     13          - required or optional event parameters have nil values
     14
     15        The exceptions include the name of the field when possible.
     16
     17        * inspector/scripts/codegen/generate_objective_c.py:
     18        (ObjCGenerator.is_type_objc_pointer_type):
     19        Provide a quick check to see if type would be a pointer or not
     20        in the ObjC API. Enums for example are not pointers in the API
     21        because we manage converting them to/from strings.
     22
     23        * inspector/scripts/codegen/generate_objective_c_backend_dispatcher_implementation.py:
     24        (ObjectiveCConfigurationImplementationGenerator._generate_success_block_for_command):
     25        * inspector/scripts/codegen/generate_objective_c_frontend_dispatcher_implementation.py:
     26        (ObjectiveCFrontendDispatcherImplementationGenerator._generate_event):
     27        * inspector/scripts/codegen/generate_objective_c_types_implementation.py:
     28        (ObjectiveCTypesImplementationGenerator._generate_init_method_for_required_members):
     29        (ObjectiveCTypesImplementationGenerator._generate_setter_for_member):
     30        Throw exceptions when nil values are disallowed.
     31
     32        * inspector/scripts/tests/expected/commands-with-async-attribute.json-result:
     33        * inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result:
     34        * inspector/scripts/tests/expected/events-with-optional-parameters.json-result:
     35        * inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result:
     36        * inspector/scripts/tests/expected/type-declaration-object-type.json-result:
     37        * inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result:
     38        Rebaseline tests which include the exception raise calls.
     39
    1402014-11-03  Joseph Pecoraro  <pecoraro@apple.com>
    241
  • trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objective_c.py

    r175478 r175479  
    247247
    248248    @staticmethod
     249    def is_type_objc_pointer_type(_type):
     250        if (isinstance(_type, AliasedType)):
     251            _type = _type.aliased_type
     252        if (isinstance(_type, PrimitiveType)):
     253            return _type.raw_name() in ['string', 'array', 'any', 'object']
     254        if (isinstance(_type, EnumType)):
     255            return False
     256        if (isinstance(_type, ObjectType)):
     257            return True
     258        if (isinstance(_type, ArrayType)):
     259            return True
     260        return None
     261
     262    @staticmethod
    249263    def objc_class_for_type(_type):
    250264        if (isinstance(_type, AliasedType)):
  • trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objective_c_backend_dispatcher_implementation.py

    r175385 r175479  
    100100        lines = []
    101101
    102         # FIXME: <https://webkit.org/b/138221> Web Inspector: ObjC Protocol Interfaces should throw exceptions for nil arguments
    103 
    104102        if command.return_parameters:
    105103            success_block_parameters = []
     
    114112        if command.return_parameters:
    115113            lines.append('        RefPtr<InspectorObject> resultObject = InspectorObject::create();')
     114
     115            required_pointer_parameters = filter(lambda parameter: not parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), command.return_parameters)
     116            for parameter in required_pointer_parameters:
     117                var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name)
     118                lines.append('        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(%s, @"%s");' % (var_name, var_name))
     119
     120            optional_pointer_parameters = filter(lambda parameter: parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), command.return_parameters)
     121            for parameter in optional_pointer_parameters:
     122                var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name)
     123                lines.append('        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(%s, @"%s");' % (var_name, var_name))
     124
    116125            for parameter in command.return_parameters:
    117126                keyed_set_method = Generator.keyed_set_method_for_type(parameter.type)
  • trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objective_c_frontend_dispatcher_implementation.py

    r175385 r175479  
    102102        lines.append('        return;')
    103103        lines.append('')
     104
     105        required_pointer_parameters = filter(lambda parameter: not parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), event.event_parameters)
     106        for parameter in required_pointer_parameters:
     107            var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name)
     108            lines.append('    THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(%s, @"%s");' % (var_name, var_name))
     109
     110        optional_pointer_parameters = filter(lambda parameter: parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), event.event_parameters)
     111        for parameter in optional_pointer_parameters:
     112            var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name)
     113            lines.append('    THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(%s, @"%s");' % (var_name, var_name))
     114
     115        if required_pointer_parameters or optional_pointer_parameters:
     116            lines.append('')
     117
    104118        lines.append('    RefPtr<InspectorObject> jsonMessage = InspectorObject::create();')
    105119        lines.append('    jsonMessage->setString(ASCIILiteral("method"), ASCIILiteral("%s.%s"));' % (domain.domain_name, event.event_name))
  • trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objective_c_types_implementation.py

    r175385 r175479  
    106106            pairs.append('%s:(%s)%s' % (var_name, objc_type, var_name))
    107107        pairs[0] = ucfirst(pairs[0])
    108         # FIXME: <https://webkit.org/b/138221> Web Inspector: ObjC Protocol Interfaces should throw exceptions for nil arguments
    109108        lines = []
    110109        lines.append('- (instancetype)initWith%s;' % ' '.join(pairs))
     
    114113        lines.append('        return nil;')
    115114        lines.append('')
     115
     116        required_pointer_members = filter(lambda member: ObjCGenerator.is_type_objc_pointer_type(member.type), required_members)
     117        if required_pointer_members:
     118            for member in required_pointer_members:
     119                var_name = ObjCGenerator.identifier_to_objc_identifier(member.member_name)
     120                lines.append('    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(%s, @"%s");' % (var_name, var_name))
     121            lines.append('')
     122
    116123        for member in required_members:
    117124            var_name = ObjCGenerator.identifier_to_objc_identifier(member.member_name)
    118125            lines.append('    self.%s = %s;' % (var_name, var_name))
     126
    119127        lines.append('')
    120128        lines.append('    return self;')
     
    127135        setter_method = ObjCGenerator.objc_setter_method_for_member(declaration, member)
    128136        conversion_expression = ObjCGenerator.objc_to_protocol_expression_for_member(declaration, member, var_name)
    129         # FIXME: <https://webkit.org/b/138221> Web Inspector: ObjC Protocol Interfaces should throw exceptions for nil arguments
    130137        lines = []
    131138        lines.append('- (void)set%s:(%s)%s' % (ucfirst(var_name), objc_type, var_name))
  • trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/commands-with-async-attribute.json-result

    r175478 r175479  
    10661066    id successCallback = ^(NSArray/*<NSString>*/ **columnNames, NSString **notes, double *timestamp, RWIProtocolJSONObject **values, RWIProtocolJSONObject **payload, NSInteger *databaseId, RWIProtocolDatabaseError **sqlError, RWIProtocolDatabasePrimaryColors *screenColor, RWIProtocolDatabaseExecuteSQLSyncOptionalReturnValuesPrintColor *printColor) {
    10671067        RefPtr<InspectorObject> resultObject = InspectorObject::create();
     1068        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(columnNames, @"columnNames");
     1069        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(notes, @"notes");
     1070        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(values, @"values");
     1071        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(payload, @"payload");
     1072        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(sqlError, @"sqlError");
    10681073        if (columnNames)
    10691074            resultObject->setArray(ASCIILiteral("columnNames"), inspectorStringArray(*columnNames));
     
    11011106    id successCallback = ^(NSArray/*<NSString>*/ **columnNames, NSString **notes, double *timestamp, RWIProtocolJSONObject **values, RWIProtocolJSONObject **payload, NSInteger *databaseId, RWIProtocolDatabaseError **sqlError, RWIProtocolDatabasePrimaryColors *screenColor, RWIProtocolDatabaseExecuteSQLAsyncOptionalReturnValuesPrintColor *printColor) {
    11021107        RefPtr<InspectorObject> resultObject = InspectorObject::create();
     1108        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(columnNames, @"columnNames");
     1109        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(notes, @"notes");
     1110        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(values, @"values");
     1111        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(payload, @"payload");
     1112        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(sqlError, @"sqlError");
    11031113        if (columnNames)
    11041114            resultObject->setArray(ASCIILiteral("columnNames"), inspectorStringArray(*columnNames));
     
    11361146    id successCallback = ^(NSArray/*<NSString>*/ *columnNames, NSString *notes, double timestamp, RWIProtocolJSONObject *values, RWIProtocolJSONObject *payload, NSInteger databaseId, RWIProtocolDatabaseError *sqlError, RWIProtocolDatabasePrimaryColors screenColor, RWIProtocolDatabaseExecuteSQLSyncPrintColor printColor) {
    11371147        RefPtr<InspectorObject> resultObject = InspectorObject::create();
     1148        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(columnNames, @"columnNames");
     1149        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(notes, @"notes");
     1150        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(values, @"values");
     1151        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(payload, @"payload");
     1152        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(sqlError, @"sqlError");
    11381153        resultObject->setArray(ASCIILiteral("columnNames"), inspectorStringArray(columnNames));
    11391154        resultObject->setString(ASCIILiteral("notes"), notes);
     
    11621177    id successCallback = ^(NSArray/*<NSString>*/ *columnNames, NSString *notes, double timestamp, RWIProtocolJSONObject *values, RWIProtocolJSONObject *payload, NSInteger databaseId, RWIProtocolDatabaseError *sqlError, RWIProtocolDatabasePrimaryColors screenColor, RWIProtocolDatabaseExecuteSQLAsyncPrintColor printColor) {
    11631178        RefPtr<InspectorObject> resultObject = InspectorObject::create();
     1179        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(columnNames, @"columnNames");
     1180        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(notes, @"notes");
     1181        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(values, @"values");
     1182        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(payload, @"payload");
     1183        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(sqlError, @"sqlError");
    11641184        resultObject->setArray(ASCIILiteral("columnNames"), inspectorStringArray(columnNames));
    11651185        resultObject->setString(ASCIILiteral("notes"), notes);
     
    15571577        return nil;
    15581578
     1579    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(message, @"message");
     1580
    15591581    self.message = message;
    15601582    self.code = code;
  • trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result

    r175478 r175479  
    955955    id successCallback = ^(NSArray/*<NSString>*/ **columnNames, NSString **notes, double *timestamp, RWIProtocolJSONObject **values, RWIProtocolJSONObject **payload, NSInteger *databaseId, RWIProtocolDatabaseError **sqlError, RWIProtocolDatabasePrimaryColors *screenColor, RWIProtocolDatabaseExecuteAllOptionalParametersPrintColor *printColor) {
    956956        RefPtr<InspectorObject> resultObject = InspectorObject::create();
     957        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(columnNames, @"columnNames");
     958        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(notes, @"notes");
     959        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(values, @"values");
     960        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(payload, @"payload");
     961        THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(sqlError, @"sqlError");
    957962        if (columnNames)
    958963            resultObject->setArray(ASCIILiteral("columnNames"), inspectorStringArray(*columnNames));
     
    10151020    id successCallback = ^(NSArray/*<NSString>*/ *columnNames, NSString *notes, double timestamp, RWIProtocolJSONObject *values, RWIProtocolJSONObject *payload, NSInteger databaseId, RWIProtocolDatabaseError *sqlError, RWIProtocolDatabasePrimaryColors screenColor, RWIProtocolDatabaseExecuteNoOptionalParametersPrintColor printColor) {
    10161021        RefPtr<InspectorObject> resultObject = InspectorObject::create();
     1022        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(columnNames, @"columnNames");
     1023        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(notes, @"notes");
     1024        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(values, @"values");
     1025        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(payload, @"payload");
     1026        THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(sqlError, @"sqlError");
    10171027        resultObject->setArray(ASCIILiteral("columnNames"), inspectorStringArray(columnNames));
    10181028        resultObject->setString(ASCIILiteral("notes"), notes);
     
    14151425        return nil;
    14161426
     1427    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(message, @"message");
     1428
    14171429    self.message = message;
    14181430    self.code = code;
  • trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/events-with-optional-parameters.json-result

    r175385 r175479  
    879879    if (!frontendChannel)
    880880        return;
     881
     882    THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(columnNames, @"columnNames");
     883    THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(notes, @"notes");
     884    THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(values, @"values");
     885    THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(payload, @"payload");
     886    THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(sqlError, @"sqlError");
     887    THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(screenColor, @"screenColor");
     888    THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(printColor, @"printColor");
    881889
    882890    RefPtr<InspectorObject> jsonMessage = InspectorObject::create();
     
    909917        return;
    910918
     919    THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(columnNames, @"columnNames");
     920    THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(notes, @"notes");
     921    THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(values, @"values");
     922    THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(payload, @"payload");
     923    THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(sqlError, @"sqlError");
     924    THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(screenColor, @"screenColor");
     925    THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(printColor, @"printColor");
     926
    911927    RefPtr<InspectorObject> jsonMessage = InspectorObject::create();
    912928    jsonMessage->setString(ASCIILiteral("method"), ASCIILiteral("Database.didExecuteNoOptionalParameters"));
     
    10361052        return nil;
    10371053
     1054    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(message, @"message");
     1055
    10381056    self.message = message;
    10391057    self.code = code;
  • trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result

    r175478 r175479  
    11111111        return nil;
    11121112
     1113    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(message, @"message");
     1114
    11131115    self.message = message;
    11141116    self.code = code;
  • trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-object-type.json-result

    r175385 r175479  
    13381338        return nil;
    13391339
     1340    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(message, @"message");
     1341
    13401342    self.message = message;
    13411343    self.code = code;
     
    14371439    if (!self)
    14381440        return nil;
     1441
     1442    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(columnNames, @"columnNames");
     1443    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(notes, @"notes");
     1444    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(values, @"values");
     1445    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload, @"payload");
     1446    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(error, @"error");
    14391447
    14401448    self.columnNames = columnNames;
     
    15181526        return nil;
    15191527
     1528    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(integer, @"integer");
     1529    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(array, @"array");
     1530    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(string, @"string");
     1531    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(value, @"value");
     1532    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(object, @"object");
     1533
    15201534    self.integer = integer;
    15211535    self.array = array;
     
    15911605    if (!self)
    15921606        return nil;
     1607
     1608    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(columnNames, @"columnNames");
     1609    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(notes, @"notes");
     1610    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(values, @"values");
     1611    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload, @"payload");
     1612    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(error, @"error");
    15931613
    15941614    self.columnNames = columnNames;
  • trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result

    r175385 r175479  
    12661266        return nil;
    12671267
     1268    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(string, @"string");
     1269    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(tree, @"tree");
     1270
    12681271    self.string = string;
    12691272    self.number = number;
Note: See TracChangeset for help on using the changeset viewer.