Online ResourcesPrashant Chaudhary

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

Every verdict by client

One row per requirement and configuration in the two reference layers: 5 configurations in the Node.js layer and 8 in Chromium 141 on Linux, 1,404 rows in all. "Detail" is the oracle's or the grader's own text for a deviating or n/a cell, as stored with the results.

Choose a configuration to see one client's full record; the totals per configuration are Table 5. For the open-source clients, verdicts in other engines differ only in the cells of Table 6; the results grid shows Firefox and WebKit as well.

Table R5.7. Every verdict by client and layer, with detail.

showing 1404 of 1404CSV
vast-client-js 6.5.0Node.jsW01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
vast-client-js 6.5.0Node.jsW02mustWrapper 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).conforms
vast-client-js 6.5.0Node.jsW03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).conforms
vast-client-js 6.5.0Node.jsW04shouldError 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).conforms
vast-client-js 6.5.0Node.jsW05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
vast-client-js 6.5.0Node.jsW06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
vast-client-js 6.5.0Node.jsW07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.conforms
vast-client-js 6.5.0Node.jsW08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
vast-client-js 6.5.0Node.jsW09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
vast-client-js 6.5.0Node.jsW10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).conforms
vast-client-js 6.5.0Node.jsW11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).deviatescode 301
vast-client-js 6.5.0Node.jsW12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.conforms
vast-client-js 6.5.0Node.jsW13mustError 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).conforms
vast-client-js 6.5.0Node.jsW14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.conforms
vast-client-js 6.5.0Node.jsW15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.conforms
vast-client-js 6.5.0Node.jsW16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.conforms
vast-client-js 6.5.0Node.jsW17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.conforms
vast-client-js 6.5.0Node.jsW18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.conforms
vast-client-js 6.5.0Node.jsW19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.conforms
vast-client-js 6.5.0Node.jsW20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).conforms
vast-client-js 6.5.0Node.jsW21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.conforms
vast-client-js 6.5.0Node.jsW22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
vast-client-js 6.5.0Node.jsE01mustError reportingFor a no-ad response, requests the VAST-level Error URI.conforms
vast-client-js 6.5.0Node.jsE02mustError reportingRequests every VAST-level Error URI when several are given.conforms
vast-client-js 6.5.0Node.jsE03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.delegated
vast-client-js 6.5.0Node.jsE04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.conforms
vast-client-js 6.5.0Node.jsT01mustImpressions and trackingRequests every Impression URI of the ad.conforms
vast-client-js 6.5.0Node.jsT02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.conforms
vast-client-js 6.5.0Node.jsT03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.conforms
vast-client-js 6.5.0Node.jsT04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).conforms
vast-client-js 6.5.0Node.jsT05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.conforms
vast-client-js 6.5.0Node.jsT06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.conforms
vast-client-js 6.5.0Node.jsT07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).conforms
vast-client-js 6.5.0Node.jsT08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.conforms
vast-client-js 6.5.0Node.jsT09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).n/a22 ms
vast-client-js 6.5.0Node.jsM01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.conforms
vast-client-js 6.5.0Node.jsM02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).conforms
vast-client-js 6.5.0Node.jsM03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).conforms
vast-client-js 6.5.0Node.jsM04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).conforms
vast-client-js 6.5.0Node.jsM05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).conforms
vast-client-js 6.5.0Node.jsX01shouldXML 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).conforms
vast-client-js 6.5.0Node.jsX02mustXML and parsingIgnores XML comments inside an element when reading its URI.conforms
vast-client-js 6.5.0Node.jsX03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).conforms
vast-client-js 6.5.0Node.jsX04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
vast-client-js 6.5.0Node.jsX05mustXML and parsingAccepts a Creative with two UniversalAdId elements.conforms
vast-client-js 6.5.0Node.jsX06mustXML and parsingAccepts two ClosedCaptionFile elements.conforms
vast-client-js 6.5.0Node.jsP01mustAd 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).conforms
vast-client-js 6.5.0Node.jsR01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).deviatesuncaught: URLHandler: Request timed out after 2000 ms (408)
vast-client-js 6.5.0Node.jsR02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
vast-client-js 6.5.0Node.jsW23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.delegated
vast-client-js 6.5.0Node.jsE05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).n/aneeds real media decoding (browser layer only)
vast-client-js 6.5.0Node.jsE06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.n/aneeds real media decoding (browser layer only)
vast-client-js 6.5.0Node.jsE07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).n/aneeds real media decoding (browser layer only)
vast-client-js 6.5.0Node.jsE08shouldError reportingDoes not request the Error URI when the ad plays without a problem.conforms
vast-client-js 6.5.0Node.jsE09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).delegated
vast-client-js 6.5.0Node.jsT10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).delegated
vast-client-js 6.5.0Node.jsT11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.conforms
vast-client-js 6.5.0Node.jsT12mustImpressions and trackingFires the pause tracker once when the user pauses.conforms
vast-client-js 6.5.0Node.jsT13mustImpressions and trackingFires the resume tracker once when the user resumes.conforms
vast-client-js 6.5.0Node.jsT14mustImpressions and trackingFires the mute tracker once when the user mutes.conforms
vast-client-js 6.5.0Node.jsT15mustImpressions and trackingFires the unmute tracker when the user unmutes.conforms
vast-client-js 6.5.0Node.jsT23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.delegated
vast-client-js 6.5.0Node.jsT20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.conforms
vast-client-js 6.5.0Node.jsT16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).conforms
vast-client-js 6.5.0Node.jsT17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).conforms
vast-client-js 6.5.0Node.jsT18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.conforms
vast-client-js 6.5.0Node.jsT19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.conforms
vast-client-js 6.5.0Node.jsT21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).conforms
vast-client-js 6.5.0Node.jsT22shouldImpressions 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.conforms
vast-client-js 6.5.0Node.jsA01mustVerification 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.delegated
vast-client-js 6.5.0Node.jsA02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).delegated
vast-client-js 6.5.0Node.jsA03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.conforms
vast-client-js 6.5.0Node.jsA04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).delegated
vast-client-js 6.5.0Node.jsA05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).delegated
vast-client-js 6.5.0Node.jsS01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.delegated
vast-client-js 6.5.0Node.jsS02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).n/aneeds real media decoding (browser layer only)
vast-client-js 6.5.0Node.jsM06mustMacrosReplaces 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.conforms
vast-client-js 6.5.0Node.jsM07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).conforms
vast-client-js 6.5.0Node.jsM08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.conforms
vast-client-js 6.5.0Node.jsM09shouldMacrosFills [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.deviatesraw "ad-id.org%20ABCD%201234%2Cclearcast.co.uk%20CC%2FABC%2F123"
vast-client-js 6.5.0Node.jsM10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).deviatesASSETURI in.flv; played in.mp4
vast-client-js 6.5.0Node.jsM11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.conforms
vast-client-js 6.5.0Node.jsM12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
vast-client-js 6.5.0Node.jsP06shouldAd podsPlays all three ads of a pod.delegated
vast-client-js 6.5.0Node.jsP03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.delegated
vast-client-js 6.5.0Node.jsP02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).n/aneeds real media decoding (browser layer only)
vast-client-js 6.5.0Node.jsP05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.n/aneeds real media decoding (browser layer only)
vast-client-js 6.5.0Node.jsI01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.n/aneeds real media decoding (browser layer only)
vast-client-js 6.5.0Node.jsI03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.n/aneeds real media decoding (browser layer only)
vast-client-js 6.5.0Node.jsI02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.n/aneeds real media decoding (browser layer only)
vast-client-js 6.5.0Node.jsX07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
vast-client-js 6.5.0Node.jsX08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).conforms
vast-client-js 6.5.0Node.jsX09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.conforms
vast-client-js 6.5.0Node.jsX10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
vast-client-js 6.5.0Node.jsX11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).conforms
vast-client-js 6.5.0Node.jsX12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
vast-client-js 6.5.0Node.jsX13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.conforms
vast-client-js 6.5.0Node.jsX14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
vast-client-js 6.5.0Node.jsX15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
vast-client-js 6.5.0Node.jsX16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
vast-client-js 6.5.0Node.jsR03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
vast-client-js 6.5.0Node.jsR04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
vast-client-js 6.5.0Node.jsR05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
vast-client-js 6.5.0Node.jsR06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).conforms
vast-client-js 6.5.0Node.jsX17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).conforms
vast-client-js 6.5.0Node.jsX18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
vast-client-js 6.5.0Node.jsX19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
vast-client-js 6.5.0Node.jsP07mustAd 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).deviatesorder p3,p1,p2
video-ad-sdk 4.0.1Node.jsW01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
video-ad-sdk 4.0.1Node.jsW02mustWrapper 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).conforms
video-ad-sdk 4.0.1Node.jsW03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).conforms
video-ad-sdk 4.0.1Node.jsW04shouldError 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).conforms
video-ad-sdk 4.0.1Node.jsW05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
video-ad-sdk 4.0.1Node.jsW06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
video-ad-sdk 4.0.1Node.jsW07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.deviatescode 502
video-ad-sdk 4.0.1Node.jsW08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
video-ad-sdk 4.0.1Node.jsW09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
video-ad-sdk 4.0.1Node.jsW10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).conforms
video-ad-sdk 4.0.1Node.jsW11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).conforms
video-ad-sdk 4.0.1Node.jsW12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.conforms
video-ad-sdk 4.0.1Node.jsW13mustError 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).n/afanned out 401 to inline and both wrappers; the code is graded by E03 (G2)
video-ad-sdk 4.0.1Node.jsW14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.conforms
video-ad-sdk 4.0.1Node.jsW15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.conforms
video-ad-sdk 4.0.1Node.jsW16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.conforms
video-ad-sdk 4.0.1Node.jsW17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.deviatesno click-through used
video-ad-sdk 4.0.1Node.jsW18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.conforms
video-ad-sdk 4.0.1Node.jsW19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.conforms
video-ad-sdk 4.0.1Node.jsW20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).deviatesresolved none
video-ad-sdk 4.0.1Node.jsW21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.deviatesresolved p2
video-ad-sdk 4.0.1Node.jsW22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
video-ad-sdk 4.0.1Node.jsE01mustError reportingFor a no-ad response, requests the VAST-level Error URI.conforms
video-ad-sdk 4.0.1Node.jsE02mustError reportingRequests every VAST-level Error URI when several are given.conforms
video-ad-sdk 4.0.1Node.jsE03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.deviateserr1 401; err2 401
video-ad-sdk 4.0.1Node.jsE04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.conforms
video-ad-sdk 4.0.1Node.jsT01mustImpressions and trackingRequests every Impression URI of the ad.conforms
video-ad-sdk 4.0.1Node.jsT02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.deviatesdispatched about:blank
video-ad-sdk 4.0.1Node.jsT03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.conforms
video-ad-sdk 4.0.1Node.jsT04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).conforms
video-ad-sdk 4.0.1Node.jsT05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.conforms
video-ad-sdk 4.0.1Node.jsT06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.conforms
video-ad-sdk 4.0.1Node.jsT07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).deviates10%: 0, 80%: 0
video-ad-sdk 4.0.1Node.jsT08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.conforms
video-ad-sdk 4.0.1Node.jsT09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).n/a3 ms
video-ad-sdk 4.0.1Node.jsM01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.deviates"4592845962" (10 chars)
video-ad-sdk 4.0.1Node.jsM02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).conforms
video-ad-sdk 4.0.1Node.jsM03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).deviates"[LIMITADTRACKING]"
video-ad-sdk 4.0.1Node.jsM04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).conforms
video-ad-sdk 4.0.1Node.jsM05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).conforms
video-ad-sdk 4.0.1Node.jsX01shouldXML 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).conforms
video-ad-sdk 4.0.1Node.jsX02mustXML and parsingIgnores XML comments inside an element when reading its URI.conforms
video-ad-sdk 4.0.1Node.jsX03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).conforms
video-ad-sdk 4.0.1Node.jsX04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
video-ad-sdk 4.0.1Node.jsX05mustXML and parsingAccepts a Creative with two UniversalAdId elements.conforms
video-ad-sdk 4.0.1Node.jsX06mustXML and parsingAccepts two ClosedCaptionFile elements.conforms
video-ad-sdk 4.0.1Node.jsP01mustAd 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).deviatesplays p3 first
video-ad-sdk 4.0.1Node.jsR01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).conforms
video-ad-sdk 4.0.1Node.jsR02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
video-ad-sdk 4.0.1Node.jsW23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.conforms
video-ad-sdk 4.0.1Node.jsE05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).n/aneeds real media decoding (browser layer only)
video-ad-sdk 4.0.1Node.jsE06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.n/aneeds real media decoding (browser layer only)
video-ad-sdk 4.0.1Node.jsE07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).n/aneeds real media decoding (browser layer only)
video-ad-sdk 4.0.1Node.jsE08shouldError reportingDoes not request the Error URI when the ad plays without a problem.conforms
video-ad-sdk 4.0.1Node.jsE09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).deviatescode 401
video-ad-sdk 4.0.1Node.jsT10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).conforms
video-ad-sdk 4.0.1Node.jsT11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.conforms
video-ad-sdk 4.0.1Node.jsT12mustImpressions and trackingFires the pause tracker once when the user pauses.conforms
video-ad-sdk 4.0.1Node.jsT13mustImpressions and trackingFires the resume tracker once when the user resumes.conforms
video-ad-sdk 4.0.1Node.jsT14mustImpressions and trackingFires the mute tracker once when the user mutes.conforms
video-ad-sdk 4.0.1Node.jsT15mustImpressions and trackingFires the unmute tracker when the user unmutes.conforms
video-ad-sdk 4.0.1Node.jsT23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.conforms
video-ad-sdk 4.0.1Node.jsT20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.deviates0 times
video-ad-sdk 4.0.1Node.jsT16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).conforms
video-ad-sdk 4.0.1Node.jsT17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).conforms
video-ad-sdk 4.0.1Node.jsT18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.deviatesbefore false, after false, skip 0
video-ad-sdk 4.0.1Node.jsT19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.conforms
video-ad-sdk 4.0.1Node.jsT21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).conforms
video-ad-sdk 4.0.1Node.jsT22shouldImpressions 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.conforms
video-ad-sdk 4.0.1Node.jsA01mustVerification 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.deviatesnot requested
video-ad-sdk 4.0.1Node.jsA02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).n/anot requested (see A01)
video-ad-sdk 4.0.1Node.jsA03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.deviatesnot requested
video-ad-sdk 4.0.1Node.jsA04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).n/anot requested (see A01)
video-ad-sdk 4.0.1Node.jsA05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).n/aresource neither fetched nor reported (see A01)
video-ad-sdk 4.0.1Node.jsS01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.conforms
video-ad-sdk 4.0.1Node.jsS02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).n/aneeds real media decoding (browser layer only)
video-ad-sdk 4.0.1Node.jsM06mustMacrosReplaces 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.deviatesnot replaced or implausible: ah="[ADPLAYHEAD]", asi="[ADSERVINGID]", ua="[UNIVERSALADID]", ps="[PODSEQUENCE]", au="[ASSETURI]", bp="[BREAKPOSITION]", ifa="[IFA]", cua="[CLIENTUA]"
video-ad-sdk 4.0.1Node.jsM07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).deviates"[ADSERVINGID]"
video-ad-sdk 4.0.1Node.jsM08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.n/aleft as macro (see M06)
video-ad-sdk 4.0.1Node.jsM09shouldMacrosFills [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.n/aleft as macro (see M06)
video-ad-sdk 4.0.1Node.jsM10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).n/aleft as macro (see M06)
video-ad-sdk 4.0.1Node.jsM11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.conforms
video-ad-sdk 4.0.1Node.jsM12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
video-ad-sdk 4.0.1Node.jsP06shouldAd podsPlays all three ads of a pod.deviatesplayed p1
video-ad-sdk 4.0.1Node.jsP03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.n/aplays 1 of 3 pod ads (see P06)
video-ad-sdk 4.0.1Node.jsP02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).n/aneeds real media decoding (browser layer only)
video-ad-sdk 4.0.1Node.jsP05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.n/aneeds real media decoding (browser layer only)
video-ad-sdk 4.0.1Node.jsI01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.n/aneeds real media decoding (browser layer only)
video-ad-sdk 4.0.1Node.jsI03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.n/aneeds real media decoding (browser layer only)
video-ad-sdk 4.0.1Node.jsI02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.n/aneeds real media decoding (browser layer only)
video-ad-sdk 4.0.1Node.jsX07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
video-ad-sdk 4.0.1Node.jsX08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).conforms
video-ad-sdk 4.0.1Node.jsX09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.conforms
video-ad-sdk 4.0.1Node.jsX10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
video-ad-sdk 4.0.1Node.jsX11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).deviatess="x]]"
video-ad-sdk 4.0.1Node.jsX12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
video-ad-sdk 4.0.1Node.jsX13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.conforms
video-ad-sdk 4.0.1Node.jsX14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
video-ad-sdk 4.0.1Node.jsX15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
video-ad-sdk 4.0.1Node.jsX16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
video-ad-sdk 4.0.1Node.jsR03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
video-ad-sdk 4.0.1Node.jsR04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
video-ad-sdk 4.0.1Node.jsR05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
video-ad-sdk 4.0.1Node.jsR06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).conforms
video-ad-sdk 4.0.1Node.jsX17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).conforms
video-ad-sdk 4.0.1Node.jsX18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
video-ad-sdk 4.0.1Node.jsX19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
video-ad-sdk 4.0.1Node.jsP07mustAd 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).deviatesplays p3 first
iab-vast-loader 2.5.1, defaultsNode.jsW01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
iab-vast-loader 2.5.1, defaultsNode.jsW02mustWrapper 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).deviatesfetched start.xml; resolved 0; no ad and no error
iab-vast-loader 2.5.1, defaultsNode.jsW03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).conforms
iab-vast-loader 2.5.1, defaultsNode.jsW04shouldError 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).conforms
iab-vast-loader 2.5.1, defaultsNode.jsW05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
iab-vast-loader 2.5.1, defaultsNode.jsW06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
iab-vast-loader 2.5.1, defaultsNode.jsW07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.conforms
iab-vast-loader 2.5.1, defaultsNode.jsW08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
iab-vast-loader 2.5.1, defaultsNode.jsW09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
iab-vast-loader 2.5.1, defaultsNode.jsW10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).delegated
iab-vast-loader 2.5.1, defaultsNode.jsW11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).deviatesaccepted an ad from non-well-formed XML (x)
iab-vast-loader 2.5.1, defaultsNode.jsW12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.delegated
iab-vast-loader 2.5.1, defaultsNode.jsW13mustError 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).delegated
iab-vast-loader 2.5.1, defaultsNode.jsW14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.delegated
iab-vast-loader 2.5.1, defaultsNode.jsW15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.delegated
iab-vast-loader 2.5.1, defaultsNode.jsW16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.delegated
iab-vast-loader 2.5.1, defaultsNode.jsW17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.delegated
iab-vast-loader 2.5.1, defaultsNode.jsW18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.delegated
iab-vast-loader 2.5.1, defaultsNode.jsW19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.deviatesfollowed the second wrapper to the InLine
iab-vast-loader 2.5.1, defaultsNode.jsW20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).delegated
iab-vast-loader 2.5.1, defaultsNode.jsW21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.delegated
iab-vast-loader 2.5.1, defaultsNode.jsW22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
iab-vast-loader 2.5.1, defaultsNode.jsE01mustError reportingFor a no-ad response, requests the VAST-level Error URI.delegated
iab-vast-loader 2.5.1, defaultsNode.jsE02mustError reportingRequests every VAST-level Error URI when several are given.delegated
iab-vast-loader 2.5.1, defaultsNode.jsE03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.delegated
iab-vast-loader 2.5.1, defaultsNode.jsE04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT01mustImpressions and trackingRequests every Impression URI of the ad.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).delegated
iab-vast-loader 2.5.1, defaultsNode.jsT05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).delegated
iab-vast-loader 2.5.1, defaultsNode.jsT08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).delegated
iab-vast-loader 2.5.1, defaultsNode.jsM01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.delegated
iab-vast-loader 2.5.1, defaultsNode.jsM02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).delegated
iab-vast-loader 2.5.1, defaultsNode.jsM03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).delegated
iab-vast-loader 2.5.1, defaultsNode.jsM04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).delegated
iab-vast-loader 2.5.1, defaultsNode.jsM05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).delegated
iab-vast-loader 2.5.1, defaultsNode.jsX01shouldXML 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).delegated
iab-vast-loader 2.5.1, defaultsNode.jsX02mustXML and parsingIgnores XML comments inside an element when reading its URI.delegated
iab-vast-loader 2.5.1, defaultsNode.jsX03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).delegated
iab-vast-loader 2.5.1, defaultsNode.jsX04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
iab-vast-loader 2.5.1, defaultsNode.jsX05mustXML and parsingAccepts a Creative with two UniversalAdId elements.deviatesrejected: Multiple values for Creative.UniversalAdId
iab-vast-loader 2.5.1, defaultsNode.jsX06mustXML and parsingAccepts two ClosedCaptionFile elements.deviatesrejected: Multiple values for ClosedCaptionFiles.ClosedCaptionFile
iab-vast-loader 2.5.1, defaultsNode.jsP01mustAd 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).conforms
iab-vast-loader 2.5.1, defaultsNode.jsR01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).conforms
iab-vast-loader 2.5.1, defaultsNode.jsR02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
iab-vast-loader 2.5.1, defaultsNode.jsW23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.delegated
iab-vast-loader 2.5.1, defaultsNode.jsE05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, defaultsNode.jsE06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, defaultsNode.jsE07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, defaultsNode.jsE08shouldError reportingDoes not request the Error URI when the ad plays without a problem.delegated
iab-vast-loader 2.5.1, defaultsNode.jsE09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).delegated
iab-vast-loader 2.5.1, defaultsNode.jsT10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).delegated
iab-vast-loader 2.5.1, defaultsNode.jsT11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT12mustImpressions and trackingFires the pause tracker once when the user pauses.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT13mustImpressions and trackingFires the resume tracker once when the user resumes.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT14mustImpressions and trackingFires the mute tracker once when the user mutes.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT15mustImpressions and trackingFires the unmute tracker when the user unmutes.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).delegated
iab-vast-loader 2.5.1, defaultsNode.jsT17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).delegated
iab-vast-loader 2.5.1, defaultsNode.jsT18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.delegated
iab-vast-loader 2.5.1, defaultsNode.jsT21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).delegated
iab-vast-loader 2.5.1, defaultsNode.jsT22shouldImpressions 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.delegated
iab-vast-loader 2.5.1, defaultsNode.jsA01mustVerification 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.delegated
iab-vast-loader 2.5.1, defaultsNode.jsA02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).delegated
iab-vast-loader 2.5.1, defaultsNode.jsA03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.delegated
iab-vast-loader 2.5.1, defaultsNode.jsA04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).delegated
iab-vast-loader 2.5.1, defaultsNode.jsA05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).delegated
iab-vast-loader 2.5.1, defaultsNode.jsS01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.delegated
iab-vast-loader 2.5.1, defaultsNode.jsS02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, defaultsNode.jsM06mustMacrosReplaces 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.delegated
iab-vast-loader 2.5.1, defaultsNode.jsM07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).delegated
iab-vast-loader 2.5.1, defaultsNode.jsM08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.delegated
iab-vast-loader 2.5.1, defaultsNode.jsM09shouldMacrosFills [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.delegated
iab-vast-loader 2.5.1, defaultsNode.jsM10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).delegated
iab-vast-loader 2.5.1, defaultsNode.jsM11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.delegated
iab-vast-loader 2.5.1, defaultsNode.jsM12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
iab-vast-loader 2.5.1, defaultsNode.jsP06shouldAd podsPlays all three ads of a pod.delegated
iab-vast-loader 2.5.1, defaultsNode.jsP03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.delegated
iab-vast-loader 2.5.1, defaultsNode.jsP02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, defaultsNode.jsP05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, defaultsNode.jsI01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, defaultsNode.jsI03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, defaultsNode.jsI02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, defaultsNode.jsX07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
iab-vast-loader 2.5.1, defaultsNode.jsX08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).delegated
iab-vast-loader 2.5.1, defaultsNode.jsX09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.delegated
iab-vast-loader 2.5.1, defaultsNode.jsX10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
iab-vast-loader 2.5.1, defaultsNode.jsX11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).delegated
iab-vast-loader 2.5.1, defaultsNode.jsX12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
iab-vast-loader 2.5.1, defaultsNode.jsX13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.delegated
iab-vast-loader 2.5.1, defaultsNode.jsX14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
iab-vast-loader 2.5.1, defaultsNode.jsX15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
iab-vast-loader 2.5.1, defaultsNode.jsX16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
iab-vast-loader 2.5.1, defaultsNode.jsR03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
iab-vast-loader 2.5.1, defaultsNode.jsR04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
iab-vast-loader 2.5.1, defaultsNode.jsR05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
iab-vast-loader 2.5.1, defaultsNode.jsR06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).delegated
iab-vast-loader 2.5.1, defaultsNode.jsX17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).delegated
iab-vast-loader 2.5.1, defaultsNode.jsX18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
iab-vast-loader 2.5.1, defaultsNode.jsX19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
iab-vast-loader 2.5.1, defaultsNode.jsP07mustAd 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).deviatesfetched the pod and reported no ad (303): VAST error 303: No ads VAST response after one or more Wrapp
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW02mustWrapper 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).conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW04shouldError 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).conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).deviatesaccepted an ad from non-well-formed XML (x)
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW13mustError 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).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.deviatesfollowed the second wrapper to the InLine
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsE01mustError reportingFor a no-ad response, requests the VAST-level Error URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsE02mustError reportingRequests every VAST-level Error URI when several are given.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsE03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsE04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT01mustImpressions and trackingRequests every Impression URI of the ad.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX01shouldXML 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).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX02mustXML and parsingIgnores XML comments inside an element when reading its URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX05mustXML and parsingAccepts a Creative with two UniversalAdId elements.deviatesrejected: Multiple values for Creative.UniversalAdId
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX06mustXML and parsingAccepts two ClosedCaptionFile elements.deviatesrejected: Multiple values for ClosedCaptionFiles.ClosedCaptionFile
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsP01mustAd 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).conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsR01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsR02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsW23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsE05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsE06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsE07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsE08shouldError reportingDoes not request the Error URI when the ad plays without a problem.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsE09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT12mustImpressions and trackingFires the pause tracker once when the user pauses.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT13mustImpressions and trackingFires the resume tracker once when the user resumes.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT14mustImpressions and trackingFires the mute tracker once when the user mutes.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT15mustImpressions and trackingFires the unmute tracker when the user unmutes.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsT22shouldImpressions 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.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsA01mustVerification 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.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsA02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsA03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsA04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsA05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsS01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsS02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM06mustMacrosReplaces 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.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM09shouldMacrosFills [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.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsM12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsP06shouldAd podsPlays all three ads of a pod.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsP03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsP02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsP05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsI01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsI03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsI02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.n/aneeds real media decoding (browser layer only)
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsR03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsR04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsR05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsR06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).delegated
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsX19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
iab-vast-loader 2.5.1, noSingleAdPodsNode.jsP07mustAd 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).deviatesfetched the pod and reported no ad (303): VAST error 303: No ads VAST response after one or more Wrapp
vastlint-client 0.15.0Node.jsW01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
vastlint-client 0.15.0Node.jsW02mustWrapper 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).conforms
vastlint-client 0.15.0Node.jsW03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).deviatesstopped after 5 documents; codes none
vastlint-client 0.15.0Node.jsW04shouldError 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).delegated
vastlint-client 0.15.0Node.jsW05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
vastlint-client 0.15.0Node.jsW06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.delegated
vastlint-client 0.15.0Node.jsW07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.delegated
vastlint-client 0.15.0Node.jsW08mustError reportingWhen the VASTAdTagURI times out, determines error 301.delegated
vastlint-client 0.15.0Node.jsW09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.delegated
vastlint-client 0.15.0Node.jsW10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).delegated
vastlint-client 0.15.0Node.jsW11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).deviatesaccepted an ad from non-well-formed XML (x)
vastlint-client 0.15.0Node.jsW12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.delegated
vastlint-client 0.15.0Node.jsW13mustError 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).conforms
vastlint-client 0.15.0Node.jsW14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.conforms
vastlint-client 0.15.0Node.jsW15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.conforms
vastlint-client 0.15.0Node.jsW16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.conforms
vastlint-client 0.15.0Node.jsW17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.conforms
vastlint-client 0.15.0Node.jsW18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.conforms
vastlint-client 0.15.0Node.jsW19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.deviatesfollowed the second wrapper to the InLine
vastlint-client 0.15.0Node.jsW20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).deviatesresolved p1,p2,s1
vastlint-client 0.15.0Node.jsW21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.deviatesresolved p1,p2,s1
vastlint-client 0.15.0Node.jsW22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
vastlint-client 0.15.0Node.jsE01mustError reportingFor a no-ad response, requests the VAST-level Error URI.delegated
vastlint-client 0.15.0Node.jsE02mustError reportingRequests every VAST-level Error URI when several are given.delegated
vastlint-client 0.15.0Node.jsE03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.delegated
vastlint-client 0.15.0Node.jsE04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.delegated
vastlint-client 0.15.0Node.jsT01mustImpressions and trackingRequests every Impression URI of the ad.conforms
vastlint-client 0.15.0Node.jsT02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.conforms
vastlint-client 0.15.0Node.jsT03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.conforms
vastlint-client 0.15.0Node.jsT04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).conforms
vastlint-client 0.15.0Node.jsT05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.deviatesfired 0 times
vastlint-client 0.15.0Node.jsT06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.deviatesfired 0 times
vastlint-client 0.15.0Node.jsT07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).deviates10%: 0, 80%: 0
vastlint-client 0.15.0Node.jsT08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.conforms
vastlint-client 0.15.0Node.jsT09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).n/a2 ms
vastlint-client 0.15.0Node.jsM01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.conforms
vastlint-client 0.15.0Node.jsM02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).conforms
vastlint-client 0.15.0Node.jsM03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).deviates"[LIMITADTRACKING]"
vastlint-client 0.15.0Node.jsM04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).conforms
vastlint-client 0.15.0Node.jsM05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).conforms
vastlint-client 0.15.0Node.jsX01shouldXML 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).n/arequested, but the client-side URL was not observable
vastlint-client 0.15.0Node.jsX02mustXML and parsingIgnores XML comments inside an element when reading its URI.deviatesimpression not requested
vastlint-client 0.15.0Node.jsX03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).conforms
vastlint-client 0.15.0Node.jsX04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
vastlint-client 0.15.0Node.jsX05mustXML and parsingAccepts a Creative with two UniversalAdId elements.conforms
vastlint-client 0.15.0Node.jsX06mustXML and parsingAccepts two ClosedCaptionFile elements.conforms
vastlint-client 0.15.0Node.jsP01mustAd 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).conforms
vastlint-client 0.15.0Node.jsR01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).conforms
vastlint-client 0.15.0Node.jsR02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
vastlint-client 0.15.0Node.jsW23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.deviatesresolved s1; fetched start.xml; error none
vastlint-client 0.15.0Node.jsE05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).n/aneeds real media decoding (browser layer only)
vastlint-client 0.15.0Node.jsE06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.n/aneeds real media decoding (browser layer only)
vastlint-client 0.15.0Node.jsE07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).n/aneeds real media decoding (browser layer only)
vastlint-client 0.15.0Node.jsE08shouldError reportingDoes not request the Error URI when the ad plays without a problem.conforms
vastlint-client 0.15.0Node.jsE09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).delegated
vastlint-client 0.15.0Node.jsT10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).delegated
vastlint-client 0.15.0Node.jsT11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.conforms
vastlint-client 0.15.0Node.jsT12mustImpressions and trackingFires the pause tracker once when the user pauses.conforms
vastlint-client 0.15.0Node.jsT13mustImpressions and trackingFires the resume tracker once when the user resumes.conforms
vastlint-client 0.15.0Node.jsT14mustImpressions and trackingFires the mute tracker once when the user mutes.conforms
vastlint-client 0.15.0Node.jsT15mustImpressions and trackingFires the unmute tracker when the user unmutes.conforms
vastlint-client 0.15.0Node.jsT23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.conforms
vastlint-client 0.15.0Node.jsT20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.deviates0 times
vastlint-client 0.15.0Node.jsT16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).conforms
vastlint-client 0.15.0Node.jsT17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).delegated
vastlint-client 0.15.0Node.jsT18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.delegated
vastlint-client 0.15.0Node.jsT19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.n/ano progress tracker fired (see T05)
vastlint-client 0.15.0Node.jsT21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).deviatesnot fired
vastlint-client 0.15.0Node.jsT22shouldImpressions 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.conforms
vastlint-client 0.15.0Node.jsA01mustVerification 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.delegated
vastlint-client 0.15.0Node.jsA02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).delegated
vastlint-client 0.15.0Node.jsA03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.conforms
vastlint-client 0.15.0Node.jsA04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).delegated
vastlint-client 0.15.0Node.jsA05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).delegated
vastlint-client 0.15.0Node.jsS01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.delegated
vastlint-client 0.15.0Node.jsS02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).n/aneeds real media decoding (browser layer only)
vastlint-client 0.15.0Node.jsM06mustMacrosReplaces 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.deviatesnot replaced or implausible: ah="[ADPLAYHEAD]", asi="[ADSERVINGID]", ua="[UNIVERSALADID]", ps="[PODSEQUENCE]", au="[ASSETURI]", bp="[BREAKPOSITION]", ifa="[IFA]", cua="[CLIENTUA]"
vastlint-client 0.15.0Node.jsM07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).deviates"[ADSERVINGID]"
vastlint-client 0.15.0Node.jsM08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.n/aleft as macro (see M06)
vastlint-client 0.15.0Node.jsM09shouldMacrosFills [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.n/aleft as macro (see M06)
vastlint-client 0.15.0Node.jsM10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).n/aleft as macro (see M06)
vastlint-client 0.15.0Node.jsM11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.conforms
vastlint-client 0.15.0Node.jsM12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
vastlint-client 0.15.0Node.jsP06shouldAd podsPlays all three ads of a pod.delegated
vastlint-client 0.15.0Node.jsP03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.delegated
vastlint-client 0.15.0Node.jsP02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).n/aneeds real media decoding (browser layer only)
vastlint-client 0.15.0Node.jsP05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.n/aneeds real media decoding (browser layer only)
vastlint-client 0.15.0Node.jsI01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.n/aneeds real media decoding (browser layer only)
vastlint-client 0.15.0Node.jsI03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.n/aneeds real media decoding (browser layer only)
vastlint-client 0.15.0Node.jsI02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.n/aneeds real media decoding (browser layer only)
vastlint-client 0.15.0Node.jsX07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
vastlint-client 0.15.0Node.jsX08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).conforms
vastlint-client 0.15.0Node.jsX09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.deviatesrequested ext/imp,ext/start
vastlint-client 0.15.0Node.jsX10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
vastlint-client 0.15.0Node.jsX11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).conforms
vastlint-client 0.15.0Node.jsX12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
vastlint-client 0.15.0Node.jsX13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.conforms
vastlint-client 0.15.0Node.jsX14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
vastlint-client 0.15.0Node.jsX15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
vastlint-client 0.15.0Node.jsX16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
vastlint-client 0.15.0Node.jsR03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
vastlint-client 0.15.0Node.jsR04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
vastlint-client 0.15.0Node.jsR05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
vastlint-client 0.15.0Node.jsR06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).conforms
vastlint-client 0.15.0Node.jsX17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).deviatesrequested the commented-out Impression
vastlint-client 0.15.0Node.jsX18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).deviatesrequested with "?a=1"
vastlint-client 0.15.0Node.jsX19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).deviatesrequested with "?a=1"
vastlint-client 0.15.0Node.jsP07mustAd 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).conforms
vast-client-js 6.5.0Chromium 141W01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
vast-client-js 6.5.0Chromium 141W02mustWrapper 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).conforms
vast-client-js 6.5.0Chromium 141W03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).conforms
vast-client-js 6.5.0Chromium 141W04shouldError 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).conforms
vast-client-js 6.5.0Chromium 141W05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
vast-client-js 6.5.0Chromium 141W06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
vast-client-js 6.5.0Chromium 141W07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.conforms
vast-client-js 6.5.0Chromium 141W08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
vast-client-js 6.5.0Chromium 141W09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
vast-client-js 6.5.0Chromium 141W10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).conforms
vast-client-js 6.5.0Chromium 141W11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).deviatescode 303
vast-client-js 6.5.0Chromium 141W12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.conforms
vast-client-js 6.5.0Chromium 141W13mustError 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).conforms
vast-client-js 6.5.0Chromium 141W14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.conforms
vast-client-js 6.5.0Chromium 141W15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.conforms
vast-client-js 6.5.0Chromium 141W16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.conforms
vast-client-js 6.5.0Chromium 141W17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.conforms
vast-client-js 6.5.0Chromium 141W18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.conforms
vast-client-js 6.5.0Chromium 141W19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.conforms
vast-client-js 6.5.0Chromium 141W20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).conforms
vast-client-js 6.5.0Chromium 141W21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.conforms
vast-client-js 6.5.0Chromium 141W22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
vast-client-js 6.5.0Chromium 141E01mustError reportingFor a no-ad response, requests the VAST-level Error URI.conforms
vast-client-js 6.5.0Chromium 141E02mustError reportingRequests every VAST-level Error URI when several are given.conforms
vast-client-js 6.5.0Chromium 141E03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.delegated
vast-client-js 6.5.0Chromium 141E04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.conforms
vast-client-js 6.5.0Chromium 141T01mustImpressions and trackingRequests every Impression URI of the ad.conforms
vast-client-js 6.5.0Chromium 141T02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.conforms
vast-client-js 6.5.0Chromium 141T03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.conforms
vast-client-js 6.5.0Chromium 141T04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).conforms
vast-client-js 6.5.0Chromium 141T05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.conforms
vast-client-js 6.5.0Chromium 141T06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.conforms
vast-client-js 6.5.0Chromium 141T07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).conforms
vast-client-js 6.5.0Chromium 141T08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.conforms
vast-client-js 6.5.0Chromium 141T09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).n/a5 ms
vast-client-js 6.5.0Chromium 141M01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.conforms
vast-client-js 6.5.0Chromium 141M02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).conforms
vast-client-js 6.5.0Chromium 141M03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).conforms
vast-client-js 6.5.0Chromium 141M04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).conforms
vast-client-js 6.5.0Chromium 141M05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).conforms
vast-client-js 6.5.0Chromium 141X01shouldXML 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).conforms
vast-client-js 6.5.0Chromium 141X02mustXML and parsingIgnores XML comments inside an element when reading its URI.conforms
vast-client-js 6.5.0Chromium 141X03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).conforms
vast-client-js 6.5.0Chromium 141X04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
vast-client-js 6.5.0Chromium 141X05mustXML and parsingAccepts a Creative with two UniversalAdId elements.conforms
vast-client-js 6.5.0Chromium 141X06mustXML and parsingAccepts two ClosedCaptionFile elements.conforms
vast-client-js 6.5.0Chromium 141P01mustAd 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).conforms
vast-client-js 6.5.0Chromium 141R01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).deviatesuncaught: Uncaught Error: URLHandler: Request timed out after 2000 ms (408) | URLHandler: Request timed out after 2000 ms (408)
vast-client-js 6.5.0Chromium 141R02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
vast-client-js 6.5.0Chromium 141W23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.delegated
vast-client-js 6.5.0Chromium 141E05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).delegated
vast-client-js 6.5.0Chromium 141E06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.delegated
vast-client-js 6.5.0Chromium 141E07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).delegated
vast-client-js 6.5.0Chromium 141E08shouldError reportingDoes not request the Error URI when the ad plays without a problem.conforms
vast-client-js 6.5.0Chromium 141E09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).delegated
vast-client-js 6.5.0Chromium 141T10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).delegated
vast-client-js 6.5.0Chromium 141T11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.conforms
vast-client-js 6.5.0Chromium 141T12mustImpressions and trackingFires the pause tracker once when the user pauses.conforms
vast-client-js 6.5.0Chromium 141T13mustImpressions and trackingFires the resume tracker once when the user resumes.conforms
vast-client-js 6.5.0Chromium 141T14mustImpressions and trackingFires the mute tracker once when the user mutes.conforms
vast-client-js 6.5.0Chromium 141T15mustImpressions and trackingFires the unmute tracker when the user unmutes.conforms
vast-client-js 6.5.0Chromium 141T23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.delegated
vast-client-js 6.5.0Chromium 141T20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.conforms
vast-client-js 6.5.0Chromium 141T16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).conforms
vast-client-js 6.5.0Chromium 141T17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).conforms
vast-client-js 6.5.0Chromium 141T18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.conforms
vast-client-js 6.5.0Chromium 141T19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.conforms
vast-client-js 6.5.0Chromium 141T21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).conforms
vast-client-js 6.5.0Chromium 141T22shouldImpressions 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.conforms
vast-client-js 6.5.0Chromium 141A01mustVerification 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.delegated
vast-client-js 6.5.0Chromium 141A02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).delegated
vast-client-js 6.5.0Chromium 141A03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.conforms
vast-client-js 6.5.0Chromium 141A04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).delegated
vast-client-js 6.5.0Chromium 141A05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).delegated
vast-client-js 6.5.0Chromium 141S01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.delegated
vast-client-js 6.5.0Chromium 141S02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).delegated
vast-client-js 6.5.0Chromium 141M06mustMacrosReplaces 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.conforms
vast-client-js 6.5.0Chromium 141M07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).conforms
vast-client-js 6.5.0Chromium 141M08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.conforms
vast-client-js 6.5.0Chromium 141M09shouldMacrosFills [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.deviatesraw "ad-id.org%20ABCD%201234%2Cclearcast.co.uk%20CC%2FABC%2F123"
vast-client-js 6.5.0Chromium 141M10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).deviatesASSETURI ad-10s.flv?case=ch0349&ad=in; played ad-10s.webm?case=ch0349&ad=in
vast-client-js 6.5.0Chromium 141M11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.conforms
vast-client-js 6.5.0Chromium 141M12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
vast-client-js 6.5.0Chromium 141P06shouldAd podsPlays all three ads of a pod.delegated
vast-client-js 6.5.0Chromium 141P03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.delegated
vast-client-js 6.5.0Chromium 141P02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).delegated
vast-client-js 6.5.0Chromium 141P05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.delegated
vast-client-js 6.5.0Chromium 141I01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.delegated
vast-client-js 6.5.0Chromium 141I03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.delegated
vast-client-js 6.5.0Chromium 141I02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.delegated
vast-client-js 6.5.0Chromium 141X07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
vast-client-js 6.5.0Chromium 141X08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).conforms
vast-client-js 6.5.0Chromium 141X09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.conforms
vast-client-js 6.5.0Chromium 141X10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
vast-client-js 6.5.0Chromium 141X11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).conforms
vast-client-js 6.5.0Chromium 141X12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
vast-client-js 6.5.0Chromium 141X13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.conforms
vast-client-js 6.5.0Chromium 141X14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
vast-client-js 6.5.0Chromium 141X15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
vast-client-js 6.5.0Chromium 141X16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
vast-client-js 6.5.0Chromium 141R03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
vast-client-js 6.5.0Chromium 141R04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
vast-client-js 6.5.0Chromium 141R05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
vast-client-js 6.5.0Chromium 141R06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).conforms
vast-client-js 6.5.0Chromium 141X17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).conforms
vast-client-js 6.5.0Chromium 141X18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
vast-client-js 6.5.0Chromium 141X19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
vast-client-js 6.5.0Chromium 141P07mustAd 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).deviatesorder p3,p1,p2
video-ad-sdk 4.0.1Chromium 141W01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
video-ad-sdk 4.0.1Chromium 141W02mustWrapper 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).conforms
video-ad-sdk 4.0.1Chromium 141W03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).conforms
video-ad-sdk 4.0.1Chromium 141W04shouldError 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).conforms
video-ad-sdk 4.0.1Chromium 141W05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
video-ad-sdk 4.0.1Chromium 141W06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
video-ad-sdk 4.0.1Chromium 141W07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.deviatescode 502
video-ad-sdk 4.0.1Chromium 141W08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
video-ad-sdk 4.0.1Chromium 141W09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
video-ad-sdk 4.0.1Chromium 141W10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).conforms
video-ad-sdk 4.0.1Chromium 141W11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).deviatesaccepted an ad from non-well-formed XML (x)
video-ad-sdk 4.0.1Chromium 141W12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.conforms
video-ad-sdk 4.0.1Chromium 141W13mustError 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).n/afanned out 401 to inline and both wrappers; the code is graded by E03 (G2)
video-ad-sdk 4.0.1Chromium 141W14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.conforms
video-ad-sdk 4.0.1Chromium 141W15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.conforms
video-ad-sdk 4.0.1Chromium 141W16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.conforms
video-ad-sdk 4.0.1Chromium 141W17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.deviatesno click-through used
video-ad-sdk 4.0.1Chromium 141W18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.conforms
video-ad-sdk 4.0.1Chromium 141W19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.conforms
video-ad-sdk 4.0.1Chromium 141W20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).deviatesresolved none
video-ad-sdk 4.0.1Chromium 141W21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.deviatesresolved p2
video-ad-sdk 4.0.1Chromium 141W22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
video-ad-sdk 4.0.1Chromium 141E01mustError reportingFor a no-ad response, requests the VAST-level Error URI.conforms
video-ad-sdk 4.0.1Chromium 141E02mustError reportingRequests every VAST-level Error URI when several are given.conforms
video-ad-sdk 4.0.1Chromium 141E03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.deviateserr1 401; err2 401
video-ad-sdk 4.0.1Chromium 141E04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.conforms
video-ad-sdk 4.0.1Chromium 141T01mustImpressions and trackingRequests every Impression URI of the ad.conforms
video-ad-sdk 4.0.1Chromium 141T02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.deviatesdispatched about:blank
video-ad-sdk 4.0.1Chromium 141T03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.conforms
video-ad-sdk 4.0.1Chromium 141T04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).conforms
video-ad-sdk 4.0.1Chromium 141T05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.conforms
video-ad-sdk 4.0.1Chromium 141T06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.conforms
video-ad-sdk 4.0.1Chromium 141T07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).deviates10%: 0, 80%: 0
video-ad-sdk 4.0.1Chromium 141T08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.conforms
video-ad-sdk 4.0.1Chromium 141T09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).n/a7 ms
video-ad-sdk 4.0.1Chromium 141M01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.deviates"2855248806" (10 chars)
video-ad-sdk 4.0.1Chromium 141M02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).conforms
video-ad-sdk 4.0.1Chromium 141M03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).deviates"[LIMITADTRACKING]"
video-ad-sdk 4.0.1Chromium 141M04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).conforms
video-ad-sdk 4.0.1Chromium 141M05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).conforms
video-ad-sdk 4.0.1Chromium 141X01shouldXML 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).conforms
video-ad-sdk 4.0.1Chromium 141X02mustXML and parsingIgnores XML comments inside an element when reading its URI.conforms
video-ad-sdk 4.0.1Chromium 141X03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).conforms
video-ad-sdk 4.0.1Chromium 141X04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
video-ad-sdk 4.0.1Chromium 141X05mustXML and parsingAccepts a Creative with two UniversalAdId elements.conforms
video-ad-sdk 4.0.1Chromium 141X06mustXML and parsingAccepts two ClosedCaptionFile elements.conforms
video-ad-sdk 4.0.1Chromium 141P01mustAd 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).deviatesplays p3 first
video-ad-sdk 4.0.1Chromium 141R01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).conforms
video-ad-sdk 4.0.1Chromium 141R02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
video-ad-sdk 4.0.1Chromium 141W23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.conforms
video-ad-sdk 4.0.1Chromium 141E05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).deviatescode undefined,402
video-ad-sdk 4.0.1Chromium 141E06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.deviatescode undefined,402
video-ad-sdk 4.0.1Chromium 141E07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).conforms
video-ad-sdk 4.0.1Chromium 141E08shouldError reportingDoes not request the Error URI when the ad plays without a problem.conforms
video-ad-sdk 4.0.1Chromium 141E09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).deviatescode 401
video-ad-sdk 4.0.1Chromium 141T10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).conforms
video-ad-sdk 4.0.1Chromium 141T11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.conforms
video-ad-sdk 4.0.1Chromium 141T12mustImpressions and trackingFires the pause tracker once when the user pauses.conforms
video-ad-sdk 4.0.1Chromium 141T13mustImpressions and trackingFires the resume tracker once when the user resumes.conforms
video-ad-sdk 4.0.1Chromium 141T14mustImpressions and trackingFires the mute tracker once when the user mutes.conforms
video-ad-sdk 4.0.1Chromium 141T15mustImpressions and trackingFires the unmute tracker when the user unmutes.conforms
video-ad-sdk 4.0.1Chromium 141T23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.conforms
video-ad-sdk 4.0.1Chromium 141T20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.deviates0 times
video-ad-sdk 4.0.1Chromium 141T16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).conforms
video-ad-sdk 4.0.1Chromium 141T17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).conforms
video-ad-sdk 4.0.1Chromium 141T18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.deviatesbefore false, after false, skip 0
video-ad-sdk 4.0.1Chromium 141T19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.conforms
video-ad-sdk 4.0.1Chromium 141T21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).conforms
video-ad-sdk 4.0.1Chromium 141T22shouldImpressions 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.conforms
video-ad-sdk 4.0.1Chromium 141A01mustVerification 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.deviatesnot requested
video-ad-sdk 4.0.1Chromium 141A02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).n/anot requested (see A01)
video-ad-sdk 4.0.1Chromium 141A03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.deviatesnot requested
video-ad-sdk 4.0.1Chromium 141A04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).n/anot requested (see A01)
video-ad-sdk 4.0.1Chromium 141A05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).n/aresource neither fetched nor reported (see A01)
video-ad-sdk 4.0.1Chromium 141S01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.conforms
video-ad-sdk 4.0.1Chromium 141S02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).conforms
video-ad-sdk 4.0.1Chromium 141M06mustMacrosReplaces 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.deviatesnot replaced or implausible: ah="[ADPLAYHEAD]", asi="[ADSERVINGID]", ua="[UNIVERSALADID]", ps="[PODSEQUENCE]", au="[ASSETURI]", bp="[BREAKPOSITION]", ifa="[IFA]", cua="[CLIENTUA]"
video-ad-sdk 4.0.1Chromium 141M07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).deviates"[ADSERVINGID]"
video-ad-sdk 4.0.1Chromium 141M08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.n/aleft as macro (see M06)
video-ad-sdk 4.0.1Chromium 141M09shouldMacrosFills [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.n/aleft as macro (see M06)
video-ad-sdk 4.0.1Chromium 141M10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).n/aleft as macro (see M06)
video-ad-sdk 4.0.1Chromium 141M11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.conforms
video-ad-sdk 4.0.1Chromium 141M12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
video-ad-sdk 4.0.1Chromium 141P06shouldAd podsPlays all three ads of a pod.deviatesplayed p1
video-ad-sdk 4.0.1Chromium 141P03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.n/aplays 1 of 3 pod ads (see P06)
video-ad-sdk 4.0.1Chromium 141P02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).n/athe pod was not continued past its first ad (see P06)
video-ad-sdk 4.0.1Chromium 141P05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.n/athe pod was not continued past its first ad (see P06)
video-ad-sdk 4.0.1Chromium 141I01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.conforms
video-ad-sdk 4.0.1Chromium 141I03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.deviatesnot requested
video-ad-sdk 4.0.1Chromium 141I02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.conforms
video-ad-sdk 4.0.1Chromium 141X07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
video-ad-sdk 4.0.1Chromium 141X08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).conforms
video-ad-sdk 4.0.1Chromium 141X09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.conforms
video-ad-sdk 4.0.1Chromium 141X10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
video-ad-sdk 4.0.1Chromium 141X11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).deviatess="x]]"
video-ad-sdk 4.0.1Chromium 141X12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
video-ad-sdk 4.0.1Chromium 141X13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.conforms
video-ad-sdk 4.0.1Chromium 141X14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
video-ad-sdk 4.0.1Chromium 141X15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
video-ad-sdk 4.0.1Chromium 141X16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
video-ad-sdk 4.0.1Chromium 141R03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
video-ad-sdk 4.0.1Chromium 141R04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
video-ad-sdk 4.0.1Chromium 141R05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
video-ad-sdk 4.0.1Chromium 141R06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).conforms
video-ad-sdk 4.0.1Chromium 141X17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).conforms
video-ad-sdk 4.0.1Chromium 141X18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
video-ad-sdk 4.0.1Chromium 141X19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
video-ad-sdk 4.0.1Chromium 141P07mustAd 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).deviatesplays p3 first
iab-vast-loader 2.5.1, defaultsChromium 141W01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
iab-vast-loader 2.5.1, defaultsChromium 141W02mustWrapper 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).deviatesfetched start.xml; resolved 0; no ad and no error
iab-vast-loader 2.5.1, defaultsChromium 141W03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).conforms
iab-vast-loader 2.5.1, defaultsChromium 141W04shouldError 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).conforms
iab-vast-loader 2.5.1, defaultsChromium 141W05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
iab-vast-loader 2.5.1, defaultsChromium 141W06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
iab-vast-loader 2.5.1, defaultsChromium 141W07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.conforms
iab-vast-loader 2.5.1, defaultsChromium 141W08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
iab-vast-loader 2.5.1, defaultsChromium 141W09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
iab-vast-loader 2.5.1, defaultsChromium 141W10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).delegated
iab-vast-loader 2.5.1, defaultsChromium 141W11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).conforms
iab-vast-loader 2.5.1, defaultsChromium 141W12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.delegated
iab-vast-loader 2.5.1, defaultsChromium 141W13mustError 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).delegated
iab-vast-loader 2.5.1, defaultsChromium 141W14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.delegated
iab-vast-loader 2.5.1, defaultsChromium 141W15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.delegated
iab-vast-loader 2.5.1, defaultsChromium 141W16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.delegated
iab-vast-loader 2.5.1, defaultsChromium 141W17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.delegated
iab-vast-loader 2.5.1, defaultsChromium 141W18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.delegated
iab-vast-loader 2.5.1, defaultsChromium 141W19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.deviatesfollowed the second wrapper to the InLine
iab-vast-loader 2.5.1, defaultsChromium 141W20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).delegated
iab-vast-loader 2.5.1, defaultsChromium 141W21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.delegated
iab-vast-loader 2.5.1, defaultsChromium 141W22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
iab-vast-loader 2.5.1, defaultsChromium 141E01mustError reportingFor a no-ad response, requests the VAST-level Error URI.delegated
iab-vast-loader 2.5.1, defaultsChromium 141E02mustError reportingRequests every VAST-level Error URI when several are given.delegated
iab-vast-loader 2.5.1, defaultsChromium 141E03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.delegated
iab-vast-loader 2.5.1, defaultsChromium 141E04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T01mustImpressions and trackingRequests every Impression URI of the ad.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).delegated
iab-vast-loader 2.5.1, defaultsChromium 141T05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).delegated
iab-vast-loader 2.5.1, defaultsChromium 141T08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).delegated
iab-vast-loader 2.5.1, defaultsChromium 141M01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.delegated
iab-vast-loader 2.5.1, defaultsChromium 141M02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).delegated
iab-vast-loader 2.5.1, defaultsChromium 141M03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).delegated
iab-vast-loader 2.5.1, defaultsChromium 141M04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).delegated
iab-vast-loader 2.5.1, defaultsChromium 141M05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).delegated
iab-vast-loader 2.5.1, defaultsChromium 141X01shouldXML 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).delegated
iab-vast-loader 2.5.1, defaultsChromium 141X02mustXML and parsingIgnores XML comments inside an element when reading its URI.delegated
iab-vast-loader 2.5.1, defaultsChromium 141X03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).delegated
iab-vast-loader 2.5.1, defaultsChromium 141X04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
iab-vast-loader 2.5.1, defaultsChromium 141X05mustXML and parsingAccepts a Creative with two UniversalAdId elements.deviatesrejected: Multiple values for Creative.UniversalAdId
iab-vast-loader 2.5.1, defaultsChromium 141X06mustXML and parsingAccepts two ClosedCaptionFile elements.deviatesrejected: Multiple values for ClosedCaptionFiles.ClosedCaptionFile
iab-vast-loader 2.5.1, defaultsChromium 141P01mustAd 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).conforms
iab-vast-loader 2.5.1, defaultsChromium 141R01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).conforms
iab-vast-loader 2.5.1, defaultsChromium 141R02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
iab-vast-loader 2.5.1, defaultsChromium 141W23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.delegated
iab-vast-loader 2.5.1, defaultsChromium 141E05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).delegated
iab-vast-loader 2.5.1, defaultsChromium 141E06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.delegated
iab-vast-loader 2.5.1, defaultsChromium 141E07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).delegated
iab-vast-loader 2.5.1, defaultsChromium 141E08shouldError reportingDoes not request the Error URI when the ad plays without a problem.delegated
iab-vast-loader 2.5.1, defaultsChromium 141E09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).delegated
iab-vast-loader 2.5.1, defaultsChromium 141T10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).delegated
iab-vast-loader 2.5.1, defaultsChromium 141T11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T12mustImpressions and trackingFires the pause tracker once when the user pauses.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T13mustImpressions and trackingFires the resume tracker once when the user resumes.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T14mustImpressions and trackingFires the mute tracker once when the user mutes.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T15mustImpressions and trackingFires the unmute tracker when the user unmutes.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).delegated
iab-vast-loader 2.5.1, defaultsChromium 141T17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).delegated
iab-vast-loader 2.5.1, defaultsChromium 141T18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.delegated
iab-vast-loader 2.5.1, defaultsChromium 141T21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).delegated
iab-vast-loader 2.5.1, defaultsChromium 141T22shouldImpressions 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.delegated
iab-vast-loader 2.5.1, defaultsChromium 141A01mustVerification 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.delegated
iab-vast-loader 2.5.1, defaultsChromium 141A02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).delegated
iab-vast-loader 2.5.1, defaultsChromium 141A03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.delegated
iab-vast-loader 2.5.1, defaultsChromium 141A04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).delegated
iab-vast-loader 2.5.1, defaultsChromium 141A05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).delegated
iab-vast-loader 2.5.1, defaultsChromium 141S01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.delegated
iab-vast-loader 2.5.1, defaultsChromium 141S02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).delegated
iab-vast-loader 2.5.1, defaultsChromium 141M06mustMacrosReplaces 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.delegated
iab-vast-loader 2.5.1, defaultsChromium 141M07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).delegated
iab-vast-loader 2.5.1, defaultsChromium 141M08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.delegated
iab-vast-loader 2.5.1, defaultsChromium 141M09shouldMacrosFills [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.delegated
iab-vast-loader 2.5.1, defaultsChromium 141M10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).delegated
iab-vast-loader 2.5.1, defaultsChromium 141M11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.delegated
iab-vast-loader 2.5.1, defaultsChromium 141M12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
iab-vast-loader 2.5.1, defaultsChromium 141P06shouldAd podsPlays all three ads of a pod.delegated
iab-vast-loader 2.5.1, defaultsChromium 141P03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.delegated
iab-vast-loader 2.5.1, defaultsChromium 141P02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).delegated
iab-vast-loader 2.5.1, defaultsChromium 141P05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.delegated
iab-vast-loader 2.5.1, defaultsChromium 141I01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.delegated
iab-vast-loader 2.5.1, defaultsChromium 141I03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.delegated
iab-vast-loader 2.5.1, defaultsChromium 141I02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.delegated
iab-vast-loader 2.5.1, defaultsChromium 141X07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
iab-vast-loader 2.5.1, defaultsChromium 141X08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).delegated
iab-vast-loader 2.5.1, defaultsChromium 141X09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.delegated
iab-vast-loader 2.5.1, defaultsChromium 141X10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
iab-vast-loader 2.5.1, defaultsChromium 141X11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).delegated
iab-vast-loader 2.5.1, defaultsChromium 141X12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
iab-vast-loader 2.5.1, defaultsChromium 141X13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.delegated
iab-vast-loader 2.5.1, defaultsChromium 141X14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
iab-vast-loader 2.5.1, defaultsChromium 141X15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
iab-vast-loader 2.5.1, defaultsChromium 141X16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
iab-vast-loader 2.5.1, defaultsChromium 141R03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
iab-vast-loader 2.5.1, defaultsChromium 141R04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
iab-vast-loader 2.5.1, defaultsChromium 141R05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
iab-vast-loader 2.5.1, defaultsChromium 141R06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).delegated
iab-vast-loader 2.5.1, defaultsChromium 141X17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).delegated
iab-vast-loader 2.5.1, defaultsChromium 141X18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
iab-vast-loader 2.5.1, defaultsChromium 141X19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
iab-vast-loader 2.5.1, defaultsChromium 141P07mustAd 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).deviatesfetched the pod and reported no ad (303): VAST error 303: No ads VAST response after one or more Wrapp
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W02mustWrapper 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).conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W04shouldError 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).conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W13mustError 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).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.deviatesfollowed the second wrapper to the InLine
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141E01mustError reportingFor a no-ad response, requests the VAST-level Error URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141E02mustError reportingRequests every VAST-level Error URI when several are given.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141E03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141E04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T01mustImpressions and trackingRequests every Impression URI of the ad.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X01shouldXML 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).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X02mustXML and parsingIgnores XML comments inside an element when reading its URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X05mustXML and parsingAccepts a Creative with two UniversalAdId elements.deviatesrejected: Multiple values for Creative.UniversalAdId
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X06mustXML and parsingAccepts two ClosedCaptionFile elements.deviatesrejected: Multiple values for ClosedCaptionFiles.ClosedCaptionFile
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141P01mustAd 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).conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141R01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141R02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141W23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141E05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141E06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141E07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141E08shouldError reportingDoes not request the Error URI when the ad plays without a problem.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141E09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T12mustImpressions and trackingFires the pause tracker once when the user pauses.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T13mustImpressions and trackingFires the resume tracker once when the user resumes.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T14mustImpressions and trackingFires the mute tracker once when the user mutes.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T15mustImpressions and trackingFires the unmute tracker when the user unmutes.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141T22shouldImpressions 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.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141A01mustVerification 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.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141A02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141A03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141A04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141A05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141S01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141S02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M06mustMacrosReplaces 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.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M09shouldMacrosFills [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.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141M12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141P06shouldAd podsPlays all three ads of a pod.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141P03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141P02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141P05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141I01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141I03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141I02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141R03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141R04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141R05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141R06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).delegated
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141X19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
iab-vast-loader 2.5.1, noSingleAdPodsChromium 141P07mustAd 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).deviatesfetched the pod and reported no ad (303): VAST error 303: No ads VAST response after one or more Wrapp
Shaka Player 5.2.12Chromium 141W01mustWrapper resolutionFollows a Wrapper to its InLine ad.deviatesfetched start.xml; resolved 0
Shaka Player 5.2.12Chromium 141W02mustWrapper 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).deviatesfetched start.xml; resolved 0; no ad and no error
Shaka Player 5.2.12Chromium 141W03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W04shouldError 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).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W08mustError reportingWhen the VASTAdTagURI times out, determines error 301.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W13mustError 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).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141E01mustError reportingFor a no-ad response, requests the VAST-level Error URI.deviatesnot requested
Shaka Player 5.2.12Chromium 141E02mustError reportingRequests every VAST-level Error URI when several are given.deviateserr1 0, err2 0
Shaka Player 5.2.12Chromium 141E03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.deviateserr1 [ERRORCODE]; err2 [ERRORCODE]
Shaka Player 5.2.12Chromium 141E04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141T01mustImpressions and trackingRequests every Impression URI of the ad.conforms
Shaka Player 5.2.12Chromium 141T02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.conforms
Shaka Player 5.2.12Chromium 141T03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.conforms
Shaka Player 5.2.12Chromium 141T04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).conforms
Shaka Player 5.2.12Chromium 141T05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.deviatesfired 0 times
Shaka Player 5.2.12Chromium 141T06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.deviatesfired 0 times
Shaka Player 5.2.12Chromium 141T07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).deviates10%: 0, 80%: 0
Shaka Player 5.2.12Chromium 141T08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.n/aShaka exposes no API to stop an interstitial at a given point or to click it (partial)
Shaka Player 5.2.12Chromium 141T09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141M01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.deviates"[CACHEBUSTING]" (14 chars)
Shaka Player 5.2.12Chromium 141M02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).deviates"[TIMESTAMP]"
Shaka Player 5.2.12Chromium 141M03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).deviates"[LIMITADTRACKING]"
Shaka Player 5.2.12Chromium 141M04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).n/aTIMESTAMP left unreplaced (see M02)
Shaka Player 5.2.12Chromium 141M05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).conforms
Shaka Player 5.2.12Chromium 141X01shouldXML 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).n/arequested, but the client-side URL was not observable
Shaka Player 5.2.12Chromium 141X02mustXML and parsingIgnores XML comments inside an element when reading its URI.conforms
Shaka Player 5.2.12Chromium 141X03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).conforms
Shaka Player 5.2.12Chromium 141X04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
Shaka Player 5.2.12Chromium 141X05mustXML and parsingAccepts a Creative with two UniversalAdId elements.conforms
Shaka Player 5.2.12Chromium 141X06mustXML and parsingAccepts two ClosedCaptionFile elements.conforms
Shaka Player 5.2.12Chromium 141P01mustAd 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).deviatesorder p3,p1,p2
Shaka Player 5.2.12Chromium 141R01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141R02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141W23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141E05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).deviatescode [ERRORCODE]
Shaka Player 5.2.12Chromium 141E06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.deviatescode [ERRORCODE]
Shaka Player 5.2.12Chromium 141E07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).deviatesError URI not requested
Shaka Player 5.2.12Chromium 141E08shouldError reportingDoes not request the Error URI when the ad plays without a problem.conforms
Shaka Player 5.2.12Chromium 141E09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).conforms
Shaka Player 5.2.12Chromium 141T10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).deviatesimpression requested for an ad that never played
Shaka Player 5.2.12Chromium 141T11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.conforms
Shaka Player 5.2.12Chromium 141T12mustImpressions and trackingFires the pause tracker once when the user pauses.conforms
Shaka Player 5.2.12Chromium 141T13mustImpressions and trackingFires the resume tracker once when the user resumes.conforms
Shaka Player 5.2.12Chromium 141T14mustImpressions and trackingFires the mute tracker once when the user mutes.conforms
Shaka Player 5.2.12Chromium 141T15mustImpressions and trackingFires the unmute tracker when the user unmutes.conforms
Shaka Player 5.2.12Chromium 141T23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.deviatesunmute fired 2 times
Shaka Player 5.2.12Chromium 141T20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.deviates0 times
Shaka Player 5.2.12Chromium 141T16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).conforms
Shaka Player 5.2.12Chromium 141T17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).conforms
Shaka Player 5.2.12Chromium 141T18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.deviatesbefore false, after false, skip 0
Shaka Player 5.2.12Chromium 141T19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.n/ano progress tracker fired (see T05)
Shaka Player 5.2.12Chromium 141T21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).deviatesnot fired
Shaka Player 5.2.12Chromium 141T22shouldImpressions 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.conforms
Shaka Player 5.2.12Chromium 141A01mustVerification 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.deviatesnot requested
Shaka Player 5.2.12Chromium 141A02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).n/anot requested (see A01)
Shaka Player 5.2.12Chromium 141A03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141A04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).n/anot requested (see A01)
Shaka Player 5.2.12Chromium 141A05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).n/aresource neither fetched nor reported (see A01)
Shaka Player 5.2.12Chromium 141S01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.deviateschose http://127.0.0.1:41045/media/ad-10s.flv?case=ch0337&ad=in
Shaka Player 5.2.12Chromium 141S02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).conforms
Shaka Player 5.2.12Chromium 141M06mustMacrosReplaces 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.deviatesnot replaced or implausible: ah="[ADPLAYHEAD]", asi="[ADSERVINGID]", ua="[UNIVERSALADID]", ps="[PODSEQUENCE]", au="[ASSETURI]", bp="[BREAKPOSITION]", ifa="[IFA]", cua="[CLIENTUA]"
Shaka Player 5.2.12Chromium 141M07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).deviates"[ADSERVINGID]"
Shaka Player 5.2.12Chromium 141M08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.n/aleft as macro (see M06)
Shaka Player 5.2.12Chromium 141M09shouldMacrosFills [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.n/aleft as macro (see M06)
Shaka Player 5.2.12Chromium 141M10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).n/aleft as macro (see M06)
Shaka Player 5.2.12Chromium 141M11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
Shaka Player 5.2.12Chromium 141M12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141P06shouldAd podsPlays all three ads of a pod.conforms
Shaka Player 5.2.12Chromium 141P03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.deviatesmisattributed: p1 imp 1 complete 0; p2 imp 1 complete 1; p3 imp 1 complete 2
Shaka Player 5.2.12Chromium 141P02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).conforms
Shaka Player 5.2.12Chromium 141P05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.deviatess1 played after p3
Shaka Player 5.2.12Chromium 141I01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.deviatesnot requested
Shaka Player 5.2.12Chromium 141I03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.deviatesnot requested
Shaka Player 5.2.12Chromium 141I02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.n/aicon not displayed (see I01)
Shaka Player 5.2.12Chromium 141X07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141X08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).conforms
Shaka Player 5.2.12Chromium 141X09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.conforms
Shaka Player 5.2.12Chromium 141X10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
Shaka Player 5.2.12Chromium 141X11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).conforms
Shaka Player 5.2.12Chromium 141X12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
Shaka Player 5.2.12Chromium 141X13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.conforms
Shaka Player 5.2.12Chromium 141X14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
Shaka Player 5.2.12Chromium 141X15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
Shaka Player 5.2.12Chromium 141X16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141R03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141R04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
Shaka Player 5.2.12Chromium 141R05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
Shaka Player 5.2.12Chromium 141R06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).conforms
Shaka Player 5.2.12Chromium 141X17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).conforms
Shaka Player 5.2.12Chromium 141X18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141X19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).n/athe client does not follow Wrappers (see W01)
Shaka Player 5.2.12Chromium 141P07mustAd 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).n/athe client does not follow Wrappers (see W01)
rmp-vast 17.2.0, defaultsChromium 141W01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
rmp-vast 17.2.0, defaultsChromium 141W02mustWrapper 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).conforms
rmp-vast 17.2.0, defaultsChromium 141W03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).deviatesstopped after 4 documents; codes 302
rmp-vast 17.2.0, defaultsChromium 141W04shouldError 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).conforms
rmp-vast 17.2.0, defaultsChromium 141W05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
rmp-vast 17.2.0, defaultsChromium 141W06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
rmp-vast 17.2.0, defaultsChromium 141W07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.conforms
rmp-vast 17.2.0, defaultsChromium 141W08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
rmp-vast 17.2.0, defaultsChromium 141W09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
rmp-vast 17.2.0, defaultsChromium 141W10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).conforms
rmp-vast 17.2.0, defaultsChromium 141W11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).deviatescode 303
rmp-vast 17.2.0, defaultsChromium 141W12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.conforms
rmp-vast 17.2.0, defaultsChromium 141W13mustError 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).conforms
rmp-vast 17.2.0, defaultsChromium 141W14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.conforms
rmp-vast 17.2.0, defaultsChromium 141W15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.conforms
rmp-vast 17.2.0, defaultsChromium 141W16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.conforms
rmp-vast 17.2.0, defaultsChromium 141W17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.conforms
rmp-vast 17.2.0, defaultsChromium 141W18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.conforms
rmp-vast 17.2.0, defaultsChromium 141W19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.conforms
rmp-vast 17.2.0, defaultsChromium 141W20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).deviatesresolved p2,p1,s1
rmp-vast 17.2.0, defaultsChromium 141W21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.deviatesresolved p2,p1,s1
rmp-vast 17.2.0, defaultsChromium 141W22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
rmp-vast 17.2.0, defaultsChromium 141E01mustError reportingFor a no-ad response, requests the VAST-level Error URI.conforms
rmp-vast 17.2.0, defaultsChromium 141E02mustError reportingRequests every VAST-level Error URI when several are given.conforms
rmp-vast 17.2.0, defaultsChromium 141E03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.conforms
rmp-vast 17.2.0, defaultsChromium 141E04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.conforms
rmp-vast 17.2.0, defaultsChromium 141T01mustImpressions and trackingRequests every Impression URI of the ad.conforms
rmp-vast 17.2.0, defaultsChromium 141T02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.deviatesdispatched about:blank
rmp-vast 17.2.0, defaultsChromium 141T03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.conforms
rmp-vast 17.2.0, defaultsChromium 141T04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).conforms
rmp-vast 17.2.0, defaultsChromium 141T05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.conforms
rmp-vast 17.2.0, defaultsChromium 141T06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.conforms
rmp-vast 17.2.0, defaultsChromium 141T07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).conforms
rmp-vast 17.2.0, defaultsChromium 141T08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.conforms
rmp-vast 17.2.0, defaultsChromium 141T09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).n/a0 ms
rmp-vast 17.2.0, defaultsChromium 141M01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.deviates"cvAILwRW" (8 chars)
rmp-vast 17.2.0, defaultsChromium 141M02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).conforms
rmp-vast 17.2.0, defaultsChromium 141M03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).deviates"[LIMITADTRACKING]"
rmp-vast 17.2.0, defaultsChromium 141M04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).conforms
rmp-vast 17.2.0, defaultsChromium 141M05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).conforms
rmp-vast 17.2.0, defaultsChromium 141X01shouldXML 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).conforms
rmp-vast 17.2.0, defaultsChromium 141X02mustXML and parsingIgnores XML comments inside an element when reading its URI.conforms
rmp-vast 17.2.0, defaultsChromium 141X03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).conforms
rmp-vast 17.2.0, defaultsChromium 141X04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
rmp-vast 17.2.0, defaultsChromium 141X05mustXML and parsingAccepts a Creative with two UniversalAdId elements.conforms
rmp-vast 17.2.0, defaultsChromium 141X06mustXML and parsingAccepts two ClosedCaptionFile elements.conforms
rmp-vast 17.2.0, defaultsChromium 141P01mustAd 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).conforms
rmp-vast 17.2.0, defaultsChromium 141R01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).deviatesuncaught: Uncaught Error: URLHandler: Request timed out after 2000 ms (408) | URLHandler: Request timed out after 2000 ms (408)
rmp-vast 17.2.0, defaultsChromium 141R02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
rmp-vast 17.2.0, defaultsChromium 141W23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.deviatesresolved none; fetched start.xml,noad.xml; error aderror 303: No VAST response after one or more Wrappers.
rmp-vast 17.2.0, defaultsChromium 141E05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).conforms
rmp-vast 17.2.0, defaultsChromium 141E06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.deviatescode 401
rmp-vast 17.2.0, defaultsChromium 141E07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).conforms
rmp-vast 17.2.0, defaultsChromium 141E08shouldError reportingDoes not request the Error URI when the ad plays without a problem.conforms
rmp-vast 17.2.0, defaultsChromium 141E09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).conforms
rmp-vast 17.2.0, defaultsChromium 141T10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).conforms
rmp-vast 17.2.0, defaultsChromium 141T11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.conforms
rmp-vast 17.2.0, defaultsChromium 141T12mustImpressions and trackingFires the pause tracker once when the user pauses.conforms
rmp-vast 17.2.0, defaultsChromium 141T13mustImpressions and trackingFires the resume tracker once when the user resumes.deviates2 times
rmp-vast 17.2.0, defaultsChromium 141T14mustImpressions and trackingFires the mute tracker once when the user mutes.conforms
rmp-vast 17.2.0, defaultsChromium 141T15mustImpressions and trackingFires the unmute tracker when the user unmutes.conforms
rmp-vast 17.2.0, defaultsChromium 141T23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.deviatesunmute fired 2 times
rmp-vast 17.2.0, defaultsChromium 141T20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.conforms
rmp-vast 17.2.0, defaultsChromium 141T16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).conforms
rmp-vast 17.2.0, defaultsChromium 141T17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).conforms
rmp-vast 17.2.0, defaultsChromium 141T18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.conforms
rmp-vast 17.2.0, defaultsChromium 141T19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.conforms
rmp-vast 17.2.0, defaultsChromium 141T21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).deviatesnot fired
rmp-vast 17.2.0, defaultsChromium 141T22shouldImpressions 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.conforms
rmp-vast 17.2.0, defaultsChromium 141A01mustVerification 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.deviatesnot requested
rmp-vast 17.2.0, defaultsChromium 141A02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).n/anot requested (see A01)
rmp-vast 17.2.0, defaultsChromium 141A03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.deviatesnot requested
rmp-vast 17.2.0, defaultsChromium 141A04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).n/anot requested (see A01)
rmp-vast 17.2.0, defaultsChromium 141A05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).n/aresource neither fetched nor reported (see A01)
rmp-vast 17.2.0, defaultsChromium 141S01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.conforms
rmp-vast 17.2.0, defaultsChromium 141S02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).n/anot supported (optional); reported 401
rmp-vast 17.2.0, defaultsChromium 141M06mustMacrosReplaces 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.deviatesnot replaced or implausible: ps="[PODSEQUENCE]", ifa="[IFA]", cua="[CLIENTUA]"
rmp-vast 17.2.0, defaultsChromium 141M07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).conforms
rmp-vast 17.2.0, defaultsChromium 141M08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.conforms
rmp-vast 17.2.0, defaultsChromium 141M09shouldMacrosFills [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.deviatesraw "%2Cad-id.org%20ABCD%201234%2Cclearcast.co.uk%20CC%2FABC%2F123"
rmp-vast 17.2.0, defaultsChromium 141M10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).conforms
rmp-vast 17.2.0, defaultsChromium 141M11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
rmp-vast 17.2.0, defaultsChromium 141M12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
rmp-vast 17.2.0, defaultsChromium 141P06shouldAd podsPlays all three ads of a pod.conforms
rmp-vast 17.2.0, defaultsChromium 141P03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.conforms
rmp-vast 17.2.0, defaultsChromium 141P02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).conforms
rmp-vast 17.2.0, defaultsChromium 141P05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.deviatesstand-alone ad not played; moved to p3
rmp-vast 17.2.0, defaultsChromium 141I01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.conforms
rmp-vast 17.2.0, defaultsChromium 141I03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.deviatesrequested 15 ms after start, before the 1 s offset
rmp-vast 17.2.0, defaultsChromium 141I02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.conforms
rmp-vast 17.2.0, defaultsChromium 141X07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
rmp-vast 17.2.0, defaultsChromium 141X08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).conforms
rmp-vast 17.2.0, defaultsChromium 141X09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.conforms
rmp-vast 17.2.0, defaultsChromium 141X10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
rmp-vast 17.2.0, defaultsChromium 141X11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).conforms
rmp-vast 17.2.0, defaultsChromium 141X12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
rmp-vast 17.2.0, defaultsChromium 141X13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.conforms
rmp-vast 17.2.0, defaultsChromium 141X14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
rmp-vast 17.2.0, defaultsChromium 141X15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
rmp-vast 17.2.0, defaultsChromium 141X16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
rmp-vast 17.2.0, defaultsChromium 141R03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
rmp-vast 17.2.0, defaultsChromium 141R04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
rmp-vast 17.2.0, defaultsChromium 141R05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
rmp-vast 17.2.0, defaultsChromium 141R06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).conforms
rmp-vast 17.2.0, defaultsChromium 141X17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).conforms
rmp-vast 17.2.0, defaultsChromium 141X18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
rmp-vast 17.2.0, defaultsChromium 141X19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
rmp-vast 17.2.0, defaultsChromium 141P07mustAd 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).deviatesorder p3,p1,p2
rmp-vast 17.2.0, omidSupportChromium 141W01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
rmp-vast 17.2.0, omidSupportChromium 141W02mustWrapper 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).conforms
rmp-vast 17.2.0, omidSupportChromium 141W03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).deviatesstopped after 4 documents; codes 302
rmp-vast 17.2.0, omidSupportChromium 141W04shouldError 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).conforms
rmp-vast 17.2.0, omidSupportChromium 141W05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
rmp-vast 17.2.0, omidSupportChromium 141W06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
rmp-vast 17.2.0, omidSupportChromium 141W07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.conforms
rmp-vast 17.2.0, omidSupportChromium 141W08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
rmp-vast 17.2.0, omidSupportChromium 141W09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
rmp-vast 17.2.0, omidSupportChromium 141W10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).conforms
rmp-vast 17.2.0, omidSupportChromium 141W11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).deviatescode 303
rmp-vast 17.2.0, omidSupportChromium 141W12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.conforms
rmp-vast 17.2.0, omidSupportChromium 141W13mustError 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).conforms
rmp-vast 17.2.0, omidSupportChromium 141W14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.conforms
rmp-vast 17.2.0, omidSupportChromium 141W15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.conforms
rmp-vast 17.2.0, omidSupportChromium 141W16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.conforms
rmp-vast 17.2.0, omidSupportChromium 141W17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.conforms
rmp-vast 17.2.0, omidSupportChromium 141W18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.conforms
rmp-vast 17.2.0, omidSupportChromium 141W19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.conforms
rmp-vast 17.2.0, omidSupportChromium 141W20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).deviatesresolved p2,p1,s1
rmp-vast 17.2.0, omidSupportChromium 141W21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.deviatesresolved p2,p1,s1
rmp-vast 17.2.0, omidSupportChromium 141W22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
rmp-vast 17.2.0, omidSupportChromium 141E01mustError reportingFor a no-ad response, requests the VAST-level Error URI.conforms
rmp-vast 17.2.0, omidSupportChromium 141E02mustError reportingRequests every VAST-level Error URI when several are given.conforms
rmp-vast 17.2.0, omidSupportChromium 141E03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.conforms
rmp-vast 17.2.0, omidSupportChromium 141E04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.conforms
rmp-vast 17.2.0, omidSupportChromium 141T01mustImpressions and trackingRequests every Impression URI of the ad.conforms
rmp-vast 17.2.0, omidSupportChromium 141T02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.deviatesdispatched about:blank
rmp-vast 17.2.0, omidSupportChromium 141T03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.conforms
rmp-vast 17.2.0, omidSupportChromium 141T04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).conforms
rmp-vast 17.2.0, omidSupportChromium 141T05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.conforms
rmp-vast 17.2.0, omidSupportChromium 141T06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.conforms
rmp-vast 17.2.0, omidSupportChromium 141T07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).conforms
rmp-vast 17.2.0, omidSupportChromium 141T08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.conforms
rmp-vast 17.2.0, omidSupportChromium 141T09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).n/a1 ms
rmp-vast 17.2.0, omidSupportChromium 141M01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.deviates"Pl0Z4sfx" (8 chars)
rmp-vast 17.2.0, omidSupportChromium 141M02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).conforms
rmp-vast 17.2.0, omidSupportChromium 141M03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).deviates"[LIMITADTRACKING]"
rmp-vast 17.2.0, omidSupportChromium 141M04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).conforms
rmp-vast 17.2.0, omidSupportChromium 141M05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).conforms
rmp-vast 17.2.0, omidSupportChromium 141X01shouldXML 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).conforms
rmp-vast 17.2.0, omidSupportChromium 141X02mustXML and parsingIgnores XML comments inside an element when reading its URI.conforms
rmp-vast 17.2.0, omidSupportChromium 141X03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).conforms
rmp-vast 17.2.0, omidSupportChromium 141X04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
rmp-vast 17.2.0, omidSupportChromium 141X05mustXML and parsingAccepts a Creative with two UniversalAdId elements.conforms
rmp-vast 17.2.0, omidSupportChromium 141X06mustXML and parsingAccepts two ClosedCaptionFile elements.conforms
rmp-vast 17.2.0, omidSupportChromium 141P01mustAd 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).conforms
rmp-vast 17.2.0, omidSupportChromium 141R01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).deviatesuncaught: Uncaught Error: URLHandler: Request timed out after 2000 ms (408) | URLHandler: Request timed out after 2000 ms (408)
rmp-vast 17.2.0, omidSupportChromium 141R02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
rmp-vast 17.2.0, omidSupportChromium 141W23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.deviatesresolved none; fetched start.xml,noad.xml; error aderror 303: No VAST response after one or more Wrappers.
rmp-vast 17.2.0, omidSupportChromium 141E05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).conforms
rmp-vast 17.2.0, omidSupportChromium 141E06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.deviatescode 401
rmp-vast 17.2.0, omidSupportChromium 141E07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).conforms
rmp-vast 17.2.0, omidSupportChromium 141E08shouldError reportingDoes not request the Error URI when the ad plays without a problem.conforms
rmp-vast 17.2.0, omidSupportChromium 141E09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).conforms
rmp-vast 17.2.0, omidSupportChromium 141T10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).conforms
rmp-vast 17.2.0, omidSupportChromium 141T11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.conforms
rmp-vast 17.2.0, omidSupportChromium 141T12mustImpressions and trackingFires the pause tracker once when the user pauses.conforms
rmp-vast 17.2.0, omidSupportChromium 141T13mustImpressions and trackingFires the resume tracker once when the user resumes.deviates2 times
rmp-vast 17.2.0, omidSupportChromium 141T14mustImpressions and trackingFires the mute tracker once when the user mutes.conforms
rmp-vast 17.2.0, omidSupportChromium 141T15mustImpressions and trackingFires the unmute tracker when the user unmutes.conforms
rmp-vast 17.2.0, omidSupportChromium 141T23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.deviatesunmute fired 2 times
rmp-vast 17.2.0, omidSupportChromium 141T20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.conforms
rmp-vast 17.2.0, omidSupportChromium 141T16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).conforms
rmp-vast 17.2.0, omidSupportChromium 141T17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).conforms
rmp-vast 17.2.0, omidSupportChromium 141T18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.conforms
rmp-vast 17.2.0, omidSupportChromium 141T19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.conforms
rmp-vast 17.2.0, omidSupportChromium 141T21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).deviatesnot fired
rmp-vast 17.2.0, omidSupportChromium 141T22shouldImpressions 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.conforms
rmp-vast 17.2.0, omidSupportChromium 141A01mustVerification 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.conforms
rmp-vast 17.2.0, omidSupportChromium 141A02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).conforms
rmp-vast 17.2.0, omidSupportChromium 141A03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.conforms
rmp-vast 17.2.0, omidSupportChromium 141A04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).conforms
rmp-vast 17.2.0, omidSupportChromium 141A05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).n/aresource neither fetched nor reported (see A01)
rmp-vast 17.2.0, omidSupportChromium 141S01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.conforms
rmp-vast 17.2.0, omidSupportChromium 141S02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).n/anot supported (optional); reported 401
rmp-vast 17.2.0, omidSupportChromium 141M06mustMacrosReplaces 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.deviatesnot replaced or implausible: ps="[PODSEQUENCE]", ifa="[IFA]", cua="[CLIENTUA]"
rmp-vast 17.2.0, omidSupportChromium 141M07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).conforms
rmp-vast 17.2.0, omidSupportChromium 141M08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.conforms
rmp-vast 17.2.0, omidSupportChromium 141M09shouldMacrosFills [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.deviatesraw "%2Cad-id.org%20ABCD%201234%2Cclearcast.co.uk%20CC%2FABC%2F123"
rmp-vast 17.2.0, omidSupportChromium 141M10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).conforms
rmp-vast 17.2.0, omidSupportChromium 141M11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
rmp-vast 17.2.0, omidSupportChromium 141M12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.deviatescb "[CACHEBUSTING]", ts "[TIMESTAMP]"
rmp-vast 17.2.0, omidSupportChromium 141P06shouldAd podsPlays all three ads of a pod.conforms
rmp-vast 17.2.0, omidSupportChromium 141P03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.conforms
rmp-vast 17.2.0, omidSupportChromium 141P02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).conforms
rmp-vast 17.2.0, omidSupportChromium 141P05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.deviatesstand-alone ad not played; moved to p3
rmp-vast 17.2.0, omidSupportChromium 141I01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.conforms
rmp-vast 17.2.0, omidSupportChromium 141I03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.deviatesrequested 19 ms after start, before the 1 s offset
rmp-vast 17.2.0, omidSupportChromium 141I02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.conforms
rmp-vast 17.2.0, omidSupportChromium 141X07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
rmp-vast 17.2.0, omidSupportChromium 141X08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).conforms
rmp-vast 17.2.0, omidSupportChromium 141X09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.conforms
rmp-vast 17.2.0, omidSupportChromium 141X10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
rmp-vast 17.2.0, omidSupportChromium 141X11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).conforms
rmp-vast 17.2.0, omidSupportChromium 141X12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
rmp-vast 17.2.0, omidSupportChromium 141X13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.conforms
rmp-vast 17.2.0, omidSupportChromium 141X14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
rmp-vast 17.2.0, omidSupportChromium 141X15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
rmp-vast 17.2.0, omidSupportChromium 141X16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
rmp-vast 17.2.0, omidSupportChromium 141R03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
rmp-vast 17.2.0, omidSupportChromium 141R04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
rmp-vast 17.2.0, omidSupportChromium 141R05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
rmp-vast 17.2.0, omidSupportChromium 141R06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).conforms
rmp-vast 17.2.0, omidSupportChromium 141X17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).conforms
rmp-vast 17.2.0, omidSupportChromium 141X18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
rmp-vast 17.2.0, omidSupportChromium 141X19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
rmp-vast 17.2.0, omidSupportChromium 141P07mustAd 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).deviatesorder p3,p1,p2
Google IMA 3.794.0Chromium 141W01mustWrapper resolutionFollows a Wrapper to its InLine ad.conforms
Google IMA 3.794.0Chromium 141W02mustWrapper 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).conforms
Google IMA 3.794.0Chromium 141W03mustWrapper resolutionAccepts a chain of five Wrappers before the InLine ad (players are required to accept five).deviatesstopped after 5 documents; codes 302
Google IMA 3.794.0Chromium 141W04shouldError 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).conforms
Google IMA 3.794.0Chromium 141W05shouldWrapper resolutionTerminates a Wrapper that points to itself (stops requesting it).conforms
Google IMA 3.794.0Chromium 141W06shouldError reportingReports 302 (wrapper limit) for a self-referencing Wrapper loop.conforms
Google IMA 3.794.0Chromium 141W07mustError reportingWhen the VASTAdTagURI is unavailable (HTTP 404), determines error 301.conforms
Google IMA 3.794.0Chromium 141W08mustError reportingWhen the VASTAdTagURI times out, determines error 301.conforms
Google IMA 3.794.0Chromium 141W09shouldError reportingWhen a Wrapper leads to a no-ad response and the player determines a code, the code is 303.conforms
Google IMA 3.794.0Chromium 141W10mustError reportingRequests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE]).conforms
Google IMA 3.794.0Chromium 141W11mustError reportingWhen the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it).conforms
Google IMA 3.794.0Chromium 141W12mustError reportingRequests the Wrapper Error URI when its VASTAdTagURI fails.conforms
Google IMA 3.794.0Chromium 141W13mustError 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).conforms
Google IMA 3.794.0Chromium 141W14mustImpressions and trackingAt impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it.conforms
Google IMA 3.794.0Chromium 141W15mustImpressions and trackingFires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones.conforms
Google IMA 3.794.0Chromium 141W16mustImpressions and trackingWhen both the InLine and a Wrapper carry a ClickThrough, the InLine one is used.conforms
Google IMA 3.794.0Chromium 141W17mustImpressions and trackingWhen the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used.deviatesno click-through used
Google IMA 3.794.0Chromium 141W18mustImpressions and trackingOn a click, requests the ClickTracking URIs of the InLine and of every Wrapper.conforms
Google IMA 3.794.0Chromium 141W19shouldWrapper resolutionWith followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed.conforms
Google IMA 3.794.0Chromium 141W20shouldWrapper resolutionWith allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped).deviatesresolved none
Google IMA 3.794.0Chromium 141W21shouldWrapper resolutionWithout the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used.deviatesresolved none
Google IMA 3.794.0Chromium 141W22mayWrapper resolutionOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205.n/anot implemented (optional): ad accepted
Google IMA 3.794.0Chromium 141E01mustError reportingFor a no-ad response, requests the VAST-level Error URI.conforms
Google IMA 3.794.0Chromium 141E02mustError reportingRequests every VAST-level Error URI when several are given.conforms
Google IMA 3.794.0Chromium 141E03mustError reportingWith no supported MediaFile, requests every InLine Error URI with 403.conforms
Google IMA 3.794.0Chromium 141E04mustError reportingReplaces [ERRORCODE] in Error URIs with a numeric code.conforms
Google IMA 3.794.0Chromium 141T01mustImpressions and trackingRequests every Impression URI of the ad.conforms
Google IMA 3.794.0Chromium 141T02shouldImpressions and trackingDoes not dispatch an Impression whose URI is about:blank.conforms
Google IMA 3.794.0Chromium 141T03mustImpressions and trackingFires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order.conforms
Google IMA 3.794.0Chromium 141T04mustImpressions and trackingFires every Tracking element for the same event (two start trackers for two parties).conforms
Google IMA 3.794.0Chromium 141T05mustImpressions and trackingFires a progress tracker with an HH:MM:SS offset.conforms
Google IMA 3.794.0Chromium 141T06mustImpressions and trackingFires a progress tracker with an HH:MM:SS.mmm offset.conforms
Google IMA 3.794.0Chromium 141T07mustImpressions and trackingFires progress trackers with percentage offsets (10% and 80%).conforms
Google IMA 3.794.0Chromium 141T08mustImpressions and trackingStopping at 60% fires midpoint but neither thirdQuartile nor complete.conforms
Google IMA 3.794.0Chromium 141T09observationRobustness observationsSpread between the first and last Impression request at impression time (ms, measured at the server).n/a4 ms
Google IMA 3.794.0Chromium 141M01mustMacrosReplaces [CACHEBUSTING] with a random 8-digit integer.conforms
Google IMA 3.794.0Chromium 141M02mustMacrosReplaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05).conforms
Google IMA 3.794.0Chromium 141M03mustMacrosReplaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail).conforms
Google IMA 3.794.0Chromium 141M04mustMacrosPercent-encodes macro values (the colons in TIMESTAMP).conforms
Google IMA 3.794.0Chromium 141M05shouldMacrosDoes not write -1 into a macro it does not know ([NOTAREALMACRO]).conforms
Google IMA 3.794.0Chromium 141X01shouldXML 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).n/arequested, but the client-side URL was not observable
Google IMA 3.794.0Chromium 141X02mustXML and parsingIgnores XML comments inside an element when reading its URI.conforms
Google IMA 3.794.0Chromium 141X03shouldXML and parsingDecodes character entities (&) in a URI given as plain text (a document that breaks ยง2.3.3's CDATA rule, which real tags still do).conforms
Google IMA 3.794.0Chromium 141X04observationRobustness observationsParses a document that omits xmlns="http://www.iab.com/VAST".conforms
Google IMA 3.794.0Chromium 141X05mustXML and parsingAccepts a Creative with two UniversalAdId elements.conforms
Google IMA 3.794.0Chromium 141X06mustXML and parsingAccepts two ClosedCaptionFile elements.conforms
Google IMA 3.794.0Chromium 141P01mustAd 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).conforms
Google IMA 3.794.0Chromium 141R01observationRobustness observationsA timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).conforms
Google IMA 3.794.0Chromium 141R02observationRobustness observationsA failed Wrapper request does not escape as an uncaught exception.conforms
Google IMA 3.794.0Chromium 141W23shouldWrapper resolutionWith fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used.deviatesresolved none; fetched start.xml,noad.xml; error AD_ERROR 900: The response does not contain any valid ads.
Google IMA 3.794.0Chromium 141E05mustError reportingWhen the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found).conforms
Google IMA 3.794.0Chromium 141E06mustError reportingWhen a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405.conforms
Google IMA 3.794.0Chromium 141E07mustError reportingWhen the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout).conforms
Google IMA 3.794.0Chromium 141E08shouldError reportingDoes not request the Error URI when the ad plays without a problem.conforms
Google IMA 3.794.0Chromium 141E09mustError reportingGiven a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity).conforms
Google IMA 3.794.0Chromium 141T10shouldImpressions and trackingDoes not request the Impression of an ad whose media never plays (no supported MediaFile).conforms
Google IMA 3.794.0Chromium 141T11shouldImpressions and trackingRequests the Impression exactly once across pause, resume, mute and unmute.conforms
Google IMA 3.794.0Chromium 141T12mustImpressions and trackingFires the pause tracker once when the user pauses.conforms
Google IMA 3.794.0Chromium 141T13mustImpressions and trackingFires the resume tracker once when the user resumes.conforms
Google IMA 3.794.0Chromium 141T14mustImpressions and trackingFires the mute tracker once when the user mutes.conforms
Google IMA 3.794.0Chromium 141T15mustImpressions and trackingFires the unmute tracker when the user unmutes.conforms
Google IMA 3.794.0Chromium 141T23shouldImpressions and trackingA volume change that is not an unmute (0.5 while unmuted) does not fire unmute.conforms
Google IMA 3.794.0Chromium 141T20shouldImpressions and trackingFires the loaded tracker once when the media is ready to play.conforms
Google IMA 3.794.0Chromium 141T16mustImpressions and trackingSkipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type).conforms
Google IMA 3.794.0Chromium 141T17shouldImpressions and trackingThe skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03).conforms
Google IMA 3.794.0Chromium 141T18shouldImpressions and trackingA percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip.conforms
Google IMA 3.794.0Chromium 141T19shouldImpressions and trackingProgress offsets passed before the skip (2 s and 5 s) are fired.conforms
Google IMA 3.794.0Chromium 141T21mustImpressions and trackingFires the rewind tracker when the user seeks back 2 s (from 60% to 40%).n/aIMA exposes no seek or icon control to a page; rewind is not drivable
Google IMA 3.794.0Chromium 141T22shouldImpressions 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.n/aIMA exposes no seek or icon control to a page; rewind is not drivable
Google IMA 3.794.0Chromium 141A01mustVerification 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.conforms
Google IMA 3.794.0Chromium 141A02mustVerification and iconsFills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3).conforms
Google IMA 3.794.0Chromium 141A03shouldVerification and iconsHandles the Wrapper's verification too: requests its verificationNotExecuted URI.deviatesnot requested
Google IMA 3.794.0Chromium 141A04mustVerification and iconsReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported).conforms
Google IMA 3.794.0Chromium 141A05mustVerification and iconsWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load).deviatesresource fetched (404); verificationNotExecuted not requested
Google IMA 3.794.0Chromium 141S01shouldMedia selectionSkips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one.conforms
Google IMA 3.794.0Chromium 141S02mayMedia selectionOptional: plays an audio ad (adType="audio", Opus WebM and AAC files).n/anot supported (optional); reported 400
Google IMA 3.794.0Chromium 141M06mustMacrosReplaces 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.conforms
Google IMA 3.794.0Chromium 141M07shouldMacrosFills [ADSERVINGID] with the ad's AdServingId (in-serving).conforms
Google IMA 3.794.0Chromium 141M08shouldMacrosWhen it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s.conforms
Google IMA 3.794.0Chromium 141M09shouldMacrosFills [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.conforms
Google IMA 3.794.0Chromium 141M10shouldMacrosWhen it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first).conforms
Google IMA 3.794.0Chromium 141M11mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI.conforms
Google IMA 3.794.0Chromium 141M12mustMacrosReplaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it.conforms
Google IMA 3.794.0Chromium 141P06shouldAd podsPlays all three ads of a pod.conforms
Google IMA 3.794.0Chromium 141P03mustAd podsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's.conforms
Google IMA 3.794.0Chromium 141P02shouldAd podsWhen the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad).conforms
Google IMA 3.794.0Chromium 141P05shouldAd podsThe failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third.conforms
Google IMA 3.794.0Chromium 141I01mustVerification and iconsDisplays the Icon after the ad starts and requests its IconViewTracking URI.deviatesrequested before the ad started
Google IMA 3.794.0Chromium 141I03shouldVerification and iconsDisplays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI.conforms
Google IMA 3.794.0Chromium 141I02mustVerification and iconsOn a click on the Icon, requests its IconClickTracking URI.n/aIMA exposes no seek or icon control to a page; icon is not drivable
Google IMA 3.794.0Chromium 141X07observationRobustness observationsFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).conforms
Google IMA 3.794.0Chromium 141X08shouldXML and parsingNever requests a Tracking element whose event name is not a VAST event (notARealEvent).conforms
Google IMA 3.794.0Chromium 141X09shouldXML and parsingDoes not request Impression or Tracking URIs that appear inside an Extension.conforms
Google IMA 3.794.0Chromium 141X10mustXML and parsingParses a document that starts with a UTF-8 byte order mark.conforms
Google IMA 3.794.0Chromium 141X11mustXML and parsingReassembles an Impression URI split across two CDATA sections (query s=x]]>x).conforms
Google IMA 3.794.0Chromium 141X12shouldXML and parsingAccepts a UniversalAdId that still carries the VAST 4.0 idValue attribute.conforms
Google IMA 3.794.0Chromium 141X13mustXML and parsingAn empty Impression element does not stop the other Impression from being requested.conforms
Google IMA 3.794.0Chromium 141X14shouldXML and parsingAccepts a VAST 3.0 InLine document.conforms
Google IMA 3.794.0Chromium 141X15shouldXML and parsingAccepts a VAST 2.0 InLine document.conforms
Google IMA 3.794.0Chromium 141X16shouldXML and parsingFollows a VAST 3.0 Wrapper to a VAST 4.3 InLine.conforms
Google IMA 3.794.0Chromium 141R03observationRobustness observationsFollows an HTTP 302 redirect on a VASTAdTagURI.conforms
Google IMA 3.794.0Chromium 141R04observationRobustness observationsParses a VAST response sent with Content-Encoding: gzip.conforms
Google IMA 3.794.0Chromium 141R05observationRobustness observationsParses a VAST response served as text/plain rather than an XML media type.conforms
Google IMA 3.794.0Chromium 141R06observationRobustness observationsA tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).conforms
Google IMA 3.794.0Chromium 141X17mustXML and parsingDoes not request an Impression element that sits entirely inside an XML comment (next to a real Impression).conforms
Google IMA 3.794.0Chromium 141X18shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
Google IMA 3.794.0Chromium 141X19shouldXML and parsingRequests a VASTAdTagURI written as escaped text, with the character reference & between query parameters, with all parameters intact (a=1, b=2, c=3).conforms
Google IMA 3.794.0Chromium 141P07mustAd 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).conforms