Bug 1344590: Part 3 - Handle schema default values for object properties. r?aswan draft
authorKris Maglione <maglione.k@gmail.com>
Tue, 07 Mar 2017 23:04:36 -0800
changeset 495357 68bb2377b51ca42a594bb1b467b658883ca5f1fd
parent 495356 f7a9e603ba59ef64aa7417beaea77049c7a1a0ec
child 495358 7c51ea2b2fcb231f93ec77fc7836f14f53dca6a0
push id48299
push usermaglione.k@gmail.com
push dateWed, 08 Mar 2017 17:22:14 +0000
reviewersaswan
bugs1344590
milestone54.0a1
Bug 1344590: Part 3 - Handle schema default values for object properties. r?aswan MozReview-Commit-ID: 6rzMwvRl4ho
toolkit/components/extensions/Schemas.jsm
toolkit/components/extensions/schemas/manifest.json
--- a/toolkit/components/extensions/Schemas.jsm
+++ b/toolkit/components/extensions/Schemas.jsm
@@ -1061,20 +1061,21 @@ class ObjectType extends Type {
       // Only allow extending "properties" and "patternProperties".
       extraProperties = ["additionalProperties", "isInstanceOf", ...extraProperties];
     }
     this.checkSchemaProperties(schema, path, extraProperties);
 
     let parseProperty = (schema, extraProps = []) => {
       return {
         type: Schemas.parseSchema(schema, path,
-                                  DEBUG && ["unsupported", "onError", "permissions", ...extraProps]),
+                                  DEBUG && ["unsupported", "onError", "permissions", "default", ...extraProps]),
         optional: schema.optional || false,
         unsupported: schema.unsupported || false,
         onError: schema.onError || null,
+        default: schema.default === undefined ? null : schema.default,
       };
     };
 
     // Parse explicit "properties" object.
     let properties = Object.create(null);
     for (let propName of Object.keys(schema.properties || {})) {
       properties[propName] = parseProperty(schema.properties[propName], ["optional"]);
     }
@@ -1184,42 +1185,42 @@ class ObjectType extends Type {
 
     if (unsupported) {
       if (prop in properties) {
         error = context.error(`Property "${prop}" is unsupported by Firefox`,
                               `not contain an unsupported "${prop}" property`);
       }
     } else if (prop in properties) {
       if (optional && (properties[prop] === null || properties[prop] === undefined)) {
-        result[prop] = null;
+        result[prop] = propType.default;
       } else {
         let r = context.withPath(prop, () => type.normalize(properties[prop], context));
         if (r.error) {
           error = r;
         } else {
           result[prop] = r.value;
           properties[prop] = r.value;
         }
       }
       remainingProps.delete(prop);
     } else if (!optional) {
       error = context.error(`Property "${prop}" is required`,
                             `contain the required "${prop}" property`);
     } else if (optional !== "omit-key-if-missing") {
-      result[prop] = null;
+      result[prop] = propType.default;
     }
 
     if (error) {
       if (onError == "warn") {
         context.logError(error.error);
       } else if (onError != "ignore") {
         throw error;
       }
 
-      result[prop] = null;
+      result[prop] = propType.default;
     }
   }
 
   normalize(value, context) {
     try {
       let v = this.normalizeBase("object", value, context);
       if (v.error) {
         return v;
--- a/toolkit/components/extensions/schemas/manifest.json
+++ b/toolkit/components/extensions/schemas/manifest.json
@@ -161,16 +161,17 @@
             "type": "string",
             "optional": true,
             "format": "contentSecurityPolicy",
             "onError": "warn"
           },
 
           "permissions": {
             "type": "array",
+            "default": [],
             "items": {
               "choices": [
                 { "$ref": "Permission" },
                 {
                   "type": "string",
                   "deprecated": "Unknown permission ${value}"
                 }
               ]