Custom template permissions

This document outlines the permissions for Web custom templates.


Each permission is:

  • Checked by APIs that require them.
  • Automatically detected in sandboxed JavaScript, based on what APIs are used. This happens as edits are made in the custom template editor (for a fast feedback loop), and when code is compiled (to validate that the correct permissions are enforced).
  • Editable in the custom template editor, to make the permission more specific.
  • Queryable in sandboxed JavaScript via the queryPermission API.

access_globals

Display name:Accesses global variables

Description:Allows access to a global variable (potentially including sensitive APIs).

Configuration:List of keys that can be accessed. Each key is a dot separated path. For example: foo.bar The first token in each path must not be a predefined key on browser global scope, nor a JavaScript keyword. Has read, write, and execute checkboxes that govern access.

Required by: setInWindow , copyFromWindow , callInWindow , createQueue , createArgumentsQueue

Query signature: queryPermission('access_globals', 'read', <key to read from>) or queryPermission('access_globals', 'write', <key to write to>) or queryPermission('access_globals', 'readwrite', <key to read and write>) or queryPermission('access_globals', 'execute', <key of function to execute>)

Notes:Controls whether a custom template can read and/or write to global values.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 createQueue 
  
 = 
  
 require 
 ( 
 'createQueue' 
 ); 
 if 
  
 ( 
 queryPermission 
 ( 
 'access_globals' 
 , 
  
 'readwrite' 
 , 
  
 'dataLayer' 
 )) 
  
 { 
  
 const 
  
 dataLayerPush 
  
 = 
  
 createQueue 
 ( 
 'dataLayer' 
 ); 
 } 
 

access_local_storage

Display name:Accesses local storage

Description:Allows access to the specified keys in local storage.

Configuration:List of local storage keys that can be accessed. This is a simple array of keys, with no wildcards. Has read and write checkboxes that govern access.

Required by: localStorage

Query signature: queryPermission('access_local_storage', 'read', <key to read from>) or queryPermission('access_local_storage', 'write', <key to write to>) or queryPermission('access_local_storage', 'readwrite', <key to read and write>)

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 localStorage 
  
 = 
  
 require 
 ( 
 'localStorage' 
 ); 
 const 
  
 key 
  
 = 
  
 'my_key' 
 ; 
 if 
  
 ( 
 queryPermission 
 ( 
 'access_local_storage' 
 , 
  
 'read' 
 , 
  
 key 
 )) 
  
 { 
  
 const 
  
 value 
  
 = 
  
 localStorage 
 . 
 getItem 
 ( 
 key 
 ); 
 } 
 

access_template_storage

Display name:Accesses template storage

Description:Allows access to temporary storage for templates that can persist for the lifetime of the page.

Configuration:None

Required by: templateStorage

Query signature: queryPermission('access_template_storage')

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 templateStorage 
  
 = 
  
 require 
 ( 
 'templateStorage' 
 ); 
 const 
  
 key 
  
 = 
  
 'my_key' 
 ; 
 if 
  
 ( 
 queryPermission 
 ( 
 'access_template_storage' 
 )) 
  
 { 
  
 const 
  
 value 
  
 = 
  
 templateStorage 
 . 
 getItem 
 ( 
 key 
 ); 
 } 
 

get_cookies

Display name:Reads cookie value(s)

Description:Reads the values of the cookies with the specified name.

Configuration:List of names of cookies permitted for reading.

Required by: getCookieValues

Query signature: queryPermission('get_cookies', <name>)

Notes:Governs whether a cookie can be read, depending on its name.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 getCookieValues 
  
 = 
  
 require 
 ( 
 'getCookieValues' 
 ); 
 const 
  
 cookieName 
  
 = 
  
 'info' 
 ; 
 let 
  
 cookieValues 
 ; 
 if 
  
 ( 
 queryPermission 
 ( 
 'get_cookies' 
 , 
  
 cookieName 
 )) 
  
 { 
  
 cookieValues 
  
 = 
  
 getCookieValues 
 ( 
 cookieName 
 ); 
 } 
 

