{
  "$defs": {
    "CFRUrlbarChiclet": {
      "$id": "file:///CFRUrlbarChiclet.schema.json",
      "$schema": "https://json-schema.org/draft/2019-09/schema",
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        }
      ],
      "description": "A template with a chiclet button with text.",
      "properties": {
        "content": {
          "additionalProperties": true,
          "properties": {
            "action": {
              "additionalProperties": true,
              "properties": {
                "url": {
                  "description": "The page to open when the button is clicked.",
                  "format": "moz-url-format",
                  "type": "string"
                },
                "where": {
                  "description": "Should it open in a new tab or the current tab",
                  "enum": [
                    "current",
                    "tabshifted"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "url",
                "where"
              ],
              "type": "object"
            },
            "active_color": {
              "description": "Background color of the button",
              "type": "string"
            },
            "bucket_id": {
              "description": "A bucket identifier for the addon. This is used in order to anonymize telemetry for history-sensitive targeting.",
              "type": "string"
            },
            "category": {
              "description": "Attribute used for different groups of messages from the same provider",
              "type": "string"
            },
            "layout": {
              "description": "Describes how content should be displayed.",
              "enum": [
                "chiclet_open_url"
              ],
              "type": "string"
            },
            "notification_text": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "The text in the small blue chicklet that appears in the URL bar. This can be a reference to a localized string in Firefox or just a plain string."
            }
          },
          "required": [
            "layout",
            "category",
            "bucket_id",
            "notification_text",
            "action"
          ],
          "type": "object"
        },
        "template": {
          "const": "cfr_urlbar_chiclet",
          "type": "string"
        }
      },
      "required": [
        "targeting",
        "trigger"
      ],
      "title": "CFRUrlbarChiclet",
      "type": "object"
    },
    "ExtensionDoorhanger": {
      "$defs": {
        "linkUrl": {
          "description": "Target for links or buttons",
          "format": "uri",
          "type": "string"
        },
        "plainText": {
          "description": "Plain text (no HTML allowed)",
          "type": "string"
        }
      },
      "$id": "file:///ExtensionDoorhanger.schema.json",
      "$schema": "https://json-schema.org/draft/2019-09/schema",
      "additionalProperties": true,
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        }
      ],
      "description": "A template with a heading, addon icon, title and description. No markup allowed.",
      "properties": {
        "content": {
          "additionalProperties": true,
          "if": {
            "properties": {
              "skip_address_bar_notifier": {
                "anyOf": [
                  {
                    "const": "false"
                  },
                  {
                    "const": null
                  }
                ]
              }
            }
          },
          "properties": {
            "addon": {
              "description": "Addon information including AMO URL.",
              "properties": {
                "amo_url": {
                  "$ref": "file:///ExtensionDoorhanger.schema.json#/$defs/linkUrl",
                  "description": "Link that offers more information related to the addon."
                },
                "author": {
                  "$ref": "file:///ExtensionDoorhanger.schema.json#/$defs/plainText",
                  "description": "Addon author"
                },
                "icon": {
                  "$ref": "file:///ExtensionDoorhanger.schema.json#/$defs/linkUrl",
                  "description": "The icon displayed in the pop-over. Should be 64x64px and png/svg."
                },
                "id": {
                  "$ref": "file:///ExtensionDoorhanger.schema.json#/$defs/plainText",
                  "description": "Unique addon ID"
                },
                "rating": {
                  "description": "Star rating",
                  "type": "string"
                },
                "title": {
                  "$ref": "file:///ExtensionDoorhanger.schema.json#/$defs/plainText",
                  "description": "Addon name"
                },
                "users": {
                  "description": "Installed users",
                  "type": "string"
                }
              },
              "required": [
                "title",
                "author",
                "icon",
                "amo_url"
              ],
              "type": "object"
            },
            "alt_anchor_id": {
              "description": "An alternate DOM element ID that the pop-over will be anchored.",
              "type": "string"
            },
            "anchor_id": {
              "description": "A DOM element ID that the pop-over will be anchored.",
              "type": "string"
            },
            "bucket_id": {
              "description": "A bucket identifier for the addon. This is used in order to anonymize telemetry for history-sensitive targeting.",
              "type": "string"
            },
            "buttons": {
              "description": "The label and functionality for the buttons in the pop-over.",
              "properties": {
                "primary": {
                  "properties": {
                    "action": {
                      "properties": {
                        "data": {
                          "properties": {
                            "url": {
                              "$comment": "This is dynamically generated from the addon.id. See CFRPageActions.jsm",
                              "description": "URL used in combination with the primary action dispatched.",
                              "type": "string"
                            }
                          }
                        },
                        "type": {
                          "description": "Action dispatched by the button.",
                          "type": "string"
                        }
                      },
                      "type": "object"
                    },
                    "label": {
                      "description": "Id of localized string or message override.",
                      "oneOf": [
                        {
                          "properties": {
                            "attributes": {
                              "description": "Button attributes.",
                              "properties": {
                                "accesskey": {
                                  "description": "A single character to be used as a shortcut key for the secondary button. This should be one of the characters that appears in the button label.",
                                  "type": "string"
                                }
                              },
                              "required": [
                                "accesskey"
                              ],
                              "type": "object"
                            },
                            "value": {
                              "$ref": "file:///ExtensionDoorhanger.schema.json#/$defs/plainText",
                              "description": "Button label override used when a localized version is not available."
                            }
                          },
                          "required": [
                            "value",
                            "attributes"
                          ]
                        },
                        {
                          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizedText"
                        }
                      ],
                      "type": "object"
                    }
                  },
                  "type": "object"
                },
                "secondary": {
                  "items": {
                    "properties": {
                      "action": {
                        "properties": {
                          "data": {
                            "properties": {
                              "url": {
                                "allOf": [
                                  {
                                    "$ref": "file:///ExtensionDoorhanger.schema.json#/$defs/linkUrl"
                                  },
                                  {
                                    "description": "URL used in combination with the primary action dispatched."
                                  }
                                ]
                              }
                            }
                          },
                          "type": {
                            "description": "Action dispatched by the button.",
                            "type": "string"
                          }
                        },
                        "type": "object"
                      },
                      "label": {
                        "description": "Id of localized string or message override.",
                        "oneOf": [
                          {
                            "properties": {
                              "attributes": {
                                "description": "Button attributes.",
                                "properties": {
                                  "accesskey": {
                                    "description": "A single character to be used as a shortcut key for the secondary button. This should be one of the characters that appears in the button label.",
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "accesskey"
                                ],
                                "type": "object"
                              },
                              "value": {
                                "allOf": [
                                  {
                                    "$ref": "file:///ExtensionDoorhanger.schema.json#/$defs/plainText"
                                  },
                                  {
                                    "description": "Button label override used when a localized version is not available."
                                  }
                                ]
                              }
                            },
                            "required": [
                              "value",
                              "attributes"
                            ]
                          },
                          {
                            "properties": {
                              "string_id": {
                                "allOf": [
                                  {
                                    "$ref": "file:///ExtensionDoorhanger.schema.json#/$defs/plainText"
                                  },
                                  {
                                    "description": "Id of localized string for button"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "string_id"
                            ]
                          }
                        ],
                        "type": "object"
                      }
                    },
                    "type": "object"
                  },
                  "type": "array"
                }
              },
              "type": "object"
            },
            "category": {
              "description": "Attribute used for different groups of messages from the same provider",
              "type": "string"
            },
            "descriptionDetails": {
              "description": "Additional information and steps on how to use",
              "properties": {
                "steps": {
                  "description": "Array of string_ids",
                  "items": {
                    "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizedText",
                    "description": "Id of string to localized addon description"
                  },
                  "type": "array"
                }
              },
              "required": [
                "steps"
              ],
              "type": "object"
            },
            "heading_text": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "The larger heading text displayed in the pop-over. This can be a reference to a localized string in Firefox or just a plain string."
            },
            "icon": {
              "$ref": "file:///ExtensionDoorhanger.schema.json#/$defs/linkUrl",
              "description": "The icon displayed in the pop-over. Should be 32x32px or 64x64px and png/svg."
            },
            "icon_class": {
              "description": "CSS class of the pop-over icon.",
              "type": "string"
            },
            "icon_dark_theme": {
              "description": "Pop-over icon, dark theme variant. Should be 32x32px or 64x64px and png/svg.",
              "type": "string"
            },
            "info_icon": {
              "description": "The small icon displayed in the top right corner of the pop-over. Should be 19x19px, svg or png. Defaults to a small question mark.",
              "properties": {
                "label": {
                  "oneOf": [
                    {
                      "properties": {
                        "attributes": {
                          "properties": {
                            "tooltiptext": {
                              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
                              "description": "Text for button tooltip used to provide information about the doorhanger."
                            }
                          },
                          "required": [
                            "tooltiptext"
                          ],
                          "type": "object"
                        }
                      },
                      "required": [
                        "attributes"
                      ],
                      "type": "object"
                    },
                    {
                      "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizedText"
                    }
                  ]
                },
                "sumo_path": {
                  "description": "Last part of the path in the URL to the support page with the information about the doorhanger.",
                  "examples": [
                    "extensionpromotions",
                    "extensionrecommendations"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "layout": {
              "description": "Attribute used for different groups of messages from the same provider",
              "enum": [
                "short_message",
                "icon_and_message",
                "addon_recommendation"
              ],
              "type": "string"
            },
            "learn_more": {
              "description": "Last part of the path in the SUMO URL to the support page with the information about the doorhanger.",
              "examples": [
                "extensionpromotions",
                "extensionrecommendations"
              ],
              "type": "string"
            },
            "notification_text": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "The text in the small blue chicklet that appears in the URL bar. This can be a reference to a localized string in Firefox or just a plain string."
            },
            "persistent_doorhanger": {
              "description": "Prevent the doorhanger from being dismissed if user interacts with the page or switches between applications.",
              "type": "boolean"
            },
            "show_in_private_browsing": {
              "description": "Whether to allow the message to be shown in private browsing mode. Defaults to false.",
              "type": "boolean"
            },
            "skip_address_bar_notifier": {
              "description": "Skip the 'Recommend' notifier and show directly.",
              "type": "boolean"
            },
            "text": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "The body text displayed in the pop-over. This can be a reference to a localized string in Firefox or just a plain string."
            }
          },
          "required": [
            "layout",
            "bucket_id",
            "heading_text",
            "text",
            "buttons"
          ],
          "then": {
            "required": [
              "category",
              "notification_text"
            ]
          },
          "type": "object"
        },
        "template": {
          "enum": [
            "cfr_doorhanger",
            "milestone_message"
          ],
          "type": "string"
        }
      },
      "required": [
        "targeting",
        "trigger"
      ],
      "title": "ExtensionDoorhanger",
      "type": "object"
    },
    "InfoBar": {
      "$defs": {
        "linkUrl": {
          "description": "Target for links or buttons",
          "format": "uri",
          "type": "string"
        },
        "plainText": {
          "description": "Plain text (no HTML allowed)",
          "type": "string"
        }
      },
      "$id": "file:///InfoBar.schema.json",
      "$schema": "https://json-schema.org/draft/2019-09/schema",
      "additionalProperties": true,
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        }
      ],
      "description": "A template with an image, test and buttons.",
      "properties": {
        "content": {
          "additionalProperties": true,
          "properties": {
            "buttons": {
              "items": {
                "additionalProperties": true,
                "properties": {
                  "accessKey": {
                    "description": "Keyboard shortcut letter.",
                    "type": "string"
                  },
                  "action": {
                    "additionalProperties": true,
                    "properties": {
                      "data": {
                        "type": "object"
                      },
                      "type": {
                        "description": "Action dispatched by the button.",
                        "type": "string"
                      }
                    },
                    "required": [
                      "type"
                    ],
                    "type": "object"
                  },
                  "label": {
                    "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
                    "description": "The text label of the button."
                  },
                  "primary": {
                    "description": "Is this the primary button?",
                    "type": "boolean"
                  },
                  "supportPage": {
                    "description": "A page title on SUMO to link to",
                    "type": "string"
                  }
                },
                "required": [
                  "label",
                  "action"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "priority": {
              "description": "Infobar priority level https://searchfox.org/mozilla-central/rev/3aef835f6cb12e607154d56d68726767172571e4/toolkit/content/widgets/notificationbox.js#387",
              "exclusiveMaximum": 10,
              "minumum": 0,
              "type": "number"
            },
            "text": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "The text show in the notification box."
            },
            "type": {
              "description": "Should the message be global (persisted across tabs) or local (disappear when switching to a different tab).",
              "enum": [
                "global",
                "tab"
              ],
              "type": "string"
            }
          },
          "required": [
            "text",
            "buttons"
          ],
          "type": "object"
        },
        "template": {
          "const": "infobar",
          "type": "string"
        }
      },
      "required": [
        "targeting",
        "trigger"
      ],
      "title": "InfoBar",
      "type": "object"
    },
    "Message": {
      "additionalProperties": true,
      "dependentRequired": {
        "content": [
          "id",
          "template"
        ],
        "template": [
          "id",
          "content"
        ]
      },
      "properties": {
        "frequency": {
          "description": "An object containing frequency cap information for a message.",
          "properties": {
            "custom": {
              "description": "An array of custom frequency cap definitions.",
              "items": {
                "description": "A frequency cap definition containing time and max impression information",
                "properties": {
                  "cap": {
                    "description": "The maximum impressions for the message within the defined period.",
                    "maximum": 100,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "period": {
                    "description": "Period of time in milliseconds (e.g. 86400000 for one day)",
                    "type": "integer"
                  }
                },
                "required": [
                  "period",
                  "cap"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "lifetime": {
              "description": "The maximum lifetime impressions for a message.",
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          "type": "object"
        },
        "groups": {
          "description": "Array of preferences used to control `enabled` status of the group. If any is `false` the group is disabled.",
          "items": {
            "description": "Preference name",
            "type": "string"
          },
          "type": "array"
        },
        "id": {
          "description": "The message identifier",
          "type": "string"
        },
        "order": {
          "description": "The order in which messages should be shown. Messages will be shown in increasing order.",
          "type": "integer"
        },
        "priority": {
          "description": "The priority of the message. If there are two competing messages to show, the one with the highest priority will be shown",
          "type": "integer"
        },
        "provider": {
          "description": "An identifier for the provider of this message, such as \"cfr\" or \"preview\".",
          "type": "string"
        },
        "targeting": {
          "description": "A JEXL expression representing targeting information",
          "type": "string"
        },
        "template": {
          "description": "Which messaging template this message is using.",
          "enum": [
            "cfr_urlbar_chiclet",
            "cfr_doorhanger",
            "milestone_message",
            "infobar",
            "pb_newtab",
            "protections_panel",
            "spotlight",
            "feature_callout",
            "toast_notification",
            "toolbar_badge",
            "update_action",
            "whatsnew_panel_message"
          ],
          "type": "string"
        },
        "trigger": {
          "description": "An action to trigger potentially showing the message",
          "properties": {
            "id": {
              "description": "A string identifying the trigger action",
              "type": "string"
            },
            "params": {
              "description": "An optional array of string parameters for the trigger action",
              "items": {
                "anyOf": [
                  {
                    "type": "integer"
                  },
                  {
                    "type": "string"
                  }
                ]
              },
              "type": "array"
            }
          },
          "required": [
            "id"
          ],
          "type": "object"
        }
      },
      "type": "object"
    },
    "MultiMessage": {
      "description": "An object containing an array of messages.",
      "properties": {
        "messages": {
          "description": "An array of messages.",
          "items": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/TemplatedMessage"
          },
          "type": "array"
        },
        "template": {
          "const": "multi",
          "type": "string"
        }
      },
      "required": [
        "template",
        "messages"
      ],
      "type": "object"
    },
    "NewtabPromoMessage": {
      "$id": "file:///NewtabPromoMessage.schema.json",
      "$schema": "https://json-schema.org/draft/2019-09/schema",
      "additionalProperties": true,
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        }
      ],
      "description": "Message shown on the private browsing newtab page.",
      "properties": {
        "content": {
          "additionalProperties": true,
          "allOf": [
            {
              "if": {
                "properties": {
                  "promoEnabled": {
                    "const": true
                  }
                },
                "required": [
                  "promoEnabled"
                ]
              },
              "then": {
                "required": [
                  "promoButton"
                ]
              }
            },
            {
              "if": {
                "properties": {
                  "infoEnabled": {
                    "const": true
                  }
                },
                "required": [
                  "infoEnabled"
                ]
              },
              "then": {
                "if": {
                  "properties": {
                    "infoTitleEnabled": {
                      "const": true
                    }
                  },
                  "required": [
                    "infoTitleEnabled"
                  ]
                },
                "required": [
                  "infoLinkText"
                ],
                "then": {
                  "required": [
                    "infoTitle"
                  ]
                }
              }
            }
          ],
          "properties": {
            "hideDefault": {
              "description": "Should we hide the default promo after the experiment promo is dismissed.",
              "type": "boolean"
            },
            "infoBody": {
              "description": "Text content in the info section.",
              "type": "string"
            },
            "infoEnabled": {
              "description": "Should we show the info section.",
              "type": "boolean"
            },
            "infoIcon": {
              "description": "Icon shown in the left side of the info section. Default is the private browsing icon.",
              "type": "string"
            },
            "infoLinkText": {
              "description": "Text for the link in the info section.",
              "type": "string"
            },
            "infoLinkUrl": {
              "description": "URL for the info section link.",
              "format": "moz-url-format",
              "type": "string"
            },
            "infoTitle": {
              "description": "Is the title in the info section enabled.",
              "type": "string"
            },
            "infoTitleEnabled": {
              "description": "Is the title in the info section enabled.",
              "type": "boolean"
            },
            "promoButton": {
              "properties": {
                "action": {
                  "additionalProperties": true,
                  "properties": {
                    "data": {
                      "type": "object"
                    },
                    "type": {
                      "description": "Action dispatched by the button.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type"
                  ],
                  "type": "object"
                }
              },
              "required": [
                "action"
              ],
              "type": "object"
            },
            "promoEnabled": {
              "description": "Should we show the promo section.",
              "type": "boolean"
            },
            "promoHeader": {
              "description": "The title of the promo section.",
              "type": "string"
            },
            "promoImageLarge": {
              "description": "URL for image used on the left side of the promo box, larger, showcases some feature. Default off.",
              "format": "uri",
              "type": "string"
            },
            "promoImageSmall": {
              "description": "URL for image used on the right side of the promo box, smaller, usually a logo. Default off.",
              "format": "uri",
              "type": "string"
            },
            "promoLinkText": {
              "description": "The text of the link in the promo box.",
              "type": "string"
            },
            "promoLinkType": {
              "description": "Type of promo link type. Possible values: link, button. Default is link.",
              "enum": [
                "link",
                "button"
              ],
              "type": "string"
            },
            "promoSectionStyle": {
              "description": "Sets the position of the promo section. Possible values are: top, below-search, bottom. Default bottom.",
              "enum": [
                "top",
                "below-search",
                "bottom"
              ],
              "type": "string"
            },
            "promoTitle": {
              "description": "The text content of the promo section.",
              "type": "string"
            },
            "promoTitleEnabled": {
              "description": "Should we show text content in the promo section.",
              "type": "boolean"
            },
            "promoType": {
              "description": "Promo type used to determine if promo should show to a given user",
              "enum": [
                "FOCUS",
                "VPN",
                "PIN",
                "COOKIE_BANNERS",
                "OTHER"
              ],
              "type": "string"
            }
          },
          "type": "object"
        },
        "template": {
          "const": "pb_newtab",
          "type": "string"
        }
      },
      "required": [
        "targeting"
      ],
      "title": "PBNewtabPromoMessage",
      "type": "object"
    },
    "ProtectionsPanelMessage": {
      "$id": "file:///ProtectionsPanelMessage.schema.json",
      "$schema": "https://json-schema.org/draft/2019-09/schema",
      "additionalProperties": true,
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        }
      ],
      "description": "A message shown in the protections panel.",
      "properties": {
        "content": {
          "additionalProperties": false,
          "dependantSchemas": {
            "cta_type": [
              "link_text"
            ],
            "cta_url": [
              "link_text"
            ],
            "cta_where": [
              "link_text"
            ],
            "link_text": [
              "cta_type",
              "cta_url"
            ]
          },
          "properties": {
            "body": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "The body of the message."
            },
            "cta_type": {
              "description": "The type of URL open action.",
              "enum": [
                "OPEN_URL",
                "OPEN_PROTECTION_REPORT",
                "OPEN_ABOUT_PAGE"
              ],
              "type": "string"
            },
            "cta_url": {
              "description": "The URL to open when the call to action is clicked",
              "format": "moz-url-format",
              "type": "string"
            },
            "cta_where": {
              "description": "How to open the cta.",
              "enum": [
                "current",
                "tabshifted",
                "tab",
                "save",
                "window"
              ],
              "type": "string"
            },
            "link_text": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "The text of the call to action link."
            },
            "title": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "The message title."
            }
          },
          "required": [
            "title",
            "body"
          ],
          "type": "object"
        },
        "template": {
          "const": "protections_panel",
          "type": "string"
        },
        "trigger": {
          "const": {
            "id": "protectionsPanelOpen"
          },
          "description": "An action to trigger potentially showing the message. The action ID `protectionsPanelOpen` is required."
        }
      },
      "required": [
        "content",
        "template",
        "trigger"
      ],
      "title": "ProtectionsPanelMessage",
      "type": "object"
    },
    "Spotlight": {
      "$id": "file:///Spotlight.schema.json",
      "$schema": "https://json-schema.org/draft/2019-09/schema",
      "additionalProperties": true,
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        }
      ],
      "description": "A template with an image, title, content and two buttons.",
      "properties": {
        "content": {
          "additionalProperties": true,
          "properties": {
            "backdrop": {
              "description": "Background css behind modal content",
              "type": "string"
            },
            "disableHistoryUpdates": {
              "description": "Don't alter the browser session's history stack - used with messaging surfaces like Feature Callouts",
              "type": "boolean"
            },
            "logo": {
              "additionalProperties": true,
              "properties": {
                "imageId": {
                  "description": "The ID for a remotely hosted image",
                  "type": "string"
                },
                "imageURL": {
                  "description": "URL for image to use with the content",
                  "type": "string"
                },
                "size": {
                  "description": "The logo size.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "screens": {
              "description": "Collection of individual screen content",
              "type": "array"
            },
            "startScreen": {
              "description": "Index of first screen to show from message, defaulting to 0",
              "type": "integer"
            },
            "template": {
              "const": "multistage",
              "description": "Specify the layout template for the Spotlight",
              "type": "string"
            },
            "transitions": {
              "description": "Show transitions within and between screens",
              "type": "boolean"
            }
          },
          "type": "object"
        },
        "template": {
          "description": "Specify whether the surface is shown as a Spotlight modal or an in-surface Feature Callout dialog",
          "enum": [
            "spotlight",
            "feature_callout"
          ],
          "type": "string"
        }
      },
      "required": [
        "targeting"
      ],
      "title": "Spotlight",
      "type": "object"
    },
    "TemplatedMessage": {
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        },
        {
          "if": {
            "properties": {
              "template": {
                "enum": [
                  "cfr_urlbar_chiclet"
                ],
                "type": "string"
              }
            },
            "required": [
              "template"
            ],
            "type": "object"
          },
          "then": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/CFRUrlbarChiclet"
          }
        },
        {
          "if": {
            "properties": {
              "template": {
                "enum": [
                  "cfr_doorhanger",
                  "milestone_message"
                ],
                "type": "string"
              }
            },
            "required": [
              "template"
            ],
            "type": "object"
          },
          "then": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/ExtensionDoorhanger"
          }
        },
        {
          "if": {
            "properties": {
              "template": {
                "enum": [
                  "infobar"
                ],
                "type": "string"
              }
            },
            "required": [
              "template"
            ],
            "type": "object"
          },
          "then": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/InfoBar"
          }
        },
        {
          "if": {
            "properties": {
              "template": {
                "enum": [
                  "pb_newtab"
                ],
                "type": "string"
              }
            },
            "required": [
              "template"
            ],
            "type": "object"
          },
          "then": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/NewtabPromoMessage"
          }
        },
        {
          "if": {
            "properties": {
              "template": {
                "enum": [
                  "protections_panel"
                ],
                "type": "string"
              }
            },
            "required": [
              "template"
            ],
            "type": "object"
          },
          "then": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/ProtectionsPanelMessage"
          }
        },
        {
          "if": {
            "properties": {
              "template": {
                "enum": [
                  "spotlight",
                  "feature_callout"
                ],
                "type": "string"
              }
            },
            "required": [
              "template"
            ],
            "type": "object"
          },
          "then": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Spotlight"
          }
        },
        {
          "if": {
            "properties": {
              "template": {
                "enum": [
                  "toast_notification"
                ],
                "type": "string"
              }
            },
            "required": [
              "template"
            ],
            "type": "object"
          },
          "then": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/ToastNotification"
          }
        },
        {
          "if": {
            "properties": {
              "template": {
                "enum": [
                  "toolbar_badge"
                ],
                "type": "string"
              }
            },
            "required": [
              "template"
            ],
            "type": "object"
          },
          "then": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/ToolbarBadgeMessage"
          }
        },
        {
          "if": {
            "properties": {
              "template": {
                "enum": [
                  "update_action"
                ],
                "type": "string"
              }
            },
            "required": [
              "template"
            ],
            "type": "object"
          },
          "then": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/UpdateAction"
          }
        },
        {
          "if": {
            "properties": {
              "template": {
                "enum": [
                  "whatsnew_panel_message"
                ],
                "type": "string"
              }
            },
            "required": [
              "template"
            ],
            "type": "object"
          },
          "then": {
            "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/WhatsNewMessage"
          }
        }
      ],
      "description": "An FxMS message of one of a variety of types.",
      "type": "object"
    },
    "ToastNotification": {
      "$id": "file:///ToastNotification.schema.json",
      "$schema": "https://json-schema.org/draft/2019-09/schema",
      "additionalProperties": true,
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        }
      ],
      "description": "A template for toast notifications displayed by the Alert service.",
      "properties": {
        "content": {
          "additionalProperties": true,
          "properties": {
            "actions": {
              "items": {
                "additionalProperties": true,
                "properties": {
                  "action": {
                    "description": "Opaque identifer that identifies action.",
                    "type": "string"
                  },
                  "iconURL": {
                    "description": "URL of an icon to display with the action.",
                    "format": "uri",
                    "type": "string"
                  },
                  "title": {
                    "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
                    "description": "The action text to be shown to the user."
                  },
                  "windowsSystemActivationType": {
                    "description": "Whether to have Windows process the given `action`.",
                    "type": "boolean"
                  }
                },
                "required": [
                  "action",
                  "title"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "body": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "Id of localized string or message override of toast notification body"
            },
            "data": {
              "description": "Arbitrary data associated with the toast notification.",
              "type": "object"
            },
            "icon_url": {
              "description": "The URL of the image used as an icon of the toast notification.",
              "format": "moz-url-format",
              "type": "string"
            },
            "image_url": {
              "description": "The URL of an image to be displayed as part of the notification.",
              "format": "moz-url-format",
              "type": "string"
            },
            "launch_url": {
              "description": "The URL to launch when the notification or an action button is clicked.",
              "format": "moz-url-format",
              "type": "string"
            },
            "requireInteraction": {
              "description": "Whether the toast notification should remain active until the user clicks or dismisses it, rather than closing automatically.",
              "type": "boolean"
            },
            "tag": {
              "description": "An identifying tag for the toast notification.",
              "type": "string"
            },
            "title": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "Id of localized string or message override of toast notification title"
            }
          },
          "required": [
            "title",
            "body"
          ],
          "type": "object"
        },
        "template": {
          "const": "toast_notification",
          "type": "string"
        }
      },
      "required": [
        "content",
        "targeting",
        "template",
        "trigger"
      ],
      "title": "ToastNotification",
      "type": "object"
    },
    "ToolbarBadgeMessage": {
      "$id": "file:///ToolbarBadgeMessage.schema.json",
      "$schema": "https://json-schema.org/draft/2019-09/schema",
      "additionalProperties": true,
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        }
      ],
      "description": "A template that specifies to which element in the browser toolbar to add a notification.",
      "properties": {
        "content": {
          "additionalProperties": true,
          "properties": {
            "action": {
              "additionalProperties": true,
              "description": "Optional action to take in addition to showing the notification",
              "properties": {
                "id": {
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "badgeDescription": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizedText",
              "description": "This is used in combination with the badged button to offer a text based alternative to the visual badging. Example 'New Feature: What's New'"
            },
            "delay": {
              "description": "Optional delay in ms after which to show the notification",
              "type": "number"
            },
            "target": {
              "type": "string"
            }
          },
          "required": [
            "target"
          ],
          "type": "object"
        },
        "template": {
          "const": "toolbar_badge",
          "type": "string"
        }
      },
      "required": [
        "targeting"
      ],
      "title": "ToolbarBadgeMessage",
      "type": "object"
    },
    "UpdateAction": {
      "$id": "file:///UpdateAction.schema.json",
      "$schema": "https://json-schema.org/draft/2019-09/schema",
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        }
      ],
      "description": "A template for messages that execute predetermined actions.",
      "properties": {
        "content": {
          "additionalProperties": true,
          "properties": {
            "action": {
              "additionalProperties": true,
              "description": "Optional action to take in addition to showing the notification",
              "properties": {
                "data": {
                  "description": "Additional data provided as argument when executing the action",
                  "properties": {
                    "expireDelta": {
                      "description": "Expiration timestamp to be used as argument to the action",
                      "type": "number"
                    },
                    "url": {
                      "description": "URL data to be used as argument to the action",
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "id": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "data"
              ],
              "type": "object"
            }
          },
          "required": [
            "action"
          ],
          "type": "object"
        },
        "template": {
          "const": "update_action",
          "type": "string"
        }
      },
      "required": [
        "targeting"
      ],
      "title": "UpdateActionMessage",
      "type": "object"
    },
    "WhatsNewMessage": {
      "$id": "file:///WhatsNewMessage.schema.json",
      "$schema": "https://json-schema.org/draft/2019-09/schema",
      "additionalProperties": true,
      "allOf": [
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/Message"
        }
      ],
      "description": "A template for the messages that appear in the What's New panel.",
      "properties": {
        "content": {
          "additionalProperties": true,
          "properties": {
            "body": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "Id of localized string or message override of What's New message body"
            },
            "bucket_id": {
              "description": "A bucket identifier for the addon. This is used in order to anonymize telemetry for history-sensitive targeting.",
              "type": "string"
            },
            "cta_type": {
              "description": "Type of url open action",
              "enum": [
                "OPEN_URL",
                "OPEN_ABOUT_PAGE",
                "OPEN_PROTECTION_REPORT"
              ]
            },
            "cta_url": {
              "description": "Target URL for the What's New message.",
              "format": "moz-url-format",
              "type": "string"
            },
            "cta_where": {
              "description": "How to open the cta: new window, tab, focused, unfocused.",
              "enum": [
                "current",
                "tabshifted",
                "tab",
                "save",
                "window"
              ]
            },
            "icon_alt": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "Alt text for image."
            },
            "icon_url": {
              "description": "(optional) URL for the What's New message icon.",
              "format": "uri",
              "type": "string"
            },
            "layout": {
              "description": "Different message layouts",
              "enum": [
                "tracking-protections"
              ]
            },
            "link_text": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "(optional) Id of localized string or message override of What's New message link text"
            },
            "published_date": {
              "description": "The date/time (number of milliseconds elapsed since January 1, 1970 00:00:00 UTC) the message was published.",
              "type": "integer"
            },
            "subtitle": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "Id of localized string or message override of What's New message subtitle"
            },
            "title": {
              "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizableText",
              "description": "Id of localized string or message override of What's New message title"
            }
          },
          "required": [
            "published_date",
            "title",
            "body",
            "cta_url",
            "bucket_id"
          ],
          "type": "object"
        },
        "template": {
          "const": "whatsnew_panel_message",
          "type": "string"
        }
      },
      "required": [
        "order"
      ],
      "title": "WhatsNewMessage",
      "type": "object"
    },
    "localizableText": {
      "description": "Either a raw string or an object containing the string_id of the localized text",
      "oneOf": [
        {
          "description": "The string to be rendered.",
          "type": "string"
        },
        {
          "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/localizedText"
        }
      ]
    },
    "localizedText": {
      "properties": {
        "string_id": {
          "description": "Id of localized string to be rendered.",
          "type": "string"
        }
      },
      "required": [
        "string_id"
      ],
      "type": "object"
    }
  },
  "$id": "resource://activity-stream/schemas/MessagingExperiment.schema.json",
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "description": "A Firefox Messaging System message.",
  "else": {
    "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/TemplatedMessage"
  },
  "if": {
    "properties": {
      "template": {
        "const": "multi"
      }
    },
    "required": [
      "template"
    ],
    "type": "object"
  },
  "then": {
    "$ref": "resource://activity-stream/schemas/MessagingExperiment.schema.json#/$defs/MultiMessage"
  },
  "title": "Messaging Experiment"
}