{
  "specification": [
    {
      "name": "optionally-blockable",
      "title": "Optionally-blockable content",
      "description": "Test behavior of optionally-blockable content",
      "specification_url": "http://www.w3.org/TR/mixed-content/#category-optionally-blockable",
      "test_expansion": [
        {
          "name": "opt-in-blocks",
          "expansion": "default",
          "source_scheme": "https",
          "opt_in_method": ["http-csp", "meta-csp"],
          "context_nesting": "top-level",
          "redirection": "*",
          "subresource": {
            "blockable": [],
            "optionally-blockable": "*"
          },
          "origin": ["cross-origin-http", "same-host-http"],
          "expectation": "blocked"
        },
        {
          "name": "no-opt-in-allows",
          "expansion": "default",
          "source_scheme": "https",
          "opt_in_method": "no-opt-in",
          "context_nesting": "top-level",
          "redirection": "*",
          "subresource": {
            "blockable": [],
            "optionally-blockable": "*"
          },
          "origin": ["cross-origin-http", "same-host-http"],
          "expectation": "allowed"
        }
      ]
    },
    {
      "name": "blockable",
      "title": "Blockable content",
      "description": "Test behavior of blockable content.",
      "specification_url": "http://www.w3.org/TR/mixed-content/#category-blockable",
      "test_expansion": [
        {
          "name": "opt-in-blocks",
          "expansion": "default",
          "source_scheme": "https",
          "opt_in_method": ["http-csp", "meta-csp"],
          "context_nesting": "top-level",
          "redirection": "*",
          "subresource": {
            "blockable": "*",
            "optionally-blockable": []
          },
          "origin": ["cross-origin-http", "same-host-http"],
          "expectation": "blocked"
        },
        {
          "name": "no-opt-in-blocks",
          "expansion": "default",
          "source_scheme": "https",
          "opt_in_method": "no-opt-in",
          "context_nesting": "top-level",
          "redirection": "*",
          "subresource": {
            "blockable": "*",
            "optionally-blockable": []
          },
          "origin": ["cross-origin-http", "same-host-http"],
          "expectation": "blocked"
        },
        {
          "name": "ws-downgrade-blocks",
          "expansion": "default",
          "source_scheme": "https",
          "opt_in_method": ["no-opt-in", "http-csp", "meta-csp"],
          "context_nesting": "top-level",
          "redirection": "*",
          "subresource": {
            "blockable": "websocket-request",
            "optionally-blockable": []
          },
          "origin": ["cross-origin-ws", "same-host-ws"],
          "expectation": "blocked"
        }
      ]
    },
    {
      "name": "allowed",
      "title": "Allowed content",
      "description": "Test behavior of allowed content.",
      "specification_url": "http://www.w3.org/TR/mixed-content/",
      "test_expansion": [
        {
          "name": "allowed",
          "expansion": "default",
          "source_scheme": "https",
          "opt_in_method": "*",
          "context_nesting": "top-level",
          "redirection": ["no-redirect", "keep-scheme-redirect"],
          "subresource": {
            "blockable": "*",
            "optionally-blockable": "*"
          },
          "origin": ["same-host-https"],
          "expectation": "allowed"
        },
        {
          "name": "websocket-allowed",
          "expansion": "default",
          "source_scheme": "https",
          "opt_in_method": "*",
          "context_nesting": "top-level",
          "redirection": ["no-redirect", "keep-scheme-redirect"],
          "subresource": {
            "blockable": "websocket-request",
            "optionally-blockable": []
          },
          "origin": ["same-host-wss"],
          "expectation": "allowed"
        }
      ]
    }
  ],

  "excluded_tests": [
    {
      "name": "Redundant-subresources",
      "expansion": "*",
      "source_scheme": "*",
      "opt_in_method": "*",
      "context_nesting": "*",
      "redirection": "*",
      "subresource": {
        "blockable": [
          "a-tag"
        ],
        "optionally-blockable": []
      },
      "origin": "*",
      "expectation": "*"
    },
    {
      "name": "Skip-origins-not-applicable-to-websockets",
      "expansion": "*",
      "source_scheme": "*",
      "opt_in_method": "*",
      "context_nesting": "*",
      "redirection": "*",
      "subresource": {
        "blockable": [
          "websocket-request"
        ],
        "optionally-blockable": []
      },
      "origin": [
        "same-host-https",
        "same-host-http",
        "cross-origin-https",
        "cross-origin-http"
      ],
      "expectation": "*"
    },
    {
      "name": "TODO-opt-in-method-img-cross-origin",
      "expansion": "*",
      "source_scheme": "*",
      "opt_in_method": "img-crossorigin",
      "context_nesting": "*",
      "redirection": "*",
      "subresource": {
        "blockable": "*",
        "optionally-blockable": "*"
      },
      "origin": "*",
      "expectation": "*"
    },
    {
      "name": "Skip-redundant-for-opt-in-method",
      "expansion": "*",
      "source_scheme": "*",
      "opt_in_method":  [
        "meta-csp",
        "img-crossorigin"
      ],
      "context_nesting": "*",
      "redirection": ["keep-scheme-redirect", "swap-scheme-redirect"],
      "subresource": {
        "blockable": "*",
        "optionally-blockable": "*"
      },
      "origin": "*",
      "expectation": "*"
    }
  ],

  "test_expansion_schema": {
    "expansion": [
      "default",
      "override"
    ],
    "source_scheme": [
      "http",
      "https"
    ],
    "opt_in_method": [
      "no-opt-in",
      "http-csp",
      "meta-csp",
      "img-crossorigin"
    ],
    "redirection": [
      "no-redirect",
      "keep-scheme-redirect",
      "swap-scheme-redirect"
    ],
    "context_nesting": [
      "top-level",
      "sub-level"
    ],
    "origin": [
      "same-host-https",
      "same-host-http",
      "cross-origin-https",
      "cross-origin-http",
      "same-host-wss",
      "same-host-ws",
      "cross-origin-wss",
      "cross-origin-ws"
    ],
    "subresource": {
      "blockable": [
        "iframe-tag",
        "script-tag",
        "link-css-tag",
        "form-tag",
        "xhr-request",
        "worker-request",
        "fetch-request",
        "a-tag",
        "object-tag",
        "picture-tag",
        "websocket-request"
      ],
      "optionally-blockable": [
        "img-tag",
        "audio-tag",
        "video-tag",
        "link-prefetch-tag"
      ]
    },
    "expectation": [
      "allowed",
      "blocked"
    ]
  }
}
