Requirement catalog
Appendix A of the paper, with the columns the paper has no room for. Each row is one requirement as graded. Row anchors are the requirement IDs (for example requirements.html#W01).
"Written / graded" is the paper's column: the obligation as the text writes it, then the strength graded. "required" is the text's own word; "list" means the IAB macro list marks the macro Required; "none" a definition or attribute with no modal verb; "imper." an instruction with no modal verb; "n/a" a robustness observation, which is not a VAST clause; "obs." a requirement graded as an observation. (a) marks a graded strength that differs from the literal word (Section 4.2 of the paper). The obligation text is the sentence located in the VAST 4.3 text or the macro list; Online Resource 5, Table R5.1 gives its line numbers. "Deviating cells" counts deviating verdicts over the 13 reference configurations (5 in the Node.js layer, 8 in Chromium 141); the results grid shows each one.
Table A1. Requirement catalog: requirement as graded, VAST 4.3 basis, strength as written and as graded, with obligation text, script, vector, deviating cells and findings.
| W01 | Wrapper resolution | Follows a Wrapper to its InLine ad. | §2.2; §2.3.5 | must / must | must | "VAST-compliant media players and SSAI systems must be able to play the ad in a VAST response" / "including those of any subsequent ad servers called in a chain of VAST Wrapper responses" | load | w_one | all | 1 | F64 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| W02 | Wrapper resolution | Follows a lone Wrapper that carries sequence="1" (a one-ad pod) to its InLine ad, or declines it with an error (pod support is optional). | §2.2; The Ad Element (sequence); Ad Pods | must / must | must | "must be able to play the ad in a VAST response" / "Required (Ad Pod support is optional)" | load | w_one_seq | all | 3 | F46, F64 |
| W03 | Wrapper resolution | Accepts a chain of five Wrappers before the InLine ad (players are required to accept five). | §3.19.1 | required / must | must | "In VAST 4 the player is only required to accept five wrappers ads." | load | w_five | all | 4 | F12, F55, F79 |
| W04 | Error reporting | With six Wrappers the player may reject; if it does, it determines 302 (and, with a tracker, reports it to the Error URI of every Wrapper it received). | §2.3.5.1; §3.19.1 | should / should | should | "the player may reject any subsequent responses in the chain" / "Error codes should be sent for all wrappers in the chain where provided." | load | w_six | all | 0 | - |
| W05 | Wrapper resolution | Terminates a Wrapper that points to itself (stops requesting it). | §2.3.5.1 | none / should (a) | should | "an infinite loop is possible where a chain of Wrappers never results in a final InLine VAST response" / "the player may reject any subsequent responses in the chain" | load | w_loop | all | 0 | - |
| W06 | Error reporting | Reports 302 (Wrapper limit) for a self-referencing Wrapper loop. | §2.3.5.1; Error Reporting table (302) | should / should | should | "Error codes should be sent for all wrappers in the chain where provided." / "Wrapper limit reached, as defined by the media player." | load | w_loop | all | 0 | - |
| W07 | Error reporting | When the VASTAdTagURI is unavailable (HTTP 404), determines error 301. | Error Reporting (Media Player Details; table 301) | must / must | must | "If an error occurs while trying to load an Ad and the <Error> element is provided, the media" / "Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "URI was either unavailable or reached a timeout" | load | w_http404 | all | 2 | F35 |
| W08 | Error reporting | When the VASTAdTagURI times out, determines error 301. | Error Reporting (table 301) | must / must | must | "Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Timeout of VAST URI provided in Wrapper element" | load | w_timeout | all | 0 | - |
| W09 | Error reporting | When a Wrapper leads to a no-ad response and the player determines a code, the code is 303. | Error Reporting (No Ad Response); Error (VAST) | should / should | should | "If an [ERRORCODE] macro is included, the media player should substitute with error code 303." | load | w_noad | all | 0 | - |
| W10 | Error reporting | Requests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]). | §3.2.1 Error (VAST); Error Reporting (No Ad Response) | must / must | must | "the media player must send a request to the URI provided when the VAST response returns an empty InLine response after a chain of one or more wrappers" | load | w_noad | all | 0 | - |
| W11 | Error reporting | When the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it). | Error Reporting (table 100); §2.3.2 (well-formed XML) | must / must | must | "Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "XML parsing error." / "every attempt should be made to provide an error code that maps to the error that occurred" | load | w_malformed | all | 8 | F05, F44, F49, F56, F86 |
| W12 | Error reporting | Requests the Wrapper Error URI when its VASTAdTagURI fails. | Error Reporting (Media Player Details) | must / must | must | "Request the error source file using the URI provided." / "the media player must also return error details as listed above for each Wrapper response" | load | w_http404 | all | 0 | - |
| W13 | Error reporting | An InLine error after a chain of Wrappers is reported to the InLine and to every Wrapper Error URI, with the same code (403 here). | Error Reporting (Media Player Details); §3.4.11 | must / must | must | "the media player must also return error details as listed above for each Wrapper response" / "will produce an error for each of the Wrappers used to serve the Inline Ad" | full | w_two_wrappers_inline_error | all | 0 | - |
| W14 | Impressions and tracking | At impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it. | §3.4.4; §2.3.4 | required / must | must | "the media player is required to request all impressions at the same time or as close as possible to the same time" / "should be triggered at the same time when the impression for the ad occurs" | full | w_one | all | 0 | - |
| W15 | Impressions and tracking | Fires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones. | §3.19 (tracking elements in Wrappers) | required / must | must | "The media player is required to request the resource file for any included tracking elements" / "the Wrapper may contain tracking elements that provide tracking for the InLine ad" | full | t_wrapper_events | all | 0 | - |
| W16 | Impressions and tracking | When both the InLine and a Wrapper carry a ClickThrough, the InLine one is used. | §2.3.5.2 | must / must | must | "if the inLine response includes a ClickThrough element then this must be favored over ClickThrough element(s) specified in calling Wrappers" | click | w_click_inline_wins | all | 0 | - |
| W17 | Impressions and tracking | When the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used. | §2.3.5.2 | must / must | must | "then the ClickThrough element closest to the InLine response must be favored" | click | w_click_wrapper_fallback | all | 3 | F36, F80 |
| W18 | Impressions and tracking | On a click, requests the ClickTracking URIs of the InLine and of every Wrapper. | §3.10.2 ClickTracking; §3.19 | required / must | must | "The media player is required to request the resource file for any included tracking elements" | click | w_click_tracking | all | 0 | - |
| W19 | Wrapper resolution | With followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed. | §3.19 followAdditionalWrappers | should / should | should | "If false, any Wrappers received (i.e. not an Inline VAST response) should be ignored." | load | w_follow_false | all | 5 | F48, F58 |
| W20 | Wrapper resolution | With allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped). | §3.19 (allowMultipleAds) | none / should (a) | should | "If false, only the first stand-alone Ad (with no sequence values) in the requested VAST response is allowed." | load | w_allow_multiple_false | all | 6 | F13, F42, F58, F81 |
| W21 | Wrapper resolution | Without the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used. | §3.19 (allowMultipleAds default false) | none / should (a) | should | "Default value is “false.”" | load | w_allow_multiple_default | all | 6 | F13, F42, F58, F81 |
| W22 | Wrapper resolution | Optional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205. | §3.19.2 BlockedAdCategories | may / may | may | "can also be used by the player to reject InLine ads" / "the client must notify the ad server using the <Error> URI, if provided (error code 205)" | load | w_blocked_category | all | 0 | - |
| W23 | Wrapper resolution | With fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used. | §3.19 (fallbackOnNoAd) | should / should | should | "If true, the media player should select from any stand-alone ads available." | load | w_fallback_noad | all | 4 | F14, F59, F82 |
| E01 | Error reporting | For a no-ad response, requests the VAST-level Error URI. | §3.2.1 Error (VAST) | must / must | must | "the media player must use the URI provided to notify the server that no ad was returned" | load | e_noad_root | all | 1 | F66 |
| E02 | Error reporting | Requests every VAST-level Error URI when several are given. | §3.2.1 Error (VAST), bounded 0+ | must / must | must | "the media player must use the URI provided" / "Multiple <Error> elements may be provided to notify multiple parties" | load | e_noad_root | all | 1 | F66 |
| E03 | Error reporting | With no supported MediaFile, requests every InLine Error URI with 403. | §3.4.11; Error Reporting (table 403) | must / must | must | "Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Couldn’t find MediaFile that is supported by this media player" | full | e_inline_unplayable | all | 3 | F30, F67 |
| E04 | Error reporting | Replaces [ERRORCODE] in Error URIs with a numeric code. | Error Reporting (Media Player Details); macro list ERRORCODE | must / must | must | "Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "the media player must populate the macro with an error code" | load | w_http404 | all | 0 | - |
| E05 | Error reporting | When the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found). | Error Reporting (table 401) | must / must | must | "Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "File not found. Unable to find Linear/MediaFile from URI." | full | e_media_404 | browser only | 2 | F29, F67 |
| E06 | Error reporting | When a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405. | Error Reporting (table 405) | must / must | must | "Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Media player found a MediaFile with supported type but couldn’t display it." | full | e_media_corrupt | browser only | 4 | F19, F29, F67 |
| E07 | Error reporting | When the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout). | Error Reporting (table 402) | must / must | must | "Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Timeout of MediaFile URI." | full | e_media_timeout | browser only | 1 | F68 |
| E08 | Error reporting | Does not request the Error URI when the ad plays without a problem. | §3.4.11 (Error is for ads that cannot be served) | none / should (a) | should | "The <Error> element enables the media player to provide feedback to ad servers when an Ad cannot be served." / "This error-tracking resource is called when the media player is unable to display the Ad." | full | t_inline_full | all | 0 | - |
| E09 | Error reporting | Given a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity). | §2.3.1; Error Reporting (table 200, 201) | must / must | must | "Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Media player received an Ad type that it was not expecting and/or cannot play." / "it can decline from loading the ad resources and use the error URI" | full | e_nonlinear_only | all | 2 | F30 |
| T01 | Impressions and tracking | Requests every Impression URI of the ad. | §2.3.4; §3.4.4 | required / must | must | "The media player is required to request the resource file for any included tracking elements" / "the media player must use to notify the ad server when the impression occurs" | full | t_inline_full | all | 0 | - |
| T02 | Impressions and tracking | Does not dispatch an Impression whose URI is about:blank. | §3.4.4 (about:blank) | should / should | should | "The player should disregard dispatching the tracking URI if it is set to "about:blank"" | full | t_inline_full | all | 4 | F22, F43 |
| T03 | Impressions and tracking | Fires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order. | §3.14.1 (Linear metrics) | required / must | must | "the media player is required to trigger the tracking resource URI provided in the nested <Tracking> element" / "firstQuartile: The creative played continuously for at least 25%" | full | t_inline_full | all | 0 | - |
| T04 | Impressions and tracking | Fires every Tracking element for the same event (two start trackers for two parties). | §3.14.3 (multiple Tracking elements per event) | required / must | must | "the media player is required to trigger the tracking resource URI" / "may also be used to track events of the same type for multiple parties" | full | t_inline_full | all | 0 | - |
| T05 | Impressions and tracking | Fires a progress tracker with an HH:MM:SS offset. | §3.14.1 (progress, HH:MM:SS offset) | required / must | must | "the media player is required to trigger the tracking resource URI" / "Values can be time in the format HH:MM:SS or HH:MM:SS.mmm or a percentage value in the format n%." | full | t_inline_full | all | 2 | F23, F60, F70 |
| T06 | Impressions and tracking | Fires a progress tracker with an HH:MM:SS.mmm offset. | §3.14.1 (progress, HH:MM:SS.mmm offset) | required / must | must | "the media player is required to trigger the tracking resource URI" / "Values can be time in the format HH:MM:SS or HH:MM:SS.mmm" | full | t_inline_full | all | 2 | F23, F60, F70 |
| T07 | Impressions and tracking | Fires progress trackers with percentage offsets (10% and 80%). | §3.14.1 (progress, n% offset) | required / must | must | "the media player is required to trigger the tracking resource URI" / "or a percentage value in the format n%" / "If the duration is not known when the offset is set to a percentage value, the progress event may be ignored." | full | t_inline_full | all | 4 | F23, F34, F60, F70 |
| T08 | Impressions and tracking | Stopping at 60% fires midpoint but neither thirdQuartile nor complete. | §3.14.1 (thirdQuartile, complete definitions) | required / must | must | "the media player is required to trigger the tracking resource URI" / "thirdQuartile: The creative played continuously for at least 75% of the duration at normal speed." | partial | t_inline_full | all | 0 | - |
| T09 | Robustness observations | Spread between the first and last Impression request at impression time (ms, measured at the server). | §2.3.4; §3.4.4 (same time) | required / obs. (a) | observation | "the media player is required to request all impressions at the same time or as close as possible to the same time" | full | w_one | all | 0 | - |
| T10 | Impressions and tracking | Does not request the Impression of an ad whose media never plays (no supported MediaFile). | §2.3.4 (IAB Digital Video Measurement Guidelines); §3.4.4 | none / should (a) | should | "compliance with the IAB Digital Video Measurement Guidelines" / "when the impression occurs" | full | e_inline_unplayable | all | 1 | F69 |
| T11 | Impressions and tracking | Requests the Impression exactly once across pause, resume, mute and unmute. | §3.4.4 (notify when the impression occurs); §2.3.4 | none / should (a) | should | "the media player must use to notify the ad server when the impression occurs" | user actions | t_interact | all | 0 | - |
| T12 | Impressions and tracking | Fires the pause tracker once when the user pauses. | §3.14.1 (pause) | required / must | must | "the media player is required to trigger the tracking resource URI" / "pause: the user clicked the pause control and stopped the creative." | user actions | t_interact | all | 0 | - |
| T13 | Impressions and tracking | Fires the resume tracker once when the user resumes. | §3.14.1 (resume) | required / must | must | "the media player is required to trigger the tracking resource URI" / "resume: the user activated the resume control after the creative had been stopped or paused." | user actions | t_interact | all | 2 | F20 |
| T14 | Impressions and tracking | Fires the mute tracker once when the user mutes. | §3.14.1 (mute) | required / must | must | "the media player is required to trigger the tracking resource URI" / "mute: the user activated the mute control and muted the creative." | user actions | t_interact | all | 0 | - |
| T15 | Impressions and tracking | Fires the unmute tracker when the user unmutes. | §3.14.1 (unmute) | required / must | must | "the media player is required to trigger the tracking resource URI" / "unmute: the user activated the mute control and unmuted the creative." | user actions | t_interact | all | 0 | - |
| T16 | Impressions and tracking | Skipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type). | §2.3.1 (Skippable Linear); §3.8 skipoffset; §3.14.1 (skip) | required / must | must | "the media player is required to trigger the tracking resource URI" / "skip: the user activated a skip control to skip the creative." | skip | t_skip | all | 0 | - |
| T17 | Impressions and tracking | The skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03). | §3.8 (skipoffset: when skip controls are made available) | none / should (a) | should | "Time value that identifies when skip controls are made available to the end user" | skip | t_skip | all | 0 | - |
| T18 | Impressions and tracking | A percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip. | §3.8 skipoffset; VAST 4.2 XSD (skipoffset pattern allows n%) | none / should (a) | should | "Time value that identifies when skip controls are made available to the end user" | skip | t_skip_pct | all | 3 | F40, F71 |
| T19 | Impressions and tracking | Progress offsets passed before the skip (2 s and 5 s) are fired. | §3.14.3 (progress counts a view even if the ad is skipped) | none / should (a) | should | "When skippable ads are supported, the progress event is used to identify when the ad counts as a view even if the ad is skipped." | skip | t_skip | all | 0 | - |
| T20 | Impressions and tracking | Fires the loaded tracker once when the media is ready to play. | §3.14.1 (loaded) | should / should | should | "This event should be used to indicate when the player considers that it has loaded" | user actions | t_interact | all | 4 | F41, F60, F70 |
| T21 | Impressions and tracking | Fires the rewind tracker when the user seeks back 2 s (from 60% to 40%). | §3.14.1 (rewind) | required / must | must | "the media player is required to trigger the tracking resource URI" / "rewind: the user activated the rewind control" | rewind | t_rewind | all | 4 | F24, F60, F70 |
| T22 | Impressions and tracking | After rewinding from 6 s to 4 s, midpoint and the 5 s progress tracker are not fired a second time when playback passes them again. | §3.14.1 (quartiles: played continuously) | none / should (a) | should | "midpoint: The creative played continuously for at least 50% of the total duration at normal speed." | rewind | t_rewind | all | 0 | - |
| T23 | Impressions and tracking | A volume change that is not an unmute (0.5 while unmuted) does not fire unmute. | §3.14.1 (unmute: the user unmuted) | none / should (a) | should | "unmute: the user activated the mute control and unmuted the creative." | user actions | t_interact | all | 3 | F21, F72 |
| M01 | Macros | Replaces [CACHEBUSTING] with a random 8-digit integer. | IAB macro list: CACHEBUSTING (required) | list / must (a) | must | "Required" / "Random 8-digit integer." | full | m_macros | all | 5 | F15, F37, F65 |
| M02 | Macros | Replaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05). | IAB macro list: TIMESTAMP (required) | list / must (a) | must | "Required" / "formatting conventions of ISO 8601" | full | m_macros | all | 1 | F65 |
| M03 | Macros | Replaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail). | IAB macro list: LIMITADTRACKING (required) | list / must (a) | must | "Required" / "with “1” indicating that a user has opted for limited ad tracking" | full | m_macros | all | 6 | F16, F38, F61, F65 |
| M04 | Macros | Percent-encodes macro values (the colons in TIMESTAMP). | §6.1 (encodeURIComponent on values) | must / must | must | "make sure to apply encodeURIComponent to any value" / "the encoded version must always be used as a macro substitution" | full | m_macros | all | 0 | - |
| M05 | Macros | Does not write -1 into a macro it does not know ([NOTAREALMACRO]). | §6.1 (do not replace unknown macros with -1) | imper. / should (a) | should | "do not replace all unknown macros with -1, only do this for macros specifically mentioned in this section" | full | m_macros | all | 0 | - |
| M06 | Macros | Replaces each of eight listed optional macros ([ADPLAYHEAD], [ADSERVINGID], [UNIVERSALADID], [PODSEQUENCE], [ASSETURI], [BREAKPOSITION], [IFA], [CLIENTUA]) with a plausible value or -1/-2; none left as macro or empty. | §6.1 (unprovided optional macros must become -1 or -2) | must / must | must | "the following special values must be inserted into the macro to indicate the reason for not providing the information" | full | m_optional_noflv | all | 6 | F16, F38, F61, F65 |
| M07 | Macros | Fills [ADSERVINGID] with the ad's AdServingId (in-serving). | §3.4.3 (player fills [ADSERVINGID] from AdServingId) | none / should (a) | should | "The player is responsible for parsing this value and using it to fill the associated macro (see section 6) on tracking pixels." | full | m_optional_noflv | all | 4 | F38, F61, F65 |
| M08 | Macros | When it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s. | IAB macro list: ADPLAYHEAD (HH:MM:SS.mmm) | none / should (a) | should | "Optional" / "{HH:MM:SS.mmm}" | full | m_optional_noflv | all | 0 | - |
| M09 | Macros | Fills [UNIVERSALADID] with one or more of the Creative's IDs as "registry value" pairs, each percent-encoded; several IDs are joined by a raw comma. | §6.1 (Array values: encode each value, commas unencoded); IAB macro list: UNIVERSALADID | should / should | should | "the value should be rendered as a set of values separated by a comma" / "encoding should be applied to individual values only" | full | m_optional_noflv | all | 4 | F09, F18 |
| M10 | Macros | When it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first). | IAB macro list: ASSETURI (the media file being played) | none / should (a) | should | "Optional" / "The URI of the ad asset currently being played." | full | m_optional | all | 2 | F08 |
| M11 | Macros | Replaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI. | IAB macro list: CACHEBUSTING, TIMESTAMP (contexts: all tracking pixels, including Error) | list / must (a) | must | "All tracking pixels" / "All tracking pixels" / "both for VAST URLs and tracking pixel URLs, this would be the video player" | full | m_error_context | all | 3 | F17, F65 |
| M12 | Macros | Replaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it. | IAB macro list: CACHEBUSTING, TIMESTAMP (contexts: VAST request URIs) | list / must (a) | must | "VAST request URIs" / "VAST request URIs" / "The responsibility to properly replace macros with their proper values lies with the party that will perform the HTTP request." / "both for VAST URLs and tracking pixel URLs, this would be the video player" / "the VAST macro concept will be expanded to apply not just to tracking URIs, but to AdTagURIs in Wrapper creatives" | load | m_request_context | all | 11 | F01, F39, F50, F62 |
| X01 | XML and parsing | Trims the whitespace around a CDATA-wrapped Impression URI before handing it to the network (checked on the client side, since URL parsers also strip it). | §2.3.3 (whitespace around a CDATA-wrapped URI) | none / should (a) | should | "<![CDATA[http://ad.server.com/impression/dot.gif]]>" / "Correct and backwards compatible." | full | x_whitespace | all | 0 | - |
| X02 | XML and parsing | Ignores XML comments inside an element when reading its URI. | §2.2 (XML comments) | must / must | must | "must be able to play the ad in a VAST response" / "acknowledge VAST comments in the standard XML syntax" | full | x_comment | all | 1 | F56 |
| X03 | XML and parsing | Decodes character entities (&) in a URI given as plain text (a document that breaks §2.3.3's CDATA rule, which real tags still do). | §2.3.2 (character entities should be honored) | should / should | should | "standard XML requirements such as character entities and <!--XML comments--> should be honored" | full | x_entities | all | 0 | - |
| X04 | Robustness observations | Parses a document that omits xmlns="http://www.iab.com/VAST". | (robustness; a 4.x document without the VAST namespace is not schema-valid) | n/a / obs. | observation | (no VAST clause) | load | x_no_namespace | all | 0 | - |
| X05 | XML and parsing | Accepts a Creative with two UniversalAdId elements. | §2.2; §3.7.1 (UniversalAdId 1+; 4.2 XSD unbounded) | must / must | must | "must be able to play the ad in a VAST response" / "A required element for the purpose of tracking ad creative" | load | x_multi_uaid | all | 4 | F47 |
| X06 | XML and parsing | Accepts two ClosedCaptionFile elements. | §2.2 (play the ad in a VAST response); §3.9.5 (ClosedCaptionFile 0+) | must / must | must | "must be able to play the ad in a VAST response" | load | x_multi_cc | all | 4 | F47 |
| X07 | Robustness observations | Follows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace). | §2.3.3; §3.19.1 VASTAdTagURI | n/a / obs. | observation | (no VAST clause) | load | x_adtaguri_ws | all | 0 | - |
| X08 | XML and parsing | Never requests a Tracking element whose event name is not a VAST event (notARealEvent). | §3.14.3 (event values are an enumeration) | none / should (a) | should | "A string that defines the event being tracked. Accepted values are listed in section" | full | x_unknown_event | all | 0 | - |
| X09 | XML and parsing | Does not request Impression or Tracking URIs that appear inside an Extension. | §3.18 Extensions (custom XML for the publisher, not VAST elements) | should / should | should | "custom XML should fall under the nested <Extension> (singular) element so that custom XML can be separated from VAST elements" | full | x_extension_impression | all | 1 | F56 |
| X10 | XML and parsing | Parses a document that starts with a UTF-8 byte order mark. | §2.2; §2.3.2 (XML 1.0: a UTF-8 byte order mark is allowed) | must / must | must | "must be able to play the ad in a VAST response" / "compliant with XML 1.0" | load | x_bom | all | 0 | - |
| X11 | XML and parsing | Reassembles an Impression URI split across two CDATA sections (query s=x]]>x). | §2.3.3 (a URI containing "]]>" split across CDATA sections) | required / must | must | "The media player is required to request the resource file for any included tracking elements from the URI provided" / "will be concatenated with the other two URI components" | full | x_cdata_split | all | 2 | F33 |
| X12 | XML and parsing | Accepts a UniversalAdId that still carries the VAST 4.0 idValue attribute. | §3.7.1 (VAST 4.0 idValue attribute: players should not fail) | should / should | should | "Media players should not fail if this attribute is present" | load | x_uaid_idvalue | all | 0 | - |
| X13 | XML and parsing | An empty Impression element does not stop the other Impression from being requested. | §3.4.4 (Impression) | required / must | must | "The media player is required to request the resource file for any included tracking elements" | full | x_empty_impression | all | 0 | - |
| X14 | XML and parsing | Accepts a VAST 3.0 InLine document. | §4.3 Media Players (accept older VAST versions) | should / should | should | "VAST 4 players should continue to accept ads on older versions of VAST" | load | v_30 | all | 0 | - |
| X15 | XML and parsing | Accepts a VAST 2.0 InLine document. | §4.3 Media Players (accept older VAST versions) | should / should | should | "VAST 4 players should continue to accept ads on older versions of VAST" | load | v_20 | all | 0 | - |
| X16 | XML and parsing | Follows a VAST 3.0 Wrapper to a VAST 4.3 InLine. | §4.3 Media Players (accept older VAST versions) | should / should | should | "VAST 4 players should continue to accept ads on older versions of VAST" | load | v_mixed_chain | all | 0 | - |
| X17 | XML and parsing | Does not request an Impression element that sits entirely inside an XML comment (next to a real Impression). | §2.2 (acknowledge XML comments); §2.3.2 | must / must | must | "must be able to play the ad in a VAST response" / "acknowledge VAST comments in the standard XML syntax" | full | x_comment_impression | all | 1 | F56 |
| X18 | XML and parsing | Requests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3). | §2.3.2 (character entities should be honored); §3.19.1 VASTAdTagURI | should / should | should | "character entities and <!--XML comments--> should be honored" | load | x_adtaguri_amp | all | 1 | F57 |
| X19 | XML and parsing | Requests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3). | §2.3.2 (character entities should be honored); §3.19.1 VASTAdTagURI | should / should | should | "character entities and <!--XML comments--> should be honored" | load | x_adtaguri_ncr | all | 1 | F57 |
| P01 | Ad pods | Orders pod ads by their sequence attribute (document order is 3, 1, 2): the ad with sequence 1 comes first (or the pod is declined with an error; pod support is optional). | Ad Pods and Stand-Alone Ads | must / must | must | "the media player must play the ads in the Pod in the prescribed sequence" / "sequenced ads are played in numerical order" | load | p_pod_order | all | 3 | F27, F75 |
| P02 | Ad pods | When the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad). | Ad Pods (an ad fails: move on) | should / should | should | "If stand-alone ads are unavailable, the player should move on to the next ad in the Ad Pod." | pod | p_pod_fail | browser only | 0 | - |
| P03 | Ad pods | Playing a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's. | §2.3.4 (fire each tracker at the appropriate time); Ad Pods | required / must | must | "required to request the resource file for any included tracking elements from the URI provided at the appropriate times" / "the same impression and tracking URIs in the VAST <Wrapper> are called as each ad in the Pod is played" | pod | p_pod_play | all | 1 | F74 |
| P05 | Ad pods | The failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third. | Ad Pods (substitute an un-played stand-alone ad) | should / should | should | "the media player should substitute an un-played stand-alone ad from the response" | pod | p_pod_fail | browser only | 3 | F14, F76 |
| P06 | Ad pods | Plays all three ads of a pod. | Ad Pods (play the pod in sequence; play as many ads as possible) | should / should | should | "all ads in the Pod should be played to the best of the player's ability" / "should play as many of the ads as possible" / "all ads in the Pod must be played to the best of the player's ability" | pod | p_pod_play | all | 2 | F28 |
| P07 | Ad pods | Orders the pod ads of a Wrapper's target by their sequence attribute (document order 3, 1, 2; the Wrapper sets allowMultipleAds="true"): the ad with sequence 1 comes first (or the pod is declined with an error; pod support is optional). | Ad Pods and Stand-Alone Ads (play the pod in the prescribed sequence); §3.19 | must / must | must | "the media player must play the ads in the Pod in the prescribed sequence" | load | p_pod_wrapper | all | 10 | F02, F27, F46 |
| A01 | Verification and icons | When it does not execute the InLine's verification resource (a JavaScript resource with an apiFramework it does not implement), requests its verificationNotExecuted URI. | §3.17; §3.17.4 verificationNotExecuted | must / must | must | "The player must request each associated verificationNotExecuted tracking event URI" / "any appropriate tracking events listed under the <Verification> element must be fired" | full | a_verification_inline | all | 4 | F26, F32, F78 |
| A02 | Verification and icons | Fills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3). | §3.17.4 [REASON]; IAB macro list: REASON (required) | must / must | must | "with the [REASON] macro filled with reason code 1" / "Required" / "The following macros should be supported specifically in URIs for this event type" | full | a_verification_inline | all | 0 | - |
| A03 | Verification and icons | Handles the Wrapper's verification too: requests its verificationNotExecuted URI. | Viewability with Ad Verification Services (resources from intermediary Wrappers) | should / should | should | "All verification resources listed in the VAST should be executed, including those from any intermediary <Wrapper> VASTs" | full | a_verification_js | all | 4 | F26, F32, F83 |
| A04 | Verification and icons | Reports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported). | §3.17.4 (reason code 2); §3.17.1; Viewability with Ad Verification Services | must / must | must | "the player must trigger any provided verificationNotExecuted tracking events with reason code 2" | full | a_verification_inline | all | 0 | - |
| A05 | Verification and icons | When an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load). | §3.17.4 (reason code 3: 404 or other failed response codes); Viewability with Ad Verification Services | must / must | must | "any included verificationNotExecuted tracking events URIs must be sent with the appropriate reason code" / "404 or other failed response codes" | full | a_verification_404 | all | 1 | F84 |
| I01 | Verification and icons | Displays the Icon after the ad starts and requests its IconViewTracking URI. | Industry Icon Support; §3.11.2 IconViewTracking | must / must | must | "the media player must display the object as an overlay on top of the Linear Ad with which the icon is served and after the ad has started" / "The player uses the included URI to notify the icon server when the icon has been displayed." | icon | i_icon | browser only | 2 | F77, F85 |
| I02 | Verification and icons | On a click on the Icon, requests its IconClickTracking URI. | §3.11.5 IconClickTracking | required / must | must | "The media player is required to request the resource file for any included tracking elements" / "is used to track click activity within the icon" | icon | i_icon | browser only | 0 | - |
| I03 | Verification and icons | Displays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI. | §3.11.1 Icon (offset, duration) | should / should | should | "The time of delay from when the associated linear creative begins playing to when the icon should be displayed" / "The duration the icon should be displayed unless clicked or ad is finished playing" | icon | i_icon_timed | browser only | 4 | F25, F31, F77 |
| S01 | Media selection | Skips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one. | MediaFiles (choose by attributes, not document order) | should / should | should | "the publisher should decide which file to play based on attributes of the MediaFile nodes and not the structure of the document" | full | s_flv_first | all | 1 | F73 |
| S02 | Media selection | Optional: plays an audio ad (adType="audio", Opus WebM and AAC files). | §1.4; §3.4 (adType="audio") | may / may | may | "organizations may be compliant with VAST while only supporting a selected subset of the ad types" / "all ad types are relevant for “audio only” ads except NonLinear ads" | full | s_audio | browser only | 0 | - |
| R01 | Robustness observations | A timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node.js process). | (engineering; not a VAST clause) | n/a / obs. | observation | (no VAST clause) | load | w_timeout | all | 4 | F03 |
| R02 | Robustness observations | A failed Wrapper request does not escape as an uncaught exception. | (engineering; not a VAST clause) | n/a / obs. | observation | (no VAST clause) | load | w_http404 | all | 0 | - |
| R03 | Robustness observations | Follows an HTTP 302 redirect on a VASTAdTagURI. | (HTTP; not a VAST clause) | n/a / obs. | observation | (no VAST clause) | load | r_redirect | all | 0 | - |
| R04 | Robustness observations | Parses a VAST response sent with Content-Encoding: gzip. | (HTTP; not a VAST clause) | n/a / obs. | observation | (no VAST clause) | load | r_gzip_root | all | 0 | - |
| R05 | Robustness observations | Parses a VAST response served as text/plain rather than an XML media type. | (HTTP; not a VAST clause) | n/a / obs. | observation | (no VAST clause) | load | r_text_plain_root | all | 0 | - |
| R06 | Robustness observations | A tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete). | (HTTP; not a VAST clause) | n/a / obs. | observation | (no VAST clause) | full | r_pixel_500 | all | 0 | - |
Table T3. Load and playback scripts (Table 3 of the paper).
| load | resolves the tag; no playback |
|---|---|
| full | plays the ad to the end |
| partial | plays to 60 percent and stops the ad |
| click | clicks the ad at 30 percent |
| user actions | pauses, resumes, mutes, unmutes and changes the volume while playing |
| skip | probes for the skip control at 1.5 s and skips at 6 s |
| rewind | seeks back 2 s, from 6 s to 4 s |
| icon | clicks a displayed icon |
| pod | plays every ad of a pod |