summaryrefslogtreecommitdiffstats
path: root/browser/components/search/schema
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--browser/components/search/schema/Readme.txt7
-rw-r--r--browser/components/search/schema/search-telemetry-schema.json341
-rw-r--r--browser/components/search/schema/search-telemetry-ui-schema.json20
3 files changed, 368 insertions, 0 deletions
diff --git a/browser/components/search/schema/Readme.txt b/browser/components/search/schema/Readme.txt
new file mode 100644
index 0000000000..14fffb5c10
--- /dev/null
+++ b/browser/components/search/schema/Readme.txt
@@ -0,0 +1,7 @@
+The schemas in this directory are the primary source for the schemas they represent.
+
+They are uploaded to the RemoteSettings server to validate new configurations.
+
+Any changes should be validated by the Search team.
+
+See the documentation for more information: https://firefox-source-docs.mozilla.org/
diff --git a/browser/components/search/schema/search-telemetry-schema.json b/browser/components/search/schema/search-telemetry-schema.json
new file mode 100644
index 0000000000..8bca1f30fb
--- /dev/null
+++ b/browser/components/search/schema/search-telemetry-schema.json
@@ -0,0 +1,341 @@
+{
+ "type": "object",
+ "required": ["telemetryId", "searchPageRegexp", "queryParamName"],
+ "properties": {
+ "telemetryId": {
+ "type": "string",
+ "title": "Telemetry Id",
+ "description": "The telemetry identifier for the provider.",
+ "pattern": "^[a-z0-9-._]*$"
+ },
+ "searchPageRegexp": {
+ "type": "string",
+ "title": "Search Page Regular Expression",
+ "description": "A regular expression which matches the search page of the provider."
+ },
+ "queryParamName": {
+ "type": "string",
+ "title": "Search Query Parameter Name",
+ "description": "The name of the query parameter for the user's search string. This is deprecated, in preference to queryParamNames, but still defined for older clients (pre Firefox 121)."
+ },
+ "queryParamNames": {
+ "type": "array",
+ "title": "Search Query Parameter Names",
+ "description": "An array of query parameters that may be used for the user's search string.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "codeParamName": {
+ "type": "string",
+ "title": "Partner Code Parameter Name",
+ "description": "The name of the query parameter for the partner code."
+ },
+ "taggedCodes": {
+ "type": "array",
+ "title": "Partner Codes",
+ "description": "An array of partner codes to match against the parameters in the url. Matching these codes will report the SERP as tagged.",
+ "items": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9-._]*$"
+ }
+ },
+ "expectedOrganicCodes": {
+ "type": "array",
+ "title": "Expected Organic Codes",
+ "description": "An array of partner codes to match against the parameters in the url. Matching these codes will report the SERP as organic:none which means the user has done a search through the search engine's website rather than through SAP.",
+ "items": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9-._]*$"
+ }
+ },
+ "organicCodes": {
+ "type": "array",
+ "title": "Organic Codes",
+ "description": "An array of partner codes to match against the parameters in the url. Matching these codes will report the SERP as organic:<partner code>, which means the search was performed organically rather than through a SAP.",
+ "items": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9-._]*$"
+ }
+ },
+ "followOnParamNames": {
+ "type": "array",
+ "title": "Follow-on Search Parameter Names",
+ "description": "An array of query parameter names that are used when a follow-on search occurs.",
+ "items": {
+ "type": "string",
+ "pattern": "^[a-z0-9-._]*$"
+ }
+ },
+ "followOnCookies": {
+ "type": "array",
+ "title": "Follow-on Cookies",
+ "description": "An array of cookie details that are used to identify follow-on searches.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "extraCodeParamName": {
+ "type": "string",
+ "description": "The query parameter name in the URL that indicates this might be a follow-on search.",
+ "pattern": "^[a-z0-9-._]*$"
+ },
+ "extraCodePrefixes": {
+ "type": "array",
+ "description": "Possible values for the query parameter in the URL that indicates this might be a follow-on search.",
+ "items": {
+ "type": "string",
+ "pattern": "^[a-zA-Z0-9-._]*$"
+ }
+ },
+ "host": {
+ "type": "string",
+ "description": "The hostname on which the cookie is stored.",
+ "pattern": "^[a-z0-9-._]*$"
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the cookie to check.",
+ "pattern": "^[a-zA-Z0-9-._]*$"
+ },
+ "codeParamName": {
+ "type": "string",
+ "description": "The name of parameter within the cookie.",
+ "pattern": "^[a-zA-Z0-9-._]*$"
+ }
+ }
+ }
+ },
+ "extraAdServersRegexps": {
+ "type": "array",
+ "title": "Extra Ad Server Regular Expressions",
+ "description": "An array of regular expressions that match URLs of potential ad servers.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "adServerAttributes": {
+ "type": "array",
+ "title": "Ad Server Attributes",
+ "description": "An array of strings that potentially match data-attribute keys of anchors.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "components": {
+ "type": "array",
+ "title": "Components",
+ "description": "An array of components that could be on the SERP.",
+ "items": {
+ "required": ["type"],
+ "type": "object",
+ "properties": {
+ "type": {
+ "enum": [
+ "ad_carousel",
+ "ad_image_row",
+ "ad_link",
+ "ad_sitelink",
+ "ad_sidebar",
+ "incontent_searchbox",
+ "refined_search_buttons",
+ "shopping_tab"
+ ],
+ "description": "The type of component the anchor or DOM element should belong to."
+ },
+ "included": {
+ "type": "object",
+ "description": "Conditions that should be fulfilled.",
+ "properties": {
+ "parent": {
+ "title": "Parent",
+ "description": "The DOM element that should only contain elements applicable to a single component type.",
+ "type": "object",
+ "properties": {
+ "selector": {
+ "description": "If topDown is true for this component, then this will be the value used in querySelectorAll(). Otherwise, it will be the value to in closest() from the context of an anchor.",
+ "type": "string"
+ }
+ },
+ "required": ["selector"]
+ },
+ "children": {
+ "type": "array",
+ "title": "Children",
+ "description": "Child DOM elements of the parent. Optional.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "selector": {
+ "type": "string",
+ "description": "The selector to use querySelectorAll from the context of the parent."
+ },
+ "type": {
+ "enum": [
+ "ad_carousel",
+ "ad_image_row",
+ "ad_link",
+ "ad_sitelink",
+ "ad_sidebar",
+ "incontent_searchbox",
+ "refined_search_buttons",
+ "shopping_tab"
+ ],
+ "description": "The component type to use if this child is present."
+ },
+ "countChildren": {
+ "type": "boolean",
+ "description": "Whether we should count all instances of the child element instead of anchor links found inside of the parent. Defaults to false."
+ }
+ },
+ "required": ["selector"]
+ }
+ },
+ "related": {
+ "type": "object",
+ "properties": {
+ "selector": {
+ "type": "string",
+ "description": "The selector to use querySelectorAll from the context of the parent. Any elements specified will have their click events registered and categorized as expanded unless explicitly overwritten in SearchSERPTelemetryChild."
+ }
+ },
+ "required": ["selector"]
+ }
+ },
+ "required": ["parent"]
+ },
+ "excluded": {
+ "type": "object",
+ "description": "Conditions that should not be included.",
+ "properties": {
+ "parent": {
+ "type": "object",
+ "properties": {
+ "selector": {
+ "type": "string",
+ "description": "The root DOM element that shouldn't be a parent from the context of the anchor being inspected."
+ }
+ },
+ "required": ["selector"]
+ }
+ }
+ },
+ "default": {
+ "type": "boolean",
+ "description": "Whether this component should be the fallback option if a link was included in both ad-related regular expressions as well as regular expressions matching non-ad elements but couldn't be categorized. Defaults to false."
+ },
+ "topDown": {
+ "type": "boolean",
+ "description": "Whether the component should be found first by using document.querySelectorAll on the parent selector definition. Defaults to false."
+ },
+ "dependentRequired": {
+ "topDown": ["included"]
+ }
+ }
+ }
+ },
+ "nonAdsLinkRegexps": {
+ "type": "array",
+ "title": "Non-ads link matching regular expressions",
+ "description": "An array containing known patterns that match non-ad links from a search provider.",
+ "items": {
+ "type": "string",
+ "description": "The matching regular expression."
+ }
+ },
+ "shoppingTab": {
+ "type": "object",
+ "title": "Shopping Tab",
+ "properties": {
+ "selector": {
+ "type": "string",
+ "description": "The elements on the page to inspect for the shopping tab. Should be anchor elements."
+ },
+ "regexp": {
+ "type": "string",
+ "description": "The regular expression to match against a possible shopping tab. Must be provided if using this feature."
+ },
+ "inspectRegexpInSERP": {
+ "type": "boolean",
+ "description": "Whether the regexp should be used against hrefs the selector matches against."
+ }
+ },
+ "required": ["selector", "regexp"]
+ },
+ "domainExtraction": {
+ "type": "object",
+ "title": "Domain Extraction",
+ "description": "An array of methods for extracting domains from a SERP result.",
+ "properties": {
+ "ads": {
+ "type": "array",
+ "description": "An array of methods for extracting domains from ads.",
+ "items": {
+ "$ref": "/schemas/extraction"
+ }
+ },
+ "nonAds": {
+ "type": "array",
+ "description": "An array of methods for extracting domains from non-ads.",
+ "items": {
+ "$ref": "/schemas/extraction"
+ }
+ }
+ }
+ }
+ },
+ "$defs": {
+ "extraction": {
+ "$id": "/schemas/extraction",
+ "anyOf": [
+ {
+ "type": "object",
+ "properties": {
+ "selectors": {
+ "type": "string",
+ "description": "The query to inspect all elements on the SERP."
+ },
+ "method": {
+ "enum": ["data-attribute"],
+ "description": "The extraction method used for the query."
+ },
+ "options": {
+ "type": "object",
+ "properties": {
+ "dataAttributeKey": {
+ "type": "string",
+ "description": "The data attribute key that will be looked up in order to retrieve its data attribute value."
+ }
+ },
+ "required": ["dataAttributeKey"]
+ }
+ },
+ "required": ["selectors", "method", "options"]
+ },
+ {
+ "type": "object",
+ "properties": {
+ "selectors": {
+ "type": "string",
+ "description": "The query to use to inspect all elements on the SERP."
+ },
+ "method": {
+ "enum": ["href"],
+ "description": "The extraction method to use for the query."
+ },
+ "options": {
+ "type": "object",
+ "properties": {
+ "queryParamKey": {
+ "type": "string",
+ "description": "The query parameter key to inspect in the href."
+ }
+ },
+ "required": ["queryParamKey"]
+ }
+ },
+ "required": ["selectors", "method"]
+ }
+ ]
+ }
+ }
+}
diff --git a/browser/components/search/schema/search-telemetry-ui-schema.json b/browser/components/search/schema/search-telemetry-ui-schema.json
new file mode 100644
index 0000000000..01c6e89b7e
--- /dev/null
+++ b/browser/components/search/schema/search-telemetry-ui-schema.json
@@ -0,0 +1,20 @@
+{
+ "ui:order": [
+ "telemetryId",
+ "searchPageRegexp",
+ "queryParamNames",
+ "queryParamName",
+ "codeParamName",
+ "taggedCodes",
+ "expectedOrganicCodes",
+ "organicCodes",
+ "followOnParamNames",
+ "followOnCookies",
+ "extraAdServersRegexps",
+ "adServerAttributes",
+ "components",
+ "nonAdsLinkRegexps",
+ "shoppingTab",
+ "domainExtraction"
+ ]
+}