Skip to content

EPUB conformance

This page reports how KitePDF does on the W3C EPUB 3 test suite, w3c/epub-tests at commit 54092b42. The suite has one test book for each normative statement of EPUB 3 and EPUB Reading Systems 3. Each test has the level of its statement: must, should or may. A test is deprecated when the specifications no longer recommend its feature.

The reading system under test is the library and its viewer together:

  • kitepdf-epub reads the book and lays it out.
  • KiteDocView shows the book, pairs the spreads and follows the links.
  • EpubScriptRunner of kitepdf-javascript runs the scripts of the book.

The implementation report gives each result in the format of the suite: true, false or "n/a". Each failure of a must or a should names the issue that tracks it.

Summary

Level Tests Passes Fails Not applicable
must 140 136 0 4
should 38 37 0 1
may 1 0 1 0
deprecated 27 25 1 1
all 206 198 2 6

How the results are known

A test in kitepdf-compose-viewer packs each test book of the suite and opens it as a reader does. When the KitePDF API shows the result, a check decides it. A check can read:

  • the text, the size and the page count of a page
  • what a page paints on a recording canvas
  • the rendition of a chapter and the table of contents
  • the spreads that the viewer pairs
  • the outcome of the scripts

These rows say Checked and tell what the check asserts. The test fails when a check and the report disagree, so a change that moves a result must also move the report.

The other rows need a person, for example to see whether a line breaks before a given character, or how read-aloud behaves. These rows say Judged and tell what was seen on the page or read in the code.

A test is not applicable in two cases:

  • It does not test a reading system. For example, it asks EPUBCheck to report an error.
  • It says that it does not apply to a reading system without the feature that it tests.

Run the test

CI checks out the suite at the pinned commit and runs the test on every push. To run the test locally, give it a checkout of the suite:

git clone https://github.com/w3c/epub-tests ../epub-tests
git -C ../epub-tests checkout 54092b4233253e9aac80e93ec4782b380b4b3403
KITEPDF_EPUB_TESTS=$PWD/../epub-tests/tests ./kotlin test -m kitepdf-compose-viewer -p jvm --include-classes='*EpubConformanceTest*'

Open Container Format

Test Level Result How it is known
ocf-font_obfuscation should Passes Checked: The quote draws in the obfuscated font, with glyph outlines from the font the book embeds.
ocf-font_obfuscation_bis should Passes Checked: A font obfuscated with the wrong key does not load, so no glyph run takes its outlines from it.
ocf-metainf-inc must Passes Checked: The book opens and its page shows the pass sentence.
ocf-metainf-manifest must Passes Checked: The spine is the one chapter of the package, and no page shows the fail sentence.
ocf-package_arbitrary must Passes Checked: The package at FOO/BAR opens and its page shows the pass sentence and not the fail one.
ocf-package_multiple must Passes Checked: The first rendition, at FOO/BAR, opens and its page shows the pass sentence and not the fail one.
ocf-url_link-leaking-relative must Passes Checked: The image whose path climbs past the root draws, 1000 by 562 pixels.
ocf-url_link-path-absolute must Passes Checked: The image with a path from the root draws, 1000 by 562 pixels.
ocf-url_link-relative must Passes Checked: The image with a relative path draws, 1000 by 562 pixels.
ocf-url_manifest must Passes Checked: The chapter at EPUB/foo opens and shows the pass sentence.
ocf-url_origin must Passes Checked: Two openings of the book, standing for two readers with their own instance keys, show different origins.
ocf-url_parse-leaking-relative must Passes Checked: After the scripts run, the page shows the image address that URL resolves under the book's origin, which stays at the root of the book however many .. segments climb above it.
ocf-url_parse-path-absolute must Passes Checked: After the scripts run, the page shows the path-absolute address that URL resolves under the book's origin, from the root of the book.
ocf-url_relative must Passes Checked: The chapter at foo/BAR/qux opens and shows the pass sentence.
ocf-zip-comp must Passes Checked: The test book re-packed with its entries marked as bzip2 does not open: EpubDocument.open throws EpubFormatException. The folder itself can only hold Deflate.
ocf-zip-mult must Passes Checked: The test book whose end record says it is the second segment of a split archive does not open: EpubDocument.open throws EpubFormatException.

Package Documents

