summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2020-10-27 19:40:19 -0400
committerGitHub <noreply@github.com>2020-10-27 19:40:19 -0400
commit9e57509e25a7d750e7113b1d41f1d3af732ff934 (patch)
tree58ec90a367411bed5cb441424025acd7a47049ef
parent75734de7eba831c52cd27738a7c7df92be61b976 (diff)
Json schema default value improvement (#964)
* Ensure value has property before using its value * Add tests
-rw-r--r--ext/bg/js/json-schema.js3
-rw-r--r--test/test-schema.js54
2 files changed, 56 insertions, 1 deletions
diff --git a/ext/bg/js/json-schema.js b/ext/bg/js/json-schema.js
index adb71fa3..ea1531ab 100644
--- a/ext/bg/js/json-schema.js
+++ b/ext/bg/js/json-schema.js
@@ -637,7 +637,8 @@ class JsonSchemaValidator {
if (propertySchema === null) { continue; }
info.valuePush(property, value);
info.schemaPush(property, propertySchema);
- value[property] = this._getValidValueOrDefault(propertySchema, value[property], info);
+ const hasValue = Object.prototype.hasOwnProperty.call(value, property);
+ value[property] = this._getValidValueOrDefault(propertySchema, hasValue ? value[property] : void 0, info);
info.schemaPop();
info.valuePop();
}
diff --git a/test/test-schema.js b/test/test-schema.js
index a79650d6..20f72518 100644
--- a/test/test-schema.js
+++ b/test/test-schema.js
@@ -540,6 +540,60 @@ function testGetValidValueOrDefault1() {
{test: 'value', test2: 2, test3: 10}
]
]
+ },
+
+ // Test value defaulting where hasOwnProperty is false
+ {
+ schema: {
+ type: 'object',
+ required: ['test'],
+ properties: {
+ test: {
+ type: 'string',
+ default: 'default'
+ }
+ }
+ },
+ inputs: [
+ [
+ {},
+ {test: 'default'}
+ ],
+ [
+ {test: 'value'},
+ {test: 'value'}
+ ],
+ [
+ Object.create({test: 'value'}),
+ {test: 'default'}
+ ]
+ ]
+ },
+ {
+ schema: {
+ type: 'object',
+ required: ['toString'],
+ properties: {
+ toString: {
+ type: 'string',
+ default: 'default'
+ }
+ }
+ },
+ inputs: [
+ [
+ {},
+ {toString: 'default'}
+ ],
+ [
+ {toString: 'value'},
+ {toString: 'value'}
+ ],
+ [
+ Object.create({toString: 'value'}),
+ {toString: 'default'}
+ ]
+ ]
}
];