get_referrer

Display name:Reads referrer URL

Description:Permits read access to narrowed portions of the referrer.

Configuration:The following booleans govern which part of the referrer can be read. A given part of the referrer can only be read if the corresponding part is true . The caller can call getReferrerUrl without a component specified to get the full referrer URL if all these booleans are set to true . If no value is set, the default value is all . If a value is set, the value must be an array of components where a component is one of the following: protocol , host , port , path , query , or extension .

queryKeys : If query is selected, then the template author may further limit the set of query keys they can read from. This is a simple array of keys, with no wildcards.

Required by: getReferrerUrl , getReferrerQueryParameters

Query signature: queryPermission('get_referrer', <url_component>)

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 getReferrerUrl 
  
 = 
  
 require 
 ( 
 'getReferrerUrl' 
 ); 
 let 
  
 referrer 
 ; 
 if 
  
 ( 
 queryPermission 
 ( 
 'get_referrer' 
 , 
  
 'query' 
 )) 
  
 { 
  
 referrer 
  
 = 
  
 getReferrerUrl 
 ( 
 'queryParams' 
 ); 
 } 
 

get_url

Display name:Reads URL

Description:Returns part or all of the URL of the current page.

Configuration:The following booleans govern which part of the URL can be read. A given part of the URL can only be read if the corresponding part is true. The caller can call getUrl without a component specified to get the entire URL if and only if all these booleans are set to true . If no value is set, the default value is all . If a value is set, the value must be an array of components where a component is one of the following: protocol , host , port , path , query , extension , or fragment .

queryKeys : If query is selected, then the template author may further limit the set of query keys they can read from. This is a simple array of keys, with no wildcards.

Required by: getUrl

Query signature: queryPermission('get_url', <optional url component>, <optional query key>)

If supplied, Url component should be one of 'protocol' , 'host' , 'port' , 'path' , 'query' , 'extension' , 'fragment' . If omitted, the permission query is a request for access to the whole URL.

If supplied, query key should be the query string argument that the template code wants to read.

Notes:Controls whether a custom template can read from the current location. Allows limiting to a specific part of the location.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 getUrl 
  
 = 
  
 require 
 ( 
 'getUrl' 
 ); 
 if 
  
 ( 
 queryPermission 
 ( 
 'get_url' 
 , 
  
 'query' 
 , 
  
 'gclid' 
 )) 
  
 { 
  
 const 
  
 gclid 
  
 = 
  
 getUrl 
 ( 
 'query' 
 , 
  
 false 
 , 
  
 null 
 , 
  
 'gclid' 
 ); 
 } 
 

inject_hidden_iframe

Display name:Injects hidden iframes

Description:Injects an invisible iframe with a given URL.

Configuration:List of URL patterns

Required by: injectHiddenIframe

Query signature: queryPermission('inject_hidden_iframe', <url>)

Notes:Governs whether a custom template can inject an invisible iFrame, and from which origin it can do so.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 injectHiddenIframe 
  
 = 
  
 require 
 ( 
 'injectHiddenIframe' 
 ); 
 const 
  
 url 
  
 = 
  
 'https://www.example.com/iframes' 
 ; 
 if 
  
 ( 
 queryPermission 
 ( 
 'inject_hidden_iframe' 
 , 
  
 url 
 )) 
  
 { 
  
 injectHiddenIframe 
 ( 
 url 
 ); 
 } 
 

inject_script

Display name:Injects scripts

Description:Injects a script into the page.

Configuration:List of URL patterns

Required by: injectScript

Query signature: queryPermission('inject_script', <url>)