Test Level Result How it is known
pkg-collections-unknown must Passes Checked: The book opens with its own title, not the unknown collection's, and shows the pass sentence.
pkg-creator-order must Passes Checked: epubMetadata.creators lists the five creators in package order.
pkg-linked-records should Not applicable Judged: Linked metadata records are not read, and the test applies only to a reading system that reads them. The title and creator come from the package.
pkg-manifest-unknown must Passes Checked: The book opens and shows the pass sentence.
pkg-manifest-unlisted-resource should Passes Checked: The image that the manifest does not list does not draw.
pkg-meta-unknown must Passes Checked: The book opens with its own title, not the unknown meta's, and shows the pass sentence.
pkg-meta-whitespace must Passes Checked: The creator reads "Dave Cramer" with one space, and the title reads as written.
pkg-spine-duplicate-item-hyperlink must Passes Checked: The link to the repeated document goes to its first place in the spine.
pkg-spine-duplicate-item-rendering must Passes Checked: The document listed three times in the spine shows three times, one page each.
pkg-spine-duplicate-item-ui must Passes Checked: Each of the three places of the repeated document has a bookmark of its own chapter.
pkg-spine-nonlinear-activation must Passes Checked: The link to the non-linear document goes to it, and it shows the pass sentence.
pkg-spine-order must Passes Checked: The chapters follow the spine, whatever the file names.
pkg-spine-order-svg must Passes Checked: The four SVG chapters follow the spine and draw "Page 1" to "Page 4".
pkg-spine-unknown must Passes Checked: The book opens and shows the pass sentence.
pkg-title-order must Passes Checked: The title is the first dc:title of the package.
pkg-unique-id must Passes Checked: The two books that share an identifier open as two books, each with its own title.
pkg-unique-id_duplicate must Passes Checked: The two books that share an identifier open as two books, each with its own title.
pkg-version-backward must Passes Checked: A package with version 0 opens and shows the pass sentence.

Publication Resources

Test Level Result How it is known
pub-data-urls_browsing-context must Passes Checked: The image whose source is a data: URL draws.
pub-data-urls_top-level-content must Passes Checked: The fixed-layout page draws the SVG of its data: URL in place, and the book keeps its two pages.
pub-external-links should Passes Judged: when onLinkTap does not take the web link, KiteDocView asks the reader and then opens the address in the browser through LocalUriHandler. A scene test covers the prompt.
pub-external-links_consent should Passes Judged: KiteDocView asks the reader before it opens the mail link, and opens the mail app through LocalUriHandler only after the reader taps Open. A scene test covers the prompt.
pub-file-urls must Passes Checked: The three iframes point at file: URLs, none of which the book can read, and their boxes stay empty.
pub-xml-external-id must Passes Checked: No page shows the fail sentence: the external entity is not resolved, and stands for nothing, and the DOCTYPE's internal subset leaves nothing of itself on the page.
pub-xml-names must Passes Checked: EpubDocument.markupErrors reports that p::p is not a name with a namespace prefix, and KiteDocView shows the error on the page.
pub-xml-non-validating_comment must Passes Checked: The spine holds the two chapters, and the commented-out item is not one of them.
pub-xml-non-validating_unclosed must Passes Checked: EpubDocument.markupErrors reports that the paragraph is never closed, and KiteDocView shows the error on the page.
sec-untrusted-consent_network should Passes Checked: Opened with the default settings, the page fetches nothing: no image draws, nothing arrives from the network, and the remote stylesheet does not turn the text red. Fetching starts only when the host app passes a fetcher, which is where the reader consents.
sec-untrusted-consent_scripting should Passes Checked: Without EpubScriptRunner the page still says "No script has been executed.": scripts run only when the host app passes a runner, which is where the reader consents.

Core Media Types

Test Level Result How it is known
pub-cmt-avif must Passes Checked: The AVIF draws.
pub-cmt-gif must Passes Checked: The GIF draws.
pub-cmt-jpeg must Passes Checked: The JPEG draws.
pub-cmt-jxl must Passes Checked: The JPEG XL draws.
pub-cmt-mp3 must Passes Checked: The page offers the MP3 as audio with controls, which kitepdf-media plays on Android, iOS and the desktop JVM.
pub-cmt-mp4 must Passes Checked: The page offers the M4A as audio with controls, which kitepdf-media plays on Android, iOS and the desktop JVM.
pub-cmt-opus must Passes Checked: The page offers the Opus file as audio with controls, which kitepdf-media plays on Android, iOS and the desktop JVM.
pub-cmt-png must Passes Checked: The PNG draws.
pub-cmt-svg must Passes Checked: The SVG image draws its red heart.
pub-cmt-webp must Passes Checked: The WebP draws.

