Online ResourcesPrashant Chaudhary

Do Open-Source Video Ad Clients Follow VAST 4.3? An Empirical Study of Player Conformance

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.

showing 108 of 108CSV
W01Wrapper resolutionFollows a Wrapper to its InLine ad.§2.2; §2.3.5must / mustmust"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"loadw_oneall1F64
W02Wrapper resolutionFollows 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 Podsmust / mustmust"must be able to play the ad in a VAST response" / "Required (Ad Pod support is optional)"loadw_one_seqall3F46, F64
W03Wrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).§3.19.1required / mustmust"In VAST 4 the player is only required to accept five wrappers ads."loadw_fiveall4F12, F55, F79
W04Error reportingWith 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.1should / shouldshould"the player may reject any subsequent responses in the chain" / "Error codes should be sent for all wrappers in the chain where provided."loadw_sixall0-
W05Wrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).§2.3.5.1none / 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"loadw_loopall0-
W06Error reportingReports 302 (Wrapper limit) for a self-referencing Wrapper loop.§2.3.5.1; Error Reporting table (302)should / shouldshould"Error codes should be sent for all wrappers in the chain where provided." / "Wrapper limit reached, as defined by the media player."loadw_loopall0-
W07Error reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.Error Reporting (Media Player Details; table 301)must / mustmust"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"loadw_http404all2F35
W08Error reportingWhen the VASTAdTagURI times out, determines error 301.Error Reporting (table 301)must / mustmust"Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Timeout of VAST URI provided in Wrapper element"loadw_timeoutall0-
W09Error reportingWhen 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 / shouldshould"If an [ERRORCODE] macro is included, the media player should substitute with error code 303."loadw_noadall0-
W10Error reportingRequests 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 / mustmust"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"loadw_noadall0-
W11Error reportingWhen 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 / mustmust"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"loadw_malformedall8F05, F44, F49, F56, F86
W12Error reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.Error Reporting (Media Player Details)must / mustmust"Request the error source file using the URI provided." / "the media player must also return error details as listed above for each Wrapper response"loadw_http404all0-
W13Error reportingAn 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.11must / mustmust"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"fullw_two_wrappers_inline_errorall0-
W14Impressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.§3.4.4; §2.3.4required / mustmust"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"fullw_oneall0-
W15Impressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.§3.19 (tracking elements in Wrappers)required / mustmust"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"fullt_wrapper_eventsall0-
W16Impressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.§2.3.5.2must / mustmust"if the inLine response includes a ClickThrough element then this must be favored over ClickThrough element(s) specified in calling Wrappers"clickw_click_inline_winsall0-
W17Impressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.§2.3.5.2must / mustmust"then the ClickThrough element closest to the InLine response must be favored"clickw_click_wrapper_fallbackall3F36, F80
W18Impressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.§3.10.2 ClickTracking; §3.19required / mustmust"The media player is required to request the resource file for any included tracking elements"clickw_click_trackingall0-
W19Wrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.§3.19 followAdditionalWrappersshould / shouldshould"If false, any Wrappers received (i.e. not an Inline VAST response) should be ignored."loadw_follow_falseall5F48, F58
W20Wrapper resolutionWith 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."loadw_allow_multiple_falseall6F13, F42, F58, F81
W21Wrapper resolutionWithout 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.”"loadw_allow_multiple_defaultall6F13, F42, F58, F81
W22Wrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.§3.19.2 BlockedAdCategoriesmay / maymay"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)"loadw_blocked_categoryall0-
W23Wrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.§3.19 (fallbackOnNoAd)should / shouldshould"If true, the media player should select from any stand-alone ads available."loadw_fallback_noadall4F14, F59, F82
E01Error reportingFor a no-ad response, requests the VAST-level Error URI.§3.2.1 Error (VAST)must / mustmust"the media player must use the URI provided to notify the server that no ad was returned"loade_noad_rootall1F66
E02Error reportingRequests every VAST-level Error URI when several are given.§3.2.1 Error (VAST), bounded 0+must / mustmust"the media player must use the URI provided" / "Multiple <Error> elements may be provided to notify multiple parties"loade_noad_rootall1F66
E03Error reportingWith no supported MediaFile, requests every InLine Error URI with 403.§3.4.11; Error Reporting (table 403)must / mustmust"Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Couldn’t find MediaFile that is supported by this media player"fulle_inline_unplayableall3F30, F67
E04Error reportingReplaces [ERRORCODE] in Error URIs with a numeric code.Error Reporting (Media Player Details); macro list ERRORCODEmust / mustmust"Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "the media player must populate the macro with an error code"loadw_http404all0-
E05Error reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).Error Reporting (table 401)must / mustmust"Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "File not found. Unable to find Linear/MediaFile from URI."fulle_media_404browser only2F29, F67
E06Error reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.Error Reporting (table 405)must / mustmust"Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Media player found a MediaFile with supported type but couldn’t display it."fulle_media_corruptbrowser only4F19, F29, F67
E07Error reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).Error Reporting (table 402)must / mustmust"Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Timeout of MediaFile URI."fulle_media_timeoutbrowser only1F68
E08Error reportingDoes 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."fullt_inline_fullall0-
E09Error reportingGiven 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 / mustmust"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"fulle_nonlinear_onlyall2F30
T01Impressions and trackingRequests every Impression URI of the ad.§2.3.4; §3.4.4required / mustmust"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"fullt_inline_fullall0-
T02Impressions and trackingDoes not dispatch an Impression whose URI is about:blank.§3.4.4 (about:blank)should / shouldshould"The player should disregard dispatching the tracking URI if it is set to "about:blank""fullt_inline_fullall4F22, F43
T03Impressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.§3.14.1 (Linear metrics)required / mustmust"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%"fullt_inline_fullall0-
T04Impressions and trackingFires every Tracking element for the same event (two start trackers for two parties).§3.14.3 (multiple Tracking elements per event)required / mustmust"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"fullt_inline_fullall0-
T05Impressions and trackingFires a progress tracker with an HH:MM:SS offset.§3.14.1 (progress, HH:MM:SS offset)required / mustmust"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%."fullt_inline_fullall2F23, F60, F70
T06Impressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.§3.14.1 (progress, HH:MM:SS.mmm offset)required / mustmust"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"fullt_inline_fullall2F23, F60, F70
T07Impressions and trackingFires progress trackers with percentage offsets (10% and 80%).§3.14.1 (progress, n% offset)required / mustmust"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."fullt_inline_fullall4F23, F34, F60, F70
T08Impressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.§3.14.1 (thirdQuartile, complete definitions)required / mustmust"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."partialt_inline_fullall0-
T09Robustness observationsSpread 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"fullw_oneall0-
T10Impressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).§2.3.4 (IAB Digital Video Measurement Guidelines); §3.4.4none / should (a)should"compliance with the IAB Digital Video Measurement Guidelines" / "when the impression occurs"fulle_inline_unplayableall1F69
T11Impressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.§3.4.4 (notify when the impression occurs); §2.3.4none / should (a)should"the media player must use to notify the ad server when the impression occurs"user actionst_interactall0-
T12Impressions and trackingFires the pause tracker once when the user pauses.§3.14.1 (pause)required / mustmust"the media player is required to trigger the tracking resource URI" / "pause: the user clicked the pause control and stopped the creative."user actionst_interactall0-
T13Impressions and trackingFires the resume tracker once when the user resumes.§3.14.1 (resume)required / mustmust"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 actionst_interactall2F20
T14Impressions and trackingFires the mute tracker once when the user mutes.§3.14.1 (mute)required / mustmust"the media player is required to trigger the tracking resource URI" / "mute: the user activated the mute control and muted the creative."user actionst_interactall0-
T15Impressions and trackingFires the unmute tracker when the user unmutes.§3.14.1 (unmute)required / mustmust"the media player is required to trigger the tracking resource URI" / "unmute: the user activated the mute control and unmuted the creative."user actionst_interactall0-
T16Impressions and trackingSkipping 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 / mustmust"the media player is required to trigger the tracking resource URI" / "skip: the user activated a skip control to skip the creative."skipt_skipall0-
T17Impressions and trackingThe 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"skipt_skipall0-
T18Impressions and trackingA 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"skipt_skip_pctall3F40, F71
T19Impressions and trackingProgress 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."skipt_skipall0-
T20Impressions and trackingFires the loaded tracker once when the media is ready to play.§3.14.1 (loaded)should / shouldshould"This event should be used to indicate when the player considers that it has loaded"user actionst_interactall4F41, F60, F70
T21Impressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).§3.14.1 (rewind)required / mustmust"the media player is required to trigger the tracking resource URI" / "rewind: the user activated the rewind control"rewindt_rewindall4F24, F60, F70
T22Impressions and trackingAfter 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."rewindt_rewindall0-
T23Impressions and trackingA 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 actionst_interactall3F21, F72
M01MacrosReplaces [CACHEBUSTING] with a random 8-digit integer.IAB macro list: CACHEBUSTING (required)list / must (a)must"Required" / "Random 8-digit integer."fullm_macrosall5F15, F37, F65
M02MacrosReplaces [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"fullm_macrosall1F65
M03MacrosReplaces [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"fullm_macrosall6F16, F38, F61, F65
M04MacrosPercent-encodes macro values (the colons in TIMESTAMP).§6.1 (encodeURIComponent on values)must / mustmust"make sure to apply encodeURIComponent to any value" / "the encoded version must always be used as a macro substitution"fullm_macrosall0-
M05MacrosDoes 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"fullm_macrosall0-
M06MacrosReplaces 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 / mustmust"the following special values must be inserted into the macro to indicate the reason for not providing the information"fullm_optional_noflvall6F16, F38, F61, F65
M07MacrosFills [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."fullm_optional_noflvall4F38, F61, F65
M08MacrosWhen 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}"fullm_optional_noflvall0-
M09MacrosFills [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: UNIVERSALADIDshould / shouldshould"the value should be rendered as a set of values separated by a comma" / "encoding should be applied to individual values only"fullm_optional_noflvall4F09, F18
M10MacrosWhen 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."fullm_optionalall2F08
M11MacrosReplaces [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"fullm_error_contextall3F17, F65
M12MacrosReplaces [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"loadm_request_contextall11F01, F39, F50, F62
X01XML and parsingTrims 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."fullx_whitespaceall0-
X02XML and parsingIgnores XML comments inside an element when reading its URI.§2.2 (XML comments)must / mustmust"must be able to play the ad in a VAST response" / "acknowledge VAST comments in the standard XML syntax"fullx_commentall1F56
X03XML and parsingDecodes character entities (&amp;) 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 / shouldshould"standard XML requirements such as character entities and <!--XML comments--> should be honored"fullx_entitiesall0-
X04Robustness observationsParses 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)loadx_no_namespaceall0-
X05XML and parsingAccepts a Creative with two UniversalAdId elements.§2.2; §3.7.1 (UniversalAdId 1+; 4.2 XSD unbounded)must / mustmust"must be able to play the ad in a VAST response" / "A required element for the purpose of tracking ad creative"loadx_multi_uaidall4F47
X06XML and parsingAccepts two ClosedCaptionFile elements.§2.2 (play the ad in a VAST response); §3.9.5 (ClosedCaptionFile 0+)must / mustmust"must be able to play the ad in a VAST response"loadx_multi_ccall4F47
X07Robustness observationsFollows 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 VASTAdTagURIn/a / obs.observation(no VAST clause)loadx_adtaguri_wsall0-
X08XML and parsingNever 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"fullx_unknown_eventall0-
X09XML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.§3.18 Extensions (custom XML for the publisher, not VAST elements)should / shouldshould"custom XML should fall under the nested <Extension> (singular) element so that custom XML can be separated from VAST elements"fullx_extension_impressionall1F56
X10XML and parsingParses 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 / mustmust"must be able to play the ad in a VAST response" / "compliant with XML 1.0"loadx_bomall0-
X11XML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).§2.3.3 (a URI containing "]]>" split across CDATA sections)required / mustmust"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"fullx_cdata_splitall2F33
X12XML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.§3.7.1 (VAST 4.0 idValue attribute: players should not fail)should / shouldshould"Media players should not fail if this attribute is present"loadx_uaid_idvalueall0-
X13XML and parsingAn empty Impression element does not stop the other Impression from being requested.§3.4.4 (Impression)required / mustmust"The media player is required to request the resource file for any included tracking elements"fullx_empty_impressionall0-
X14XML and parsingAccepts a VAST 3.0 InLine document.§4.3 Media Players (accept older VAST versions)should / shouldshould"VAST 4 players should continue to accept ads on older versions of VAST"loadv_30all0-
X15XML and parsingAccepts a VAST 2.0 InLine document.§4.3 Media Players (accept older VAST versions)should / shouldshould"VAST 4 players should continue to accept ads on older versions of VAST"loadv_20all0-
X16XML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.§4.3 Media Players (accept older VAST versions)should / shouldshould"VAST 4 players should continue to accept ads on older versions of VAST"loadv_mixed_chainall0-
X17XML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).§2.2 (acknowledge XML comments); §2.3.2must / mustmust"must be able to play the ad in a VAST response" / "acknowledge VAST comments in the standard XML syntax"fullx_comment_impressionall1F56
X18XML and parsingRequests a VASTAdTagURI written as escaped text, with &amp; between query parameters, with all parameters intact (a=1, b=2, c=3).§2.3.2 (character entities should be honored); §3.19.1 VASTAdTagURIshould / shouldshould"character entities and <!--XML comments--> should be honored"loadx_adtaguri_ampall1F57
X19XML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference &#38; between query parameters, with all parameters intact (a=1, b=2, c=3).§2.3.2 (character entities should be honored); §3.19.1 VASTAdTagURIshould / shouldshould"character entities and <!--XML comments--> should be honored"loadx_adtaguri_ncrall1F57
P01Ad podsOrders 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 Adsmust / mustmust"the media player must play the ads in the Pod in the prescribed sequence" / "sequenced ads are played in numerical order"loadp_pod_orderall3F27, F75
P02Ad podsWhen 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 / shouldshould"If stand-alone ads are unavailable, the player should move on to the next ad in the Ad Pod."podp_pod_failbrowser only0-
P03Ad podsPlaying 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 Podsrequired / mustmust"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"podp_pod_playall1F74
P05Ad podsThe 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 / shouldshould"the media player should substitute an un-played stand-alone ad from the response"podp_pod_failbrowser only3F14, F76
P06Ad podsPlays all three ads of a pod.Ad Pods (play the pod in sequence; play as many ads as possible)should / shouldshould"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"podp_pod_playall2F28
P07Ad podsOrders 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.19must / mustmust"the media player must play the ads in the Pod in the prescribed sequence"loadp_pod_wrapperall10F02, F27, F46
A01Verification and iconsWhen 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 verificationNotExecutedmust / mustmust"The player must request each associated verificationNotExecuted tracking event URI" / "any appropriate tracking events listed under the <Verification> element must be fired"fulla_verification_inlineall4F26, F32, F78
A02Verification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).§3.17.4 [REASON]; IAB macro list: REASON (required)must / mustmust"with the [REASON] macro filled with reason code 1" / "Required" / "The following macros should be supported specifically in URIs for this event type"fulla_verification_inlineall0-
A03Verification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.Viewability with Ad Verification Services (resources from intermediary Wrappers)should / shouldshould"All verification resources listed in the VAST should be executed, including those from any intermediary <Wrapper> VASTs"fulla_verification_jsall4F26, F32, F83
A04Verification and iconsReports 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 Servicesmust / mustmust"the player must trigger any provided verificationNotExecuted tracking events with reason code 2"fulla_verification_inlineall0-
A05Verification and iconsWhen 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 Servicesmust / mustmust"any included verificationNotExecuted tracking events URIs must be sent with the appropriate reason code" / "404 or other failed response codes"fulla_verification_404all1F84
I01Verification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.Industry Icon Support; §3.11.2 IconViewTrackingmust / mustmust"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."iconi_iconbrowser only2F77, F85
I02Verification and iconsOn a click on the Icon, requests its IconClickTracking URI.§3.11.5 IconClickTrackingrequired / mustmust"The media player is required to request the resource file for any included tracking elements" / "is used to track click activity within the icon"iconi_iconbrowser only0-
I03Verification and iconsDisplays 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 / shouldshould"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"iconi_icon_timedbrowser only4F25, F31, F77
S01Media selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.MediaFiles (choose by attributes, not document order)should / shouldshould"the publisher should decide which file to play based on attributes of the MediaFile nodes and not the structure of the document"fulls_flv_firstall1F73
S02Media selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).§1.4; §3.4 (adType="audio")may / maymay"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"fulls_audiobrowser only0-
R01Robustness observationsA 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)loadw_timeoutall4F03
R02Robustness observationsA failed Wrapper request does not escape as an uncaught exception.(engineering; not a VAST clause)n/a / obs.observation(no VAST clause)loadw_http404all0-
R03Robustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.(HTTP; not a VAST clause)n/a / obs.observation(no VAST clause)loadr_redirectall0-
R04Robustness observationsParses a VAST response sent with Content-Encoding: gzip.(HTTP; not a VAST clause)n/a / obs.observation(no VAST clause)loadr_gzip_rootall0-
R05Robustness observationsParses 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)loadr_text_plain_rootall0-
R06Robustness observationsA 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)fullr_pixel_500all0-

Table T3. Load and playback scripts (Table 3 of the paper).

showing 9 of 9CSV
loadresolves the tag; no playback
fullplays the ad to the end
partialplays to 60 percent and stops the ad
clickclicks the ad at 30 percent
user actionspauses, resumes, mutes, unmutes and changes the volume while playing
skipprobes for the skip control at 1.5 s and skips at 6 s
rewindseeks back 2 s, from 6 s to 4 s
iconclicks a displayed icon
podplays every ad of a pod