Notes:Governs whether a custom template can inject JavaScript, and from what origin it can do so.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 injectScript 
  
 = 
  
 require 
 ( 
 'injectScript' 
 ); 
 const 
  
 url 
  
 = 
  
 'https://www.example.com?api.js' 
 ; 
 if 
  
 ( 
 queryPermission 
 ( 
 'inject_script' 
 , 
  
 url 
 )) 
  
 { 
  
 injectScript 
 ( 
 url 
 ); 
 } 
 

logging

Display name:Logs to console

Description:Logs to the developer console and GTM's preview mode.

Configuration:Option to enable logging in production. Defaults to only enable logging in debug/preview. If permission is denied, logToConsole will not throw an error, but will suppress the log message.

Required by: logToConsole

Query signature: queryPermission('logging')

Notes:Controls whether a custom template can log to the developer console.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 logToConsole 
  
 = 
  
 require 
 ( 
 'logToConsole' 
 ); 
 // Note that it's fine to call log, since the log call will be ignored if 
 // logging isn't permitted in the current environment. 
 logToConsole 
 ( 
 'diagnostic info' 
 ); 
 

read_data_layer

Display name:Reads data layer

Description:Reads data from the dataLayer.

Configuration:Set of key match expressions, where a key match can be a leading series of dotted references, with a trailing wildcard. Key match expressions govern which properties may be read from the data layer.

Required by: copyFromDataLayer

Query signature: queryPermission('read_data_layer', <data layer key to read from>)

Notes:Controls whether a custom template can read from the data layer.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 copyFromDataLayer 
  
 = 
  
 require 
 ( 
 'copyFromDataLayer' 
 ); 
 const 
  
 dlKey 
  
 = 
  
 'foo.bar' 
 ; 
 if 
  
 ( 
 queryPermission 
 ( 
 'read_data_layer' 
 , 
  
 dlKey 
 )) 
  
 { 
  
 const 
  
 dlContents 
  
 = 
  
 copyFromDataLayer 
 ( 
 dlKey 
 ); 
 } 
 

read_analytics_storage

Display name:Reads analytics storage

Description:This allows templates to read stored analytics data such as Client IDs.

Configuration:None

Required by: readAnalyticsStorage

Query signature: queryPermission('read_analytics_storage')

Notes:Governs whether a custom template can read from analytics storage.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 readAnalyticsStorage 
  
 = 
  
 require 
 ( 
 'readAnalyticsStorage' 
 ); 
 if 
  
 ( 
 queryPermission 
 ( 
 'read_analytics_storage' 
 )) 
  
 { 
  
 const 
  
 value 
  
 = 
  
 readAnalyticsStorage 
 (); 
 } 
 

read_character_set

Display name:Reads document character set

Description:Reads document.characterSet .

Configuration:None

Required by: readCharacterSet

Query signature: queryPermission('read_character_set')

Notes:Governs whether a custom template can read document.characterSet .

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 readCharacterSet 
  
 = 
  
 require 
 ( 
 'readCharacterSet' 
 ); 
 if 
  
 ( 
 queryPermission 
 ( 
 'read_character_set' 
 )) 
  
 { 
  
 const 
  
 characterSet 
  
 = 
  
 readCharacterSet 
 (); 
 } 
 

read_container_data

Display name:Reads container data

Description:Reads data about the container.

Configuration:None

Required by: getContainerVersion

Query signature: queryPermission('read_container_data')

Notes:Controls whether a custom template can read data about the container.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 getCookieValues 
  
 = 
  
 require 
 ( 
 'getContainerVersion' 
 ); 
 let 
  
 version 
 ; 
 if 
  
 ( 
 queryPermission 
 ( 
 'read_container_data' 
 )) 
  
 { 
  
 version 
  
 = 
  
 getContainerVersion 
 (); 
 } 
 

Display name:Reads event metadata

Description:Reads event metadata in Event Callbacks

Configuration:None

Required by: addEventCallback

Query signature: queryPermission('read_event_metadata')