Manifest Fallbacks

Test Level Result How it is known
pub-foreign_bad-fallback must Passes Checked: The book, whose only spine item has no content document in its fallback chain and no markup in its bytes, is refused with a format error, as the test allows.
pub-foreign_image must Passes Checked: The PSD image falls back to its PNG, which draws.
pub-foreign_json-spine must Passes Checked: The JSON spine item falls back to its XHTML document, which shows the pass sentence.
pub-foreign_xml-spine must Passes Checked: The XML spine item falls back to its XHTML document, which shows the pass sentence.
pub-foreign_xml-suffix-spine must Passes Checked: The +xml spine item falls back to its XHTML document, which shows the pass sentence.

Content Documents

Test Level Result How it is known
cnt-css-fonts_ot must Passes Checked: The item draws in the OpenType font of its @font-face, with glyph outlines from the book.
cnt-css-fonts_tt must Passes Checked: The item draws in the TrueType font of its @font-face, with glyph outlines from the book.
cnt-css-fonts_woff must Passes Checked: The item draws in the WOFF font of its @font-face, with glyph outlines from the book.
cnt-css-fonts_woff2 must Passes Checked: The item draws in the WOFF2 font of its @font-face, with glyph outlines from the book.
cnt-mathml-support must Passes Checked: The equation draws as MathML: the exponent 2 is smaller than the base and raised above it.
cnt-svg-css must Passes Checked: The SVG chapter fills its shapes with the star pattern of its CSS.
cnt-svg-css-inclusion must Passes Checked: The inline SVG fills with the star pattern of the document's CSS.
cnt-svg-css-reference must Passes Checked: The SVG referenced by img stays solid green: the document's CSS does not reach it.
cnt-svg-embedded must Passes Checked: The inline SVG draws its red heart.
cnt-svg-support must Passes Checked: The SVG chapter draws its red heart and its text.
cnt-xhtml-support must Passes Checked: The XHTML chapter shows its pass sentence.
css-epub-hyphens should Passes Judged: -epub-hyphens is read: none never hyphenates, manual breaks at soft hyphens and auto hyphenates by the language's patterns. At the test's page width no line happens to end on a break point, so this is judged from the code and narrower pages.
css-epub-line-break should Passes Checked: Over many widths of the page, no line runs past its edge, auto and strict start no line with 々 or ぁ, normal starts some with ぁ and none with 々, and loose starts some with each.
css-epub-text-align-last should Passes Checked: The last line of each sample sits where its -epub-text-align-last puts it: at the left edge for auto, start, left and end in right-to-left text, at the right edge for right, centred for center, and across the line for justify.
css-epub-text-combine-horizontal should Passes Checked: Tests 2 and 4 set each pair of digits upright and side by side in the space of one character, an em down the column from the last, and tests 1 and 3 set the same digits one by one, turned as the mixed rule turns them.
css-epub-text-emphasis should Passes Checked: The first chapter draws over its text each mark its style sheet asks for, from the book's font where the font has it, a blue one for test 12 and one under the text for test 13, and the vertical chapters draw them left of the first column and then right of it. Tests 8 to 11 name other marks than their style sheet asks for; the check follows the style sheet.
css-epub-text-orientation should Passes Checked: The test's second chapter lays out vertically: the mixed paragraph stands its Japanese up and turns its English, the upright one stands its English letters up, and the sideways ones turn their Japanese too.
css-epub-text-transform should Passes Checked: The digits and letters of the sample read as their full-width forms and stand upright in the vertical chapter, as the Japanese beside them does.
css-epub-text-underline-position should Passes Checked: The first chapter's underline sits under the baseline and above the 0.2 em that descenders reach, the second chapter's sits below them, and the vertical chapters draw it left of the first column and then right of it.
css-epub-word-break should Passes Checked: The normal and keep-all samples keep every word whole, and the break-all sample breaks inside words and fills each line to its edge.
css-epub-writing-mode should Passes Checked: Chapter 1 lays out horizontally and chapters 2 and 3 vertically.

Internationalization

