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