Include applicable state information alongside all the other other property information

This makes it easier to consume the data in the frontend.

Bug: 1325812
Change-Id: I37979a7266af728399a9c4938bf97f77e5781b5b
Signed-off-by: Victor Porof <victorporof@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/3702682
Reviewed-by: Mathias Bynens <mathias@chromium.org>
diff --git a/scripts/webidl-properties/config.js b/scripts/webidl-properties/config.js
index ceddb72..d1966eb 100644
--- a/scripts/webidl-properties/config.js
+++ b/scripts/webidl-properties/config.js
@@ -35,245 +35,311 @@
  * The "applicable" members for certain "states" that WebIDL types can be in.
  * In other words, some members are "valid" only valid in certain situations:
  * for example, with the HTML input element, the set of valid members are
- * determined by the "type" attribute.
+ * determined by the "type" property.
  */
-export const VALID_MEMBERS = {
+export const APPLICABLE_MEMBERS = {
   // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary
-  HTMLInputElement: {
-    '[type=hidden]': new Set([
-      'autocomplete',
-      'value',
-    ]),
-    '[type=text]': new Set([
-      'autocomplete',
-      'dirname',
-      'list',
-      'maxlength',
-      'minlength',
-      'pattern',
-      'placeholder',
-      'readonly',
-      'required',
-      'size',
-      'value',
-      'list',
-      'selectionstart',
-      'selectionend',
-      'selectiondirection',
-    ]),
-    '[type=search]': new Set([
-      'autocomplete',
-      'dirname',
-      'list',
-      'maxlength',
-      'minlength',
-      'pattern',
-      'placeholder',
-      'readonly',
-      'required',
-      'size',
-      'value',
-      'list',
-      'selectionstart',
-      'selectionend',
-      'selectiondirection',
-    ]),
-    '[type=url]': new Set([
-      'autocomplete',
-      'list',
-      'maxlength',
-      'minlength',
-      'pattern',
-      'placeholder',
-      'readonly',
-      'required',
-      'size',
-      'value',
-      'list',
-      'selectionstart',
-      'selectionend',
-      'selectiondirection',
-    ]),
-    '[type=tel]': new Set([
-      'autocomplete',
-      'list',
-      'maxlength',
-      'minlength',
-      'pattern',
-      'placeholder',
-      'readonly',
-      'required',
-      'size',
-      'value',
-      'list',
-      'selectionstart',
-      'selectionend',
-      'selectiondirection',
-    ]),
-    '[type=email]': new Set([
-      'autocomplete',
-      'list',
-      'maxlength',
-      'minlength',
-      'multiple',
-      'pattern',
-      'placeholder',
-      'readonly',
-      'required',
-      'size',
-      'value',
-      'list',
-    ]),
-    '[type=password]': new Set([
-      'autocomplete',
-      'maxlength',
-      'minlength',
-      'pattern',
-      'placeholder',
-      'readonly',
-      'required',
-      'size',
-      'value',
-      'selectionstart',
-      'selectionend',
-      'selectiondirection',
-    ]),
-    '[type=date]': new Set([
-      'autocomplete',
-      'list',
-      'max',
-      'min',
-      'readonly',
-      'required',
-      'step',
-      'value',
-      'valueasdate',
-      'valueasnumber',
-      'list',
-    ]),
-    '[type=month]': new Set([
-      'autocomplete',
-      'list',
-      'max',
-      'min',
-      'readonly',
-      'required',
-      'step',
-      'value',
-      'valueasdate',
-      'valueasnumber',
-      'list',
-    ]),
-    '[type=week]': new Set([
-      'autocomplete',
-      'list',
-      'max',
-      'min',
-      'readonly',
-      'required',
-      'step',
-      'value',
-      'valueasdate',
-      'valueasnumber',
-      'list',
-    ]),
-    '[type=time]': new Set([
-      'autocomplete',
-      'list',
-      'max',
-      'min',
-      'readonly',
-      'required',
-      'step',
-      'value',
-      'valueasdate',
-      'valueasnumber',
-      'list',
-    ]),
-    '[type=datetime-local]': new Set([
-      'autocomplete',
-      'list',
-      'max',
-      'min',
-      'readonly',
-      'required',
-      'step',
-      'value',
-      'valueasnumber',
-      'list',
-    ]),
-    '[type=number]': new Set([
-      'autocomplete',
-      'list',
-      'max',
-      'min',
-      'placeholder',
-      'readonly',
-      'required',
-      'step',
-      'value',
-      'valueasnumber',
-      'list',
-    ]),
-    '[type=range]': new Set([
-      'autocomplete',
-      'list',
-      'max',
-      'min',
-      'step',
-      'value',
-      'valueasnumber',
-      'list',
-    ]),
-    '[type=color]': new Set([
-      'autocomplete',
-      'list',
-      'value',
-    ]),
-    '[type=checkbox]': new Set([
-      'checked',
-      'required',
-      'checked',
-      'value',
-    ]),
-    '[type=radio]': new Set([
-      'checked',
-      'required',
-      'checked',
-      'value',
-    ]),
-    '[type=file]': new Set([
-      'accept',
-      'multiple',
-      'required',
-      'files',
-      'value',
-    ]),
-    '[type=submit]': new Set([
-      'formaction',
-      'formenctype',
-      'formmethod',
-      'formnovalidate',
-      'formtarget',
-      'value',
-    ]),
-    '[type=image]': new Set([
-      'alt',
-      'formaction',
-      'formenctype',
-      'formmethod',
-      'formnovalidate',
-      'formtarget',
-      'height',
-      'src',
-      'width',
-      'value',
-    ]),
-    '[type=reset]': new Set([
-      'value',
-    ]),
-    '[type=button]': new Set([
-      'value',
-    ]),
-  },
+  HTMLInputElement: [
+    {
+      rule: {when: 'type', is: 'hidden'},
+      members: new Set([
+        'autocomplete',
+        'value',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'text'},
+      members: new Set([
+        'autocomplete',
+        'dirname',
+        'list',
+        'maxlength',
+        'minlength',
+        'pattern',
+        'placeholder',
+        'readonly',
+        'required',
+        'size',
+        'value',
+        'list',
+        'selectionstart',
+        'selectionend',
+        'selectiondirection',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'search'},
+      members: new Set([
+        'autocomplete',
+        'dirname',
+        'list',
+        'maxlength',
+        'minlength',
+        'pattern',
+        'placeholder',
+        'readonly',
+        'required',
+        'size',
+        'value',
+        'list',
+        'selectionstart',
+        'selectionend',
+        'selectiondirection',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'url'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'maxlength',
+        'minlength',
+        'pattern',
+        'placeholder',
+        'readonly',
+        'required',
+        'size',
+        'value',
+        'list',
+        'selectionstart',
+        'selectionend',
+        'selectiondirection',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'tel'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'maxlength',
+        'minlength',
+        'pattern',
+        'placeholder',
+        'readonly',
+        'required',
+        'size',
+        'value',
+        'list',
+        'selectionstart',
+        'selectionend',
+        'selectiondirection',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'email'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'maxlength',
+        'minlength',
+        'multiple',
+        'pattern',
+        'placeholder',
+        'readonly',
+        'required',
+        'size',
+        'value',
+        'list',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'password'},
+      members: new Set([
+        'autocomplete',
+        'maxlength',
+        'minlength',
+        'pattern',
+        'placeholder',
+        'readonly',
+        'required',
+        'size',
+        'value',
+        'selectionstart',
+        'selectionend',
+        'selectiondirection',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'date'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'max',
+        'min',
+        'readonly',
+        'required',
+        'step',
+        'value',
+        'valueasdate',
+        'valueasnumber',
+        'list',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'month'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'max',
+        'min',
+        'readonly',
+        'required',
+        'step',
+        'value',
+        'valueasdate',
+        'valueasnumber',
+        'list',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'week'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'max',
+        'min',
+        'readonly',
+        'required',
+        'step',
+        'value',
+        'valueasdate',
+        'valueasnumber',
+        'list',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'time'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'max',
+        'min',
+        'readonly',
+        'required',
+        'step',
+        'value',
+        'valueasdate',
+        'valueasnumber',
+        'list',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'datetime-local'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'max',
+        'min',
+        'readonly',
+        'required',
+        'step',
+        'value',
+        'valueasnumber',
+        'list',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'number'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'max',
+        'min',
+        'placeholder',
+        'readonly',
+        'required',
+        'step',
+        'value',
+        'valueasnumber',
+        'list',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'range'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'max',
+        'min',
+        'step',
+        'value',
+        'valueasnumber',
+        'list',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'color'},
+      members: new Set([
+        'autocomplete',
+        'list',
+        'value',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'checkbox'},
+      members: new Set([
+        'checked',
+        'required',
+        'checked',
+        'value',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'radio'},
+      members: new Set([
+        'checked',
+        'required',
+        'checked',
+        'value',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'file'},
+      members: new Set([
+        'accept',
+        'multiple',
+        'required',
+        'files',
+        'value',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'submit'},
+      members: new Set([
+        'formaction',
+        'formenctype',
+        'formmethod',
+        'formnovalidate',
+        'formtarget',
+        'value',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'image'},
+      members: new Set([
+        'alt',
+        'formaction',
+        'formenctype',
+        'formmethod',
+        'formnovalidate',
+        'formtarget',
+        'height',
+        'src',
+        'width',
+        'value',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'reset'},
+      members: new Set([
+        'value',
+      ])
+    },
+    {
+      rule: {when: 'type', is: 'button'},
+      members: new Set([
+        'value',
+      ])
+    },
+  ],
 };