Test Level Result How it is known
pkg-dir-auto_root-rtl must Passes Checked: epubMetadata.titleRightToLeft is false, since the title's own auto goes by its first strong character, the Latin C of "CSS:", over the package's rtl, so the title displays incorrectly as the test expects.
pkg-dir-auto_root-unset must Passes Checked: epubMetadata.titleRightToLeft is false, since the title's auto goes by its first strong character, the Latin C of "CSS:", so the title displays incorrectly as the test expects.
pkg-dir_but_not_content must Passes Checked: The list reads left to right: the package's dir does not reach the content.
pkg-dir_creator-rtl must Passes Checked: epubMetadata.creatorsRightToLeft says the one creator reads right to left by its own dir.
pkg-dir_rtl-root-ltr must Passes Checked: epubMetadata.titleRightToLeft is true, since the title's own rtl wins over the package's ltr.
pkg-dir_rtl-root-unset must Passes Checked: epubMetadata.titleRightToLeft is true by the title's own rtl.
pkg-dir_unset-root-rtl must Passes Checked: epubMetadata.titleRightToLeft is true by the package's rtl, which the title inherits.
pkg-dir_unset-root-unset must Passes Checked: epubMetadata.titleRightToLeft is false, since with no dir anywhere the title goes by its first strong character, the Latin C of "CSS:", so it displays incorrectly as the test expects.
pkg-lang_but_not_content must Passes Checked: The q element shows English quotation marks, not the French ones of the package language.
pkg-spine-progression-default must Passes Checked: The book of Arabic language with a default spine progresses right to left.
pkg-spine-progression-pre-paginated must Passes Checked: The pages progress left to right and pair into spreads with the first page on the left.
pkg-spine-progression_ltr must Passes Checked: The pages progress left to right, paired with the first page on the left.
pkg-spine-progression_rtl must Passes Checked: The book progresses right to left, and the viewer pairs its pages that way.
Test Level Result How it is known
nav-access must Passes Checked: The table of contents has the one entry, which the outline panel lists.
nav-activation must Passes Checked: The entry for the second document goes to it, and it shows the pass sentence.
nav-non-text_img should Passes Checked: The entry made of an image takes the image's alt as its label.
nav-non-text_img_title should Passes Checked: The entry made of an image takes its alt, not its title, as its label.
nav-spine_in-spine must Passes Checked: The navigation document in the spine shows both links, and the table of contents has both entries.
nav-spine_in-spine-hidden-toc-css must Passes Checked: The table of contents has both entries, while the page hides the second as its CSS says.
nav-spine_in-spine-hidden-toc-html must Passes Checked: The table of contents has both entries, while the page hides the second as its hidden says.
nav-spine_in-spine-no-list-style must Passes Checked: The outline lists the two titles alone, with no number or letter before them.
nav-spine_not-in-spine must Passes Checked: The table of contents has both entries, and the navigation document is not a chapter.

Structural Semantics

Test Level Result How it is known
pss-support may Fails Judged: The note reference and its footnote are found (linkTarget), but KiteDocView shows no popup of its own; the app builds one from onLinkTap.
pss-support_ignore-title must Passes Checked: A link to the head's title is not a footnote, while the note in the body is one.

Scripting

Test Level Result How it is known
scr-not-support_ccscript-modify-host must Passes Checked: The iframe's box draws its document, whose script ran, and the chapter's text stays: the frame's parent is its own window.
scr-not-support_ccscript-modify-size must Passes Checked: The iframe's box draws its document, whose script ran, and the box keeps its shape of 500 by 70 pixels.
scr-readingsystem-features must Passes Checked: After the scripts run, the page lists each of the six features that hasFeature answers as true or false, and none as unimplemented.
scr-readingsystem-support must Passes Checked: After the scripts run, the page says the reading system implements epubReadingSystem.
scr-readingsystem-support_iframe must Passes Checked: The iframe's box draws its document, whose script finds epubReadingSystem.
scr-readingsystem-support_iframe_svg must Passes Checked: The iframe's box draws its SVG document, whose script finds epubReadingSystem.
scr-readingsystem-support_svg must Passes Checked: After the scripts run in the SVG chapter, it draws the pass text about epubReadingSystem.
scr-storage-delete should Passes Checked: Opened a second time, the page says persistent data is not kept, so the test passes: local storage lives as long as the session.
scr-support should Passes Checked: After the scripts run, the page says scripting is supported and the test passes.
scr-support-fallback must Not applicable Judged: Scripts run, so the page itself says its manifest fallback is unused and the test does not apply.
scr-support_iframe should Passes Checked: The iframe's box draws its document, whose script says scripting works.
scr-support_origin must Passes Checked: After the scripts run, both chapters show the same origin, epub:// and a host.
scr-support_origin_unique must Passes Checked: After the scripts run, the book shows an origin other than scr-support_origin's.
scr-support_scrolled-continuous should Passes Checked: Each chapter is one page as tall as its content, and KiteDocLayout.forDocument shows the book as one continuous strip.
scr-support_scrolled-doc must Passes Checked: Each chapter is one page as tall as its content, and KiteDocLayout.forDocument shows the book in a pager whose chapters fill the width and scroll down.
scr-support_svg should Passes Checked: After the scripts run in the SVG chapter, it draws the pass text and not the fail text.