Notes:Controls whether a custom template can read event metadata in callbacks.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 addEventCallback 
  
 = 
  
 require 
 ( 
 'addEventCallback' 
 ); 
 if 
  
 ( 
 queryPermission 
 ( 
 'read_event_metadata' 
 )) 
  
 { 
  
 addEventCallback 
 (( 
 containerId 
 , 
  
 eventMetadata 
 ) 
  
 = 
>  
 { 
  
 // Read event metadata. 
  
 }); 
 } 
 

read_title

Display name:Reads document title

Description:Reads document.title .

Configuration:None

Required by: readTitle

Query signature: queryPermission('read_title')

Notes:Governs whether a custom template can read the document.title .

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 readTitle 
  
 = 
  
 require 
 ( 
 'readTitle' 
 ); 
 if 
  
 ( 
 queryPermission 
 ( 
 'read_title' 
 )) 
  
 { 
  
 const 
  
 title 
  
 = 
  
 readTitle 
 (); 
 } 
 

send_pixel

Display name:Sends pixels

Description:Sends a GET request to a specified URL. Response is not processed.

Configuration:List of allowed URL patterns.

Required by: sendPixel

Query signature: queryPermission('send_pixel', <url>)

Notes:Governs whether a custom template can send a GET request, and to which origin it can do so.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 sendPixel 
  
 = 
  
 require 
 ( 
 'sendPixel' 
 ); 
 const 
  
 url 
  
 = 
  
 'https://www.example.com?foo=3' 
 ; 
 if 
  
 ( 
 queryPermission 
 ( 
 'send_pixel' 
 , 
  
 url 
 )) 
  
 { 
  
 sendPixel 
 ( 
 url 
 ); 
 } 
 

set_cookies

Display name:Sets a cookie

Description:Sets a cookie with the specified name and parameters.

Configuration:A table of allowed cookie names, each with optional restrictions on name, domain, path, secure attribute, and expiration.

Required by: setCookie

Query signature: queryPermission('set_cookies', <name>, <options>)

Notes:Governs whether a cookie can be written, depending on the cookie name, domain, path, secure attribute, and expiration.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 setCookie 
  
 = 
  
 require 
 ( 
 'setCookie' 
 ); 
 const 
  
 options 
  
 = 
  
 { 
  
 'domain' 
 : 
  
 'www.example.com' 
 , 
  
 'path' 
 : 
  
 '/' 
 , 
  
 'max-age' 
 : 
  
 60 
 * 
 60 
 * 
 24 
 * 
 365 
 , 
  
 'secure' 
 : 
  
 true 
 }; 
 if 
  
 ( 
 queryPermission 
 ( 
 'set_cookies' 
 , 
  
 'info' 
 , 
  
 options 
 )) 
  
 { 
  
 setCookie 
 ( 
 'info' 
 , 
  
 'xyz' 
 , 
  
 options 
 ); 
 } 
 

write_data_layer

Display name:Writes data layer

Description:Writes data to the dataLayer.

Configuration:Set of key match expressions, where a key match can be a leading series of dotted references, with a trailing wildcard. Key match expressions govern which properties may write to the data layer.

Required by: gtagSet

Query signature: queryPermission('write_data_layer', <data layer key to write from>)

Notes:Controls whether a custom template can write to the data layer.

Example code

  const 
  
 queryPermission 
  
 = 
  
 require 
 ( 
 'queryPermission' 
 ); 
 const 
  
 gtagSet 
  
 = 
  
 require 
 ( 
 'gtagSet' 
 ); 
 const 
  
 dlKey 
  
 = 
  
 'foo.bar' 
 ; 
 if 
  
 ( 
 queryPermission 
 ( 
 'write_data_layer' 
 , 
  
 dlKey 
 )) 
  
 { 
  
 gtagSet 
 ({ 
 dlKey 
 : 
  
 'baz' 
 }); 
 } 
 
Design a Mobile Site
View Site in Mobile | Classic
Share by: