tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

specificResource.json (36654B)


      1 {
      2  "$schema": "http://json-schema.org/draft-04/schema#",
      3  "id" : "specificResource.json",
      4  "title": "Definitions: Specific Resources.",
      5  "description": "Schemas in #/definitions detect or validate keys/objects used in describing Specific Resources (Section 4).",
      6  "definitions": {
      7 
      8    "sourceDetected":
      9    {
     10      "title": "Detection: source",
     11      "description": "True when object has exactly 1 source key value and that value is of format uri or an External Web Resource (Section 4) - NB, the Specific Resource is closer in hierarchy to the External Web Resource than a Choice or Set; the items of a Choice or Set may be Specific Resources, but the source of a Specific Resource may not be a Choice or Set.",
     12      "type": "object",
     13      "properties":
     14      {
     15        "source":
     16        {
     17          "type": ["string", "object" ],
     18          "oneOf": [
     19             { "$ref": "id.json#/definitions/stringUri" },
     20             { "$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}
     21          ]
     22        }
     23      },
     24      "required": ["source"]
     25    },
     26 
     27    "specificeResourceDetected":
     28    {
     29      "title": "Detection: Specific Resource",
     30      "description": "True when object has exactly 1 source value and at least one of purpose, selector, state, styleClass, renderedVia, scope (Section 4)",
     31      "type": "object",
     32      "$ref": "#/definitions/sourceDetected",
     33      "anyOf": [
     34        { "$ref": "otherProperties.json#/definitions/purposeRecognizedIfPresent", "required": ["purpose"] },
     35        { "$ref": "#/definitions/selectorDetected" },
     36        { "$ref": "#/definitions/stateDetected" },
     37        { "$ref": "#/definitions/styleClassDetected" },
     38        { "$ref": "#/definitions/renderedViaDetected" },
     39        { "$ref": "#/definitions/scopeDetected" }
     40      ]
     41    },
     42 
     43    "itemSpecificResourceDetected":
     44    {
     45      "title": "Detection: Specific Resource as item member of a Choice or Set",
     46      "description": "True when object has items array containing an object with exactly 1 source value and at least one of purpose, selector, state, styleClass, renderedVia, scope (Section 4)",
     47      "type": "object",
     48      "properties":
     49      {
     50          "items":
     51          {
     52              "type": "array",
     53              "minItems": 1,
     54              "not":
     55              {
     56                  "items":
     57                  { "not": { "$ref": "#/definitions/specificeResourceDetected" } }
     58              }
     59          }
     60      },
     61      "required": ["items"]
     62    },
     63 
     64    "selectorDefined":
     65    {
     66      "title": "Definition: selector",
     67      "description": "True when object tested has no selector, or has selector identified by uri, or has selector(s) with value matching one or more of the selectors described in the model (Section 4.2)",
     68      "type": "object",
     69      "properties":
     70      {
     71        "selector":
     72        {
     73          "oneOf": [
     74          { "$ref": "id.json#/definitions/stringUri" },
     75          { "type": "object",
     76            "anyOf": [
     77            {"$ref": "id.json#/definitions/idValueFound"},
     78            {"$ref": "#/definitions/fragmentSelectorDetected"},
     79            {"$ref": "#/definitions/cssSelectorDetected"},
     80            {"$ref": "#/definitions/xpathSelectorDetected"},
     81              {"$ref": "#/definitions/textQuoteSelectorDetected"},
     82              {"$ref": "#/definitions/textPositionSelectorDetected"},
     83                {"$ref": "#/definitions/dataPositionSelectorDetected"},
     84                {"$ref": "#/definitions/rangeSelectorDetected"},
     85                  {"$ref": "#/definitions/svgSelectorDetected"}
     86            ]
     87          },
     88          {
     89            "type": "array",
     90            "minItems": 1,
     91            "items":
     92            { "oneOf": [
     93              { "$ref": "id.json#/definitions/stringUri" },
     94              { "type": "object",
     95                "anyOf": [
     96                {"$ref": "id.json#/definitions/idValueFound"},
     97                {"$ref": "#/definitions/fragmentSelectorDetected"},
     98                {"$ref": "#/definitions/cssSelectorDetected"},
     99                {"$ref": "#/definitions/xpathSelectorDetected"},
    100                  {"$ref": "#/definitions/textQuoteSelectorDetected"},
    101                  {"$ref": "#/definitions/textPositionSelectorDetected"},
    102                    {"$ref": "#/definitions/dataPositionSelectorDetected"},
    103                    {"$ref": "#/definitions/rangeSelectorDetected"},
    104                      {"$ref": "#/definitions/svgSelectorDetected"}
    105                ]
    106              }
    107            ]
    108            }
    109          }
    110          ]
    111        }
    112      }
    113    },
    114 
    115    "itemSelectorValidIfPresent":
    116    {
    117        "description": "True if ALL items in the items array of object tested have no selector, or have a selector that is uri, or have a selector that has recognized value(s)",
    118        "type": "object",
    119        "properties":
    120        {
    121            "items":
    122            { "type": "array",
    123              "minItems": 1,
    124              "items":
    125              {
    126                "oneOf":
    127                 [
    128                   { "$ref": "id.json#/definitions/stringUri" },
    129                   { "$ref": "#/definitions/selectorDefined" }
    130                 ]
    131               }
    132            }
    133        }
    134    },
    135 
    136    "selectorDetected":
    137    {
    138      "title": "Detection: selector type",
    139      "description": "True when object tested has selector(s) that is(are) recognized as being one or more of the selectors described in the model (Section 4.2)",
    140      "type": "object",
    141      "$ref": "#/definitions/selectorDefined",
    142      "required": ["selector"]
    143    },
    144 
    145    "fragmentSelectorTypeDetected":
    146    {
    147      "type": "object",
    148      "properties":
    149        {
    150          "type": { "type": "string", "enum": ["FragmentSelector"] }
    151        },
    152      "required": ["type"]
    153    },
    154 
    155    "fragmentSelectorDetected":
    156    {
    157      "title": "Detection: fragment selector",
    158      "description": "True when object is a fragment selelctor (Section 4.2.1)",
    159      "allOf":
    160      [
    161        { "$ref": "#/definitions/fragmentSelectorTypeDetected"},
    162        {
    163          "type": "object",
    164          "properties":
    165          {
    166            "value": { "type": "string" },
    167            "conformsTo": { "type": "string", "format": "uri"}
    168          },
    169          "required": ["value"]
    170        }
    171      ]
    172    },
    173 
    174    "conformsToPropertyFound":
    175    {
    176      "title": "Detection: fragment selector with conformsTo key",
    177      "description": "True when object is a fragment selelctor with a conformsTo key (Section 4.2.1)",
    178      "type": "object",
    179      "allOf":
    180      [
    181        { "$ref": "#/definitions/fragmentSelectorDetected"},
    182        { "required": ["conformsTo"] }
    183      ]
    184    },
    185 
    186    "fragmentSelectorTypeValidIfPresent":
    187    {
    188       "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
    189       "oneOf":
    190       [
    191         { "not": { "$ref": "#/definitions/fragmentSelectorTypeDetected" } },
    192         { "$ref": "#/definitions/fragmentSelectorDetected" }
    193       ]
    194    },
    195 
    196    "cssSelectorTypeDetected":
    197    {
    198      "type": "object",
    199      "properties":
    200      {
    201        "type": { "type": "string", "enum": ["CssSelector"] }
    202      },
    203      "required": ["type"]
    204    },
    205 
    206    "cssSelectorDetected":
    207    {
    208      "title": "Detection: CssSelector selector",
    209      "description": "True when object is a CssSelector selelctor (Section 4.2.2)",
    210      "allOf":
    211      [
    212        { "$ref": "#/definitions/cssSelectorTypeDetected" },
    213        {
    214          "type": "object",
    215          "properties":
    216          {
    217            "value": { "type": "string" }
    218          },
    219          "required": ["value"]
    220        }
    221      ]
    222    },
    223 
    224    "cssSelectorTypeValidIfPresent":
    225    {
    226       "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
    227       "oneOf":
    228       [
    229         { "not": { "$ref": "#/definitions/cssSelectorTypeDetected" } },
    230         { "$ref": "#/definitions/cssSelectorDetected" }
    231       ]
    232    },
    233 
    234    "xpathSelectorTypeDetected":
    235    {
    236      "type": "object",
    237      "properties":
    238      {
    239        "type": { "type": "string", "enum": ["XPathSelector"] }
    240      },
    241      "required": ["type"]
    242    },
    243 
    244    "xpathSelectorDetected":
    245    {
    246      "title": "Detection: XPath selector",
    247      "description": "True when object is a XPath selelctor (Section 4.2.3)",
    248      "allOf":
    249      [
    250        { "$ref": "#/definitions/xpathSelectorTypeDetected" },
    251        {
    252          "type": "object",
    253          "properties":
    254          {
    255            "value": { "type": "string" }
    256          },
    257          "required": ["value"]
    258        }
    259      ]
    260 
    261    },
    262 
    263    "xpathSelectorTypeValidIfPresent":
    264    {
    265       "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
    266       "oneOf":
    267       [
    268         { "not": { "$ref": "#/definitions/xpathSelectorTypeDetected" } },
    269         { "$ref": "#/definitions/xpathSelectorDetected" }
    270       ]
    271    },
    272 
    273    "textQuoteSelectorTypeDetected":
    274    {
    275      "type": "object",
    276      "properties":
    277      {
    278        "type": { "type": "string", "enum": ["TextQuoteSelector"] }
    279      },
    280      "required": ["type"]
    281    },
    282 
    283    "textQuoteSelectorDetected":
    284    {
    285      "title": "Detection: text quote selector",
    286      "description": "True when object is a text quote selelctor (Section 4.2.4)",
    287      "allOf":
    288      [
    289        { "$ref": "#/definitions/textQuoteSelectorTypeDetected" },
    290        {
    291          "type": "object",
    292          "properties":
    293          {
    294            "exact": { "type": "string" },
    295            "prefix": { "type": "string" },
    296            "suffix": { "type": "string" }
    297          },
    298          "required": ["exact"]
    299        }
    300      ]
    301    },
    302 
    303    "prefixPropertyFound":
    304    {
    305      "title": "Detection: text quote selector with prefix key",
    306      "description": "True when object is a text quote selelctor with a prefix key (Section 4.2.4)",
    307      "type": "object",
    308      "allOf":
    309      [
    310        { "$ref": "#/definitions/textQuoteSelectorDetected"},
    311        { "required": ["prefix"] }
    312      ]
    313    },
    314 
    315    "suffixPropertyFound":
    316    {
    317      "title": "Detection: text quote selector with suffix key",
    318      "description": "True when object is a text quote selelctor with a suffix key (Section 4.2.4)",
    319      "type": "object",
    320      "allOf":
    321      [
    322        { "$ref": "#/definitions/textQuoteSelectorDetected"},
    323        { "required": ["suffix"] }
    324      ]
    325    },
    326 
    327    "textQuoteSelectorTypeValidIfPresent":
    328    {
    329       "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
    330       "oneOf":
    331       [
    332         { "not": { "$ref": "#/definitions/textQuoteSelectorTypeDetected" } },
    333         { "$ref": "#/definitions/textQuoteSelectorDetected" }
    334       ]
    335    },
    336 
    337    "textPositionSelectorTypeDetected":
    338    {
    339      "type": "object",
    340      "properties":
    341      {
    342        "type": { "type": "string", "enum": ["TextPositionSelector"] }
    343      },
    344      "required": ["type"]
    345    },
    346 
    347    "textPositionSelectorDetected":
    348    {
    349      "title": "Definition: text position selector",
    350      "description": "True when object is a text position selelctor (Section 4.2.5)",
    351      "allOf":
    352      [
    353         { "$ref": "#/definitions/textPositionSelectorTypeDetected" },
    354         {
    355           "type": "object",
    356           "properties":
    357           {
    358             "start": { "type": "integer", "minimum": 0 },
    359             "end": { "type": "integer","minimum": 0 }
    360           },
    361           "required": ["start", "end"]
    362         }
    363      ]
    364    },
    365 
    366    "textPositionSelectorTypeValidIfPresent":
    367    {
    368       "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
    369       "oneOf":
    370       [
    371         { "not": { "$ref": "#/definitions/textPositionSelectorTypeDetected" } },
    372         { "$ref": "#/definitions/textPositionSelectorDetected" }
    373       ]
    374    },
    375 
    376    "dataPositionSelectorTypeDetected":
    377    {
    378      "type": "object",
    379      "properties":
    380      {
    381          "type": { "type": "string", "enum": ["DataPositionSelector"] }
    382      },
    383      "required": ["type"]
    384    },
    385 
    386    "dataPositionSelectorDetected":
    387    {
    388      "title": "Definition: data position selector",
    389      "description": "True when object is a data position selelctor (Section 4.2.5)",
    390      "allOf":
    391      [
    392         { "$ref": "#/definitions/dataPositionSelectorTypeDetected" },
    393         {
    394           "type": "object",
    395           "properties":
    396           {
    397             "start": { "type": "integer", "minimum": 0 },
    398             "end": { "type": "integer","minimum": 0 }
    399           },
    400           "required": ["start", "end"]
    401         }
    402      ]
    403    },
    404 
    405    "dataPositionSelectorTypeValidIfPresent":
    406    {
    407       "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
    408       "oneOf":
    409       [
    410         { "not": { "$ref": "#/definitions/dataPositionSelectorTypeDetected" } },
    411         { "$ref": "#/definitions/dataPositionSelectorDetected" }
    412       ]
    413    },
    414 
    415    "svgSelectorTypeDetected":
    416    {
    417      "type": "object",
    418      "properties":
    419      {
    420          "type": { "type": "string", "enum": ["SvgSelector"] }
    421      },
    422      "required": ["type"]
    423    },
    424 
    425    "svgSelectorDetected":
    426    {
    427      "title": "Detection: svg selector",
    428      "description": "True when object is a svg selelctor (Section 4.2.7)",
    429      "allOf":
    430      [
    431        { "$ref": "#/definitions/svgSelectorTypeDetected" },
    432        {
    433          "type": "object",
    434          "properties":
    435          {
    436            "value": { "type": "string" },
    437            "id": { "$ref": "id.json#/definitions/arraySingleStringUri" }
    438          },
    439          "oneOf": [
    440            {"required": ["value"] },
    441            {"required": ["id"] }
    442          ]
    443        }
    444      ]
    445    },
    446 
    447    "svgSelectorTypeValidIfPresent":
    448    {
    449       "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
    450       "oneOf":
    451       [
    452         { "not": { "$ref": "#/definitions/svgSelectorTypeDetected" } },
    453         { "$ref": "#/definitions/svgSelectorDetected" }
    454       ]
    455    },
    456 
    457    "rangeSelectorTypeDetected":
    458    {
    459      "type": "object",
    460      "properties":
    461      {
    462        "type": { "type": "string", "enum": ["RangeSelector"] }
    463      },
    464      "required": ["type"]
    465    },
    466 
    467    "rangeSelectorDetected":
    468    {
    469      "title": "Detection: range selector",
    470      "description": "True when object is a range selelctor (Section 4.2.9)",
    471      "allOf":
    472      [
    473        { "$ref": "#/definitions/rangeSelectorTypeDetected" },
    474        {
    475          "type": "object",
    476          "patternProperties":
    477          {
    478            "^(startSelector|endSelector)$":
    479            { "type": "object",
    480              "oneOf": [
    481                {"$ref": "#/definitions/fragmentSelectorDetected"},
    482                {"$ref": "#/definitions/cssSelectorDetected"},
    483                {"$ref": "#/definitions/xpathSelectorDetected"},
    484                {"$ref": "#/definitions/textQuoteSelectorDetected"},
    485                {"$ref": "#/definitions/textPositionSelectorDetected"},
    486                {"$ref": "#/definitions/dataPositionSelectorDetected"},
    487                {"$ref": "#/definitions/svgSelectorDetected"}
    488              ]
    489            }
    490          },
    491          "required": ["startSelector", "endSelector"]
    492        }
    493      ]
    494    },
    495 
    496    "rangeSelectorTypeValidIfPresent":
    497    {
    498       "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
    499       "oneOf":
    500       [
    501         { "not": { "$ref": "#/definitions/rangeSelectorTypeDetected" } },
    502         { "$ref": "#/definitions/rangeSelectorDetected" }
    503       ]
    504    },
    505 
    506    "stateDefined" :
    507    {
    508      "title": "Definition: state",
    509      "description": "True when object tested has state with value matching one or more of the state classes described in the model (Section 4.3)",
    510      "type": "object",
    511      "properties":
    512      {
    513        "state":
    514        {
    515          "oneOf": [
    516            { "$ref": "id.json#/definitions/stringUri" },
    517            { "type": "object",
    518              "anyOf": [
    519                {"$ref": "id.json#/definitions/idValueFound"},
    520                {"$ref": "#/definitions/timeStateDetected"},
    521                {"$ref": "#/definitions/requestHeaderStateDetected"}
    522              ]
    523            },
    524            {
    525              "type": "array",
    526              "minItems": 1,
    527              "items":
    528              { "oneOf": [
    529                 { "$ref": "id.json#/definitions/stringUri" },
    530                 { "type": "object",
    531                   "anyOf": [
    532                     {"$ref": "id.json#/definitions/idValueFound"},
    533                     {"$ref": "#/definitions/timeStateDetected"},
    534                     {"$ref": "#/definitions/requestHeaderStateDetected"}
    535                   ]
    536                 }
    537                ]
    538              }
    539            }
    540          ]
    541        }
    542      }
    543    },
    544 
    545    "itemStateValidIfPresent":
    546    {
    547        "description": "True if ALL items in the items array of object tested have no state, or have a state that is uri, or have a state that has recognized value(s)",
    548        "type": "object",
    549        "properties":
    550        {
    551            "items":
    552            { "type": "array",
    553              "minItems": 1,
    554              "items":
    555              {
    556                "oneOf":
    557                 [
    558                   { "$ref": "id.json#/definitions/stringUri" },
    559                   { "$ref": "#/definitions/stateDefined" }
    560                 ]
    561               }
    562            }
    563        }
    564    },
    565 
    566    "stateDetected":
    567    {
    568      "title": "Detection: state type",
    569      "description": "True when object tested has state(s) that is(are) recognized as being one or more of the states described in the model (Section 4.3)",
    570      "type": "object",
    571      "$ref": "#/definitions/stateDefined",
    572      "required": ["state"]
    573    },
    574 
    575    "timeStateTypeDetected":
    576    {
    577      "type": "object",
    578      "properties":
    579      {
    580        "type": { "type": "string", "enum": ["TimeState"] }
    581      },
    582      "required": ["type"]
    583    },
    584 
    585    "timeStateDetected":
    586    {
    587      "title": "Detection: time state",
    588      "description": "True when object is a time state (Section 4.3.1)",
    589      "allOf":
    590      [
    591        { "$ref": "#/definitions/timeStateTypeDetected" },
    592        {
    593          "type": "object",
    594          "properties":
    595          {
    596             "sourceDate":
    597                { "oneOf": [
    598                  { "type": "string",
    599                    "format": "date-time"},
    600                  { "type": "array",
    601                    "minItems": 1,
    602                    "items":
    603                      {"type": "string", "format": "date-time"}
    604                   }
    605                  ]
    606                },
    607              "sourceDateStart": { "type": "string", "format": "date-time"},
    608              "sourceDateEnd": { "type": "string", "format": "date-time"},
    609              "cached": { "type": "string", "format": "uri"}
    610          },
    611          "oneOf":
    612           [
    613               { "required": ["sourceDate"] },
    614               { "required": ["sourceDateStart", "sourceDateEnd"] }
    615           ],
    616          "not":
    617            { "required": [ "sourceDate", "sourceDateStart", "sourceDateEnd" ] }
    618        }
    619      ]
    620    },
    621 
    622    "cachedPropertyFound":
    623    {
    624      "title": "Detection: time state with cached key",
    625      "description": "True when object is a time state with a cached key (Section 4.3.1)",
    626      "type": "object",
    627      "allOf":
    628      [
    629        { "$ref": "#/definitions/timeStateDetected"},
    630        { "required": ["cached"] }
    631      ]
    632    },
    633 
    634    "timeStateTypeValidIfPresent":
    635    {
    636       "description": "True if State Type not detected (i.e., not present), or if both Type and State detected (i.e., State constraints met); note, State cannot be detected if State Type not detected.",
    637       "oneOf":
    638       [
    639         { "not": { "$ref": "#/definitions/timeStateTypeDetected" } },
    640         { "$ref": "#/definitions/timeStateDetected" }
    641       ]
    642    },
    643 
    644    "requestHeaderStateTypeDetected":
    645    {
    646      "type": "object",
    647      "properties":
    648      {
    649        "type": { "type": "string", "enum": ["HttpRequestState"] }
    650      },
    651      "required": ["type"]
    652    },
    653 
    654    "requestHeaderStateDetected":
    655    {
    656      "title": "Detection: request header state",
    657      "description": "True when object is a request header state (Section 4.3.2)",
    658      "allOf":
    659      [
    660        { "$ref": "#/definitions/requestHeaderStateTypeDetected" },
    661        {
    662          "type": "object",
    663          "properties":
    664          {
    665              "value": { "type": "string"}
    666          },
    667          "required": ["value"]
    668        }
    669      ]
    670    },
    671 
    672    "requestHeaderStateTypeValidIfPresent":
    673    {
    674       "description": "True if State Type not detected (i.e., not present), or if both Type and State detected (i.e., State constraints met); note, State cannot be detected if State Type not detected.",
    675       "oneOf":
    676       [
    677         { "not": { "$ref": "#/definitions/requestHeaderStateTypeDetected" } },
    678         { "$ref": "#/definitions/requestHeaderStateDetected" }
    679       ]
    680    },
    681 
    682    "refinedByDefined":
    683    {
    684      "title": "Definition: refinedBy",
    685      "description": "True when object tested has no refinedBy, or has refinedBy identified by uri, or has refinedBy(s) with value matching one or more of the refinedBys described in the model (Section 4.2)",
    686      "type": "object",
    687      "properties":
    688      {
    689        "refinedBy":
    690        {
    691          "oneOf": [
    692          { "$ref": "id.json#/definitions/stringUri" },
    693          { "type": "object",
    694            "anyOf": [
    695            {"$ref": "id.json#/definitions/idValueFound"},
    696            {"$ref": "#/definitions/fragmentSelectorDetected"},
    697            {"$ref": "#/definitions/cssSelectorDetected"},
    698            {"$ref": "#/definitions/xpathSelectorDetected"},
    699              {"$ref": "#/definitions/textQuoteSelectorDetected"},
    700              {"$ref": "#/definitions/textPositionSelectorDetected"},
    701                {"$ref": "#/definitions/dataPositionSelectorDetected"},
    702                {"$ref": "#/definitions/rangeSelectorDetected"},
    703                  {"$ref": "#/definitions/svgSelectorDetected"},
    704                {"$ref": "#/definitions/timeStateDetected"},
    705                {"$ref": "#/definitions/requestHeaderStateDetected"}
    706            ]
    707          },
    708          {
    709            "type": "array",
    710            "minItems": 1,
    711            "items":
    712            { "oneOf": [
    713              { "$ref": "id.json#/definitions/stringUri" },
    714              { "type": "object",
    715                "anyOf": [
    716                {"$ref": "id.json#/definitions/idValueFound"},
    717                {"$ref": "#/definitions/fragmentSelectorDetected"},
    718                {"$ref": "#/definitions/cssSelectorDetected"},
    719                {"$ref": "#/definitions/xpathSelectorDetected"},
    720                  {"$ref": "#/definitions/textQuoteSelectorDetected"},
    721                  {"$ref": "#/definitions/textPositionSelectorDetected"},
    722                    {"$ref": "#/definitions/dataPositionSelectorDetected"},
    723                    {"$ref": "#/definitions/rangeSelectorDetected"},
    724                      {"$ref": "#/definitions/svgSelectorDetected"},
    725                {"$ref": "#/definitions/timeStateDetected"},
    726                {"$ref": "#/definitions/requestHeaderStateDetected"}
    727                ]
    728              }
    729            ]
    730            }
    731          }
    732          ]
    733        }
    734      }
    735    },
    736 
    737    "checkForRefinedBy":
    738    {
    739       "description": "True if no state or selector, if no refinedBy, or if correct refinedBy",
    740       "type": "object",
    741       "patternProperties":
    742        {
    743         "^(state|selector)$":
    744        {"oneOf":
    745         [
    746           { "$ref": "id.json#/definitions/stringUri" },
    747           { "type": "object",
    748             "$ref": "#/definitions/refinedByDefined" },
    749           { "type": "array",
    750             "minItems": 1,
    751             "items":
    752              {"oneOf":
    753                [
    754                  { "$ref": "id.json#/definitions/stringUri" },
    755                  { "type": "object",
    756                    "$ref": "#/definitions/refinedByDefined" }
    757                ]
    758             }
    759           }
    760        ]
    761       }
    762      }
    763    },
    764 
    765    "itemRefinedByValidIfPresent":
    766    {
    767        "description": "True if items in the items array of object tested have no refinedBy, or have a refinedBy that is uri, or have a refinedBy that has recognized value(s)",
    768        "type": "object",
    769        "properties":
    770        {
    771            "items":
    772            { "type": "array",
    773              "minItems": 1,
    774              "items":
    775              {
    776                "oneOf":
    777                 [
    778                   { "$ref": "id.json#/definitions/stringUri" },
    779                   { "$ref": "#/definitions/checkForRefinedBy" }
    780                 ]
    781               }
    782            }
    783        }
    784    },
    785 
    786    "refinedByDetected":
    787    {
    788      "title": "Detection: refinedBy ",
    789      "description": "True when object tested has selector or state that has refinedBy(s) that is(are) recognized as being one or more of the refinedBys described in the model (Section 4.2)",
    790      "type": "object",
    791      "anyOf":
    792       [
    793         { "properties":
    794            { "state" : { "$ref ": "#/definitions/refinedByWithinStateSelector" } },
    795            "required": ["state"]
    796         },
    797         { "properties":
    798            { "selector" : { "$ref ": "#/definitions/refinedByWithinStateSelector" } },
    799            "required": ["selector"]
    800         }
    801       ]
    802    },
    803 
    804    "refinedByWithinStateSelector":
    805    {
    806    "oneOf":
    807      [
    808        { "type": "object",
    809          "$ref": "#/definitions/refinedByDefined",
    810          "required": ["refinedBy"]
    811        },
    812        { "type": "array",
    813          "minItems": 1,
    814          "not":
    815          {
    816           "items":
    817            {"not":
    818               { "type": "object",
    819                 "$ref": "#/definitions/refinedByDefined",
    820                 "required": ["refinedBy"]
    821               }
    822            }
    823          }
    824        }
    825      ]
    826    },
    827 
    828    "styleClassDefinition":
    829    { "$schema": "http://json-schema.org/draft-04/schema#",
    830      "title": "Definition: styleClass property value",
    831      "description": "True when the object has no styleClass property or has a styleClass property that appears with source and that is a string value or array of string values (Section 4.4)",
    832      "properties":
    833         {
    834           "styleClass":
    835            {
    836              "oneOf":
    837              [
    838                { "type": "string" },
    839                { "type": "array",
    840                  "minItems": 1,
    841                  "items": { "type": "string" } }
    842              ]
    843            }
    844         },
    845       "dependencies":
    846       {
    847           "styleClass": ["source"]
    848       }
    849    },
    850 
    851    "styleClassDetected":
    852    { "$schema": "http://json-schema.org/draft-04/schema#",
    853      "title": "Collate: styleClass key with qualifying body/target classes",
    854      "description": "Supports implementation check of styleClass (if/when) used on Specific Resources (Sections 4.4)",
    855      "type": "object",
    856      "allOf": [
    857         { "$ref": "#/definitions/styleClassDefinition" },
    858         { "required": ["styleClass"] }
    859      ]
    860    },
    861 
    862    "itemStyleClassPropertyDetected":
    863    {
    864      "$schema": "http://json-schema.org/draft-04/schema#",
    865      "title": "Collate: items having styleClass key with qualifying body/target classes",
    866      "description": "Supports implementation check of items having styleClass (if/when) used on Specific Resources (Sections 4.4)",
    867      "type": "object",
    868      "properties":
    869      {
    870          "items":
    871          {
    872              "type": "array",
    873              "minItems": 1,
    874              "not":
    875              {
    876                  "items":
    877                  { "not": { "$ref": "#/definitions/styleClassDetected" } }
    878              }
    879          }
    880      },
    881      "required": ["items"]
    882    },
    883 
    884    "renderedViaDefinition":
    885    {   "$schema": "http://json-schema.org/draft-04/schema#",
    886      "title": "Definition: renderedVia property value",
    887      "description": "True when the body/target has no renderedVia property or has a valid renderedVia property (Section 4.5)",
    888      "type": "object",
    889      "properties": {
    890        "renderedVia":
    891        {
    892          "oneOf":
    893            [
    894            { "$ref": "id.json#/definitions/arraySingleStringUri"},
    895            { "$ref": "id.json#/definitions/idValueFound"},
    896            { "type": "array",
    897              "minItems": 1,
    898              "items":
    899              {
    900                "oneOf":
    901                  [
    902                  { "$ref": "id.json#/definitions/arraySingleStringUri"},
    903                  { "$ref": "id.json#/definitions/idValueFound"}
    904                  ]
    905              }
    906            }
    907            ]
    908        }
    909      }
    910    },
    911 
    912    "renderedViaDetected":
    913    { "$schema": "http://json-schema.org/draft-04/schema#",
    914      "title": "Collate: renderedVia key with qualifying body/target classes",
    915      "description": "Supports implementation check of renderedVia (if/when) used on Specific Resources (Sections 4.4)",
    916      "allOf": [
    917         { "$ref": "#/definitions/sourceDetected" },
    918         { "required": ["renderedVia"] },
    919         { "$ref": "#/definitions/renderedViaDefinition" }
    920      ]
    921    },
    922 
    923    "itemRenderedViaPropertyDetected":
    924    {
    925      "$schema": "http://json-schema.org/draft-04/schema#",
    926      "title": "Collate: items having renderedVia key with qualifying body/target classes",
    927      "description": "Supports implementation check of items having renderedVia (if/when) used on Specific Resources (Sections 4.4)",
    928      "type": "object",
    929      "properties":
    930      {
    931          "items":
    932          {
    933              "type": "array",
    934              "minItems": 1,
    935              "not":
    936              {
    937                  "items":
    938                  { "not": { "$ref": "#/definitions/renderedViaDetected" } }
    939              }
    940          }
    941      },
    942      "required": ["items"]
    943    },
    944 
    945    "scopeDefinition":
    946    {   "$schema": "http://json-schema.org/draft-04/schema#",
    947      "title": "Definition: scope property value",
    948      "description": "True when the body/target has no scope property or has a valid scope property (Section 4.6)",
    949      "type": "object",
    950      "properties": {
    951        "scope":
    952        {
    953          "oneOf":
    954            [
    955            { "$ref": "id.json#/definitions/stringUri"},
    956            { "type": "array",
    957              "minItems": 1,
    958              "items": { "$ref": "id.json#/definitions/stringUri"}
    959            }
    960            ]
    961        }
    962      }
    963    },
    964 
    965    "scopeDetected":
    966    { "$schema": "http://json-schema.org/draft-04/schema#",
    967      "title": "Collate: scope key with qualifying body/target classes",
    968      "description": "Supports implementation check of scope (if/when) used on Specific Resource Body (Sections 4.6)",
    969      "allOf": [
    970         {"required": ["scope"]},
    971         {"$ref": "#/definitions/scopeDefinition"}
    972      ]
    973    },
    974 
    975        "sourceWithCreated":
    976        {
    977            "description": "True if no source, or source is uri, or source is object that does not have created key, or if source is object that has only 1 created key of date-time format",
    978            "type": "object",
    979            "properties":
    980            {
    981                "source":
    982                {
    983                    "oneOf":
    984                    [
    985                        { "$ref": "id.json#/definitions/arraySingleStringUri" },
    986                        { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" }
    987                    ]
    988                }
    989            }
    990        },
    991 
    992       "sourceWithModified":
    993        {
    994            "description": "True if no source, or source is uri, or source is object that does not have modified key, or if source is object that has only 1 modified key of date-time format",
    995            "type": "object",
    996            "properties":
    997            {
    998                "source":
    999                {
   1000                    "oneOf":
   1001                    [
   1002                        { "$ref": "id.json#/definitions/arraySingleStringUri" },
   1003                        { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" }
   1004                    ]
   1005                }
   1006            }
   1007        },
   1008 
   1009        "sourceWithRights":
   1010        {
   1011            "description": "True if no source, or source is uri, or source is object that does not have rights key, or if source is object that has rights key with all values of uri format",
   1012            "type": "object",
   1013            "properties":
   1014            {
   1015                "source":
   1016                {
   1017                    "oneOf":
   1018                    [
   1019                        { "$ref": "id.json#/definitions/arraySingleStringUri" },
   1020                        { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" }
   1021                    ]
   1022                }
   1023            }
   1024        },
   1025 
   1026       "sourceWithCanonical":
   1027        {
   1028            "description": "True if no source, or source is uri, or source is object that does not have canonical key, or if source is object that has only 1 canonical key of uri format",
   1029            "type": "object",
   1030            "properties":
   1031            {
   1032                "source":
   1033                {
   1034                    "oneOf":
   1035                    [
   1036                        { "$ref": "id.json#/definitions/arraySingleStringUri" },
   1037                        { "$ref": "otherProperties.json#/definitions/canonicalValidIfPresent" }
   1038                    ]
   1039                }
   1040            }
   1041        },
   1042 
   1043       "sourceWithVia":
   1044        {
   1045            "description": "True if no source, or source is uri, or source is object that does not have via key, or if source is object that has via key with all values of uri format",
   1046            "type": "object",
   1047            "properties":
   1048            {
   1049                "source":
   1050                {
   1051                    "oneOf":
   1052                    [
   1053                        { "$ref": "id.json#/definitions/arraySingleStringUri" },
   1054                        { "$ref": "otherProperties.json#/definitions/viaValidIfPresent" }
   1055                    ]
   1056                }
   1057            }
   1058        },
   1059 
   1060        "sourceWithTextDirection":
   1061        {
   1062            "description": "True if no source, or source is uri, or source is object that does not have textDirection key, or if source is object that has only 1 textDirectoin key, one of ltr, rtl, auto",
   1063            "type": "object",
   1064            "properties":
   1065            {
   1066                "source":
   1067                {
   1068                    "oneOf":
   1069                    [
   1070                        { "$ref": "id.json#/definitions/arraySingleStringUri" },
   1071                        { "$ref": "bodyTarget.json#/definitions/textDirectionValidIfPresent" }
   1072                    ]
   1073                }
   1074            }
   1075        },
   1076 
   1077        "specificResourceWithItems" :
   1078        {
   1079           "description": "True if both source and items keys are present.",
   1080           "allOf":
   1081               [
   1082                { "$ref": "#/definitions/sourceDetected"},
   1083                { "required": [ "items" ] }
   1084               ]
   1085        },
   1086 
   1087    "itemSRWithItems":
   1088    {
   1089      "type": "object",
   1090      "properties":
   1091        {
   1092          "items": {
   1093             "type": "array",
   1094             "minItems": 1,
   1095             "not":
   1096                { "items": {"not": { "$ref": "#/definitions/specificResourceWithItems" } } }
   1097          }
   1098        },
   1099      "required": ["items"]
   1100    },
   1101 
   1102        "specificResourceWithValue" :
   1103        {
   1104           "description": "True if both source and value keys are present.",
   1105            "allOf":
   1106               [
   1107                { "$ref": "#/definitions/sourceDetected"},
   1108                { "required": [ "value" ] }
   1109               ]
   1110        },
   1111 
   1112    "itemSRWithValue":
   1113    {
   1114      "type": "object",
   1115      "properties":
   1116        {
   1117          "items": {
   1118             "type": "array",
   1119             "minItems": 1,
   1120             "not":
   1121                { "items": {"not": { "$ref": "#/definitions/specificResourceWithValue" } } }
   1122          }
   1123        },
   1124      "required": ["items"]
   1125    }
   1126 
   1127  }
   1128 }