Fixed Layout

Test Level Result How it is known
lay-page-layout-both should Passes Checked: The reflowable chapter flows over pages between the fixed ones, each one page of its viewport.
lay-page-layout-both-spread must Passes Checked: The last page, which asks for the left, sits alone in the left half of its spread.
lay-pkg-flow-paginated should Passes Checked: With flow paginated, the chapters are cut into pages.
lay-pkg-flow-scrolled-continuous should Passes Checked: Each chapter is one page as tall as its content, and KiteDocLayout.forDocument shows the book as one continuous strip.
lay-pkg-flow-scrolled-doc should Passes Checked: Each chapter is one page as tall as its content, and KiteDocLayout.forDocument shows the book in a pager whose chapters fill the width and scroll down.
lay-reflow-align-x-center must Not applicable Judged: rendition:align-x-center is not supported, and the test applies only to a reading system that supports it.
lay-rendition-flow-pre-pag must Passes Checked: The fixed chapters of a scrolled book are one page each of their viewport.
lay-viewport-meta-prop must Passes Checked: All four pages take the same 900 by 600 viewport whatever their scale keys say; the viewer's zoom follows its own settings.

Pre-paginated Layout

Test Level Result How it is known
fxl-layout-duplication deprecated Not applicable Judged: Only EPUBCheck can pass it, by reporting the duplicated rendition:layout. KitePDF keeps the first value.
fxl-page-spread-break deprecated Passes Checked: Each chapter is one 900 by 600 page despite page-break-before, and the viewer pairs them two by two.
fxl-page-spread-center deprecated Passes Checked: The first chapter asks for the centre, and the viewer gives it a spread of its own, drawn centred.
fxl-spine-overrides_behave-as-global deprecated Passes Checked: The fixed chapter is one page of its viewport and the overriding chapter flows over pages.
fxl-spine-overrides_behave-as-global-bis deprecated Passes Checked: The overriding chapter is one fixed page of its viewport between two reflowable ones.
fxl-spine-overrides_duplicate deprecated Passes Checked: Of the two overrides on the itemref, the first, reflowable, wins.
lay-fxl-layout-default deprecated Passes Checked: With no rendition:layout, the book is reflowable and flows over pages.
lay-fxl-layout-pre-paginated deprecated Passes Checked: Each chapter is one 900 by 600 page, in spine order.
lay-fxl-layout-pre-paginated-spreads deprecated Passes Checked: The viewer pairs the four pages into two spreads with no lone page between.
lay-fxl-orientation-default deprecated Passes Checked: Every chapter reads orientation auto, and the viewer follows the device.
lay-fxl-orientation-landscape deprecated Fails Judged: rendition:orientation landscape is read, but KiteDocView neither rotates nor tells the reader.
lay-fxl-page-spread-combined deprecated Passes Checked: The left and right pages share one spread, the left one first.
lay-fxl-page-spread-left deprecated Passes Checked: The page-spread-left page opens its spread on the left.
lay-fxl-page-spread-right deprecated Passes Checked: The page-spread-right first page sits alone in the right half of its spread, and the pages after it pair.
lay-fxl-spread-auto deprecated Passes Checked: With spread auto, the viewer pairs the pages.
lay-fxl-spread-both deprecated Passes Checked: With spread both, the viewer pairs the pages in landscape and in portrait.
lay-fxl-spread-default deprecated Passes Checked: With no rendition:spread, the value is auto and the viewer pairs the pages.
lay-fxl-spread-landscape deprecated Passes Checked: With spread landscape, the viewer pairs the pages in landscape only.
lay-fxl-spread-none deprecated Passes Checked: With spread none, every page shows alone.
lay-fxl-svg-icb_multi deprecated Passes Checked: Each SVG page takes the size of its own viewBox, 900 by 600 and 1200 by 600.
lay-fxl-xhtml-icb deprecated Passes Checked: The page is its 900 by 600 pixel viewport, and the grid of layered gradients paints over the red box, in 18 by 12 cells.
lay-fxl-xhtml-icb_device_sizes deprecated Passes Checked: The grid of layered gradients paints over the red box. device-width and device-height give the page the size of the reader's, so it fills the display.
lay-fxl-xhtml-icb_invalid_meta deprecated Passes Checked: Width and height are read from the invalid tag, so the second page is 900 by 600 pixels too, and both paint the grid of layered gradients over the red box.
lay-fxl-xhtml-icb_multi deprecated Passes Checked: Each page takes its own viewport, 900 and 1400 pixels wide, and both paint the grid of layered gradients over the red box, which shows to the right of it on the wide page.
lay-fxl-xhtml-icb_multi_declarations deprecated Passes Checked: Of two viewport tags, the first sizes the page, 1000 by 600.
lay-fxl-xhtml-icb_repeated-in-meta deprecated Passes Checked: Of a repeated width and height, the first sizes the page, 900 by 600.
lay-fxl-xhtml-icb_units deprecated Passes Checked: width=1000px, height=600mm sizes the page 1000 by 600.
lay-pp-embedded-images must Passes Checked: Each of the nine chapters is one page of its viewport that draws its image, and the title page asks for the centre.
lay-pp-embedded-images-svg must Passes Checked: The XHTML title and the SVG plates are one page each of their viewport, each drawing its image.
lay-pp-images-in-spine must Passes Checked: Each image spine item shows the image itself, as one fixed page at its pixel size.
lay-pp-images-mixed must Passes Checked: The plates draw their images, and the two image spine items show the images themselves, at the same size.
lay-pp-layout-default must Passes Checked: With no rendition:layout, the book is reflowable and flows over pages.
lay-pp-layout-duplication must Not applicable Judged: Only EPUBCheck can pass it, by reporting the duplicated rendition:layout. KitePDF keeps the first value.
lay-pp-layout-pre-paginated must Passes Checked: Each chapter is one 900 by 600 page, in spine order.
lay-pp-layout-pre-paginated-spreads must Passes Checked: The viewer pairs the four pages into two spreads with no lone page between.
lay-pp-page-spread-combined should Passes Checked: The left and right pages share one spread, the left one first.
lay-pp-page-spread-left should Passes Checked: The page-spread-left page opens its spread on the left.
lay-pp-page-spread-right should Passes Checked: The page-spread-right first page sits alone in the right half of its spread, and the pages after it pair.
lay-pp-spine-overrides_behave-as-global must Passes Checked: The fixed chapter is one page of its viewport and the overriding chapter flows over pages.
lay-pp-spine-overrides_behave-as-global-bis must Passes Checked: The overriding chapter is one fixed page of its viewport between two reflowable ones.
lay-pp-spine-overrides_image-only-pp must Passes Checked: The fixed chapter is one page that draws its image, and the overriding chapter flows over pages.
lay-pp-spine-overrides_image-only-reflow must Passes Checked: The overriding chapter is one fixed page that draws its image between two reflowable ones.
lay-pp-spine-overrides_image-spine-pp must Passes Checked: The image spine item shows the image as one fixed page, and the overriding chapter flows.
lay-pp-spine-overrides_image-spine-reflow must Passes Checked: The image spine item shows the image as one fixed page, between reflowable chapters.
lay-pp-spread-none must Passes Checked: With spread none, every page shows alone.
lay-pp-svg-icb_multi must Passes Checked: Each SVG page takes the size of its own viewBox, 900 by 600 and 1200 by 600.
lay-pp-xhtml-icb must Passes Checked: The page is its 900 by 600 pixel viewport, and the grid of layered gradients paints over the red box, in 18 by 12 cells.
lay-pp-xhtml-icb_invalid_meta should Passes Checked: Width and height are read from the invalid tag, so the second page is 900 by 600 pixels too, and both paint the grid of layered gradients over the red box.
lay-pp-xhtml-icb_multi must Passes Checked: Each page takes its own viewport, 900 and 1400 pixels wide, and both paint the grid of layered gradients over the red box, which shows to the right of it on the wide page.
lay-pp-xhtml-icb_multi_declarations must Passes Checked: Of two viewport tags, the first sizes the page, 1000 by 600.
lay-pp-xhtml-icb_repeated-in-meta must Passes Checked: Of a repeated width and height, the first sizes the page, 900 by 600.
lay-pp-xhtml-icb_units must Passes Checked: width=1000px, height=600mm sizes the page 1000 by 600.

Roll Layout

Test Level Result How it is known
lay-roll-embedded-images must Passes Checked: Each plate is one page at its own aspect, and KiteDocLayout.forDocument shows the book as one strip whose pages fill the width with no gap.
lay-roll-embedded-images-svg must Passes Checked: Each plate is one page at its own aspect, and KiteDocLayout.forDocument shows the book as one strip whose pages fill the width with no gap.
lay-roll-images-in-spine must Passes Checked: Each plate is one page at its own aspect, and KiteDocLayout.forDocument shows the book as one strip whose pages fill the width with no gap.
lay-roll-images-mixed must Passes Checked: Each plate is one page at its own aspect, and KiteDocLayout.forDocument shows the book as one strip whose pages fill the width with no gap.

Media Overlays

Test Level Result How it is known
mol-audio must Passes Checked: The overlay's clip reads its audio file from 29.268 s to 44.783 s, which KiteReadAloud plays while it highlights the text.
mol-audio-exceeding-clipend must Passes Judged: From the code of KiteReadAloud: a clip whose clipEnd lies past the end of its file ends with the file, and reading goes on.
mol-audio-no-clipbegin must Passes Checked: A clip with no clipBegin starts at 0 s.
mol-audio-no-clipend must Passes Checked: A clip with no clipEnd plays to the end of its file.
mol-css should Passes Checked: With the first clip marked through EpubDocument.markNarration, the word Call draws light on a green fill and the rest of the chapter grey, as KiteReadAloud marks each clip.
mol-ignore must Not applicable Judged: The test is for reading systems without media overlays, and says one with them should skip it.
mol-navigation must Passes Judged: After a jump through the table of contents, KiteReadAloud goes on from the first clip of the chapter the reader went to, as ReadAloudTest checks on a book of its own.
mol-support_xhtml must Passes Judged: From the code of KiteReadAloud: it reads the overlay clip by clip, highlights each piece of text and turns the page with the reading.
mol-support_xhtml-fxl must Passes Judged: From the code of KiteReadAloud: it reads the fixed page's overlay as it does a reflowable one.
mol-support_xhtml-load must Passes Checked: The overlay that two chapters share gives each only the clips of its own text.
mol-support_xhtml-load-fxl must Passes Checked: The overlay that two chapters share gives each only the clips of its own text.
mol-support_xhtml-load-next should Passes Judged: From the code of KiteReadAloud: when a chapter's overlay ends it goes on with the next chapter's and turns the page itself.
mol-support_xhtml-load-next-fxl should Passes Judged: From the code of KiteReadAloud: on fixed pages too, reading moves on to the next page's overlay and turns the page.
mol-timing-synchronization must Passes Judged: From the code of KiteReadAloud: each clip's text is highlighted while its audio plays.
mol-timing-synchronization_fxl must Passes Checked: The overlay that three pages share gives each page its one clip.
mol-timing-synchronization_multiple_audio must Passes Judged: From the code of KiteReadAloud: the clips of both audio files read in order, the second file opening in the same player.
mol-timing-synchronization_multiple_audio-fxl must Passes Judged: From the code of KiteReadAloud: on the fixed page too, the reading goes from the first audio file to the second in clip order.
mol-timing-synchronization_svg must Passes Checked: Each clip's text inside the SVG chapter has a place on its page, one rectangle per line it draws.
mol-timing-synchronization_svg-fxl must Passes Checked: Each clip's text inside the SVG page has a place on it, one rectangle per line it draws.
mol-tts_multi should Passes Checked: Each of the four clips has no audio, and EpubDocument.readingOrderOf gives its sentence, which KiteReadAloud hands to the app's speech hook.
mol-tts_single should Passes Checked: The one clip has no audio, and EpubDocument.readingOrderOf gives the text of the whole section, which KiteReadAloud hands to the app's speech hook.