diff --git a/src/main/java/com/adobe/epubcheck/dtbook/DTBookHandler.java b/src/main/java/com/adobe/epubcheck/dtbook/DTBookHandler.java index adc9180db..71c37caa7 100755 --- a/src/main/java/com/adobe/epubcheck/dtbook/DTBookHandler.java +++ b/src/main/java/com/adobe/epubcheck/dtbook/DTBookHandler.java @@ -51,7 +51,7 @@ public void startElement() if (ns.equals("http://www.daisy.org/z3986/2005/dtbook/")) { // Register IDs - xrefChecker.registerID(e.getAttribute("id"), XRefChecker.Type.HYPERLINK, location()); + xrefChecker.registerID(e.getAttribute("id"), XRefChecker.Type.GENERIC, location()); // Check cross-references (link@href | a@href | img@src) URL url = null; diff --git a/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java b/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java index a24f07318..77621f6d9 100644 --- a/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java +++ b/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java @@ -160,6 +160,8 @@ private void initialize() severities.put(MessageId.MED_014, Severity.ERROR); severities.put(MessageId.MED_015, Severity.USAGE); severities.put(MessageId.MED_016, Severity.WARNING); + severities.put(MessageId.MED_017, Severity.WARNING); + severities.put(MessageId.MED_018, Severity.WARNING); // NAV severities.put(MessageId.NAV_001, Severity.ERROR); diff --git a/src/main/java/com/adobe/epubcheck/messages/MessageId.java b/src/main/java/com/adobe/epubcheck/messages/MessageId.java index 475d76c15..63e66921b 100644 --- a/src/main/java/com/adobe/epubcheck/messages/MessageId.java +++ b/src/main/java/com/adobe/epubcheck/messages/MessageId.java @@ -154,6 +154,8 @@ public enum MessageId implements Comparable MED_014("MED_014"), MED_015("MED_015"), MED_016("MED_016"), + MED_017("MED_017"), + MED_018("MED_018"), // Epub3 based table of content errors NAV_001("NAV-001"), diff --git a/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java b/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java index 655478a2a..731841ffb 100755 --- a/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java +++ b/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java @@ -407,6 +407,7 @@ public void checkReferences() break; case OVERLAY_TEXT_LINK: overlayLinks.add(reference); + checkReference(reference); break; default: checkReference(reference); @@ -419,11 +420,7 @@ public void checkReferences() private void checkReference(URLReference reference) { - Resource hostResource = resources.get(reference.location.url); - - // Retrieve the Resource instance representing the targeted document - // If the resource was not declared in the manifest, - // we build a new Resource object for the data URL. + // Retrieve the target resource Resource targetResource = resources.get(reference.targetDoc); String targetMimetype = (targetResource != null) ? targetResource.getMimeType() : ""; @@ -487,6 +484,7 @@ else if (!undeclared.contains(reference.targetDoc) switch (reference.type) { case HYPERLINK: + if ("epubcfi".equals(fragment.getScheme())) { break; // EPUB CFI is not supported @@ -536,6 +534,14 @@ else if (reference.type == Type.IMAGE && !targetResource.hasImageFallback()) } } break; + case OVERLAY_TEXT_LINK: + if (!OPFChecker.isBlessedItemType(targetMimetype, version)) + { + report.message(MessageId.RSC_010, + reference.location.context(container.relativize(reference.url))); + return; + } + break; case SEARCH_KEY: // TODO update when we support EPUB CFI if ((!fragment.exists() || !"epubcfi".equals(fragment.getScheme())) @@ -584,31 +590,27 @@ else if (reference.type == Type.IMAGE && !targetResource.hasImageFallback()) // Fragment integrity checks if (fragment.exists() && !fragment.isEmpty()) { - // EPUB CFI - if ("epubcfi".equals(fragment.getScheme())) - { - // FIXME HOT should warn if in MO - // FIXME epubcfi currently not supported (see issue 150). - return; - } - // Media fragments in Data Navigation Documents - else if (fragment.isMediaFragment() && hostResource != null && hostResource.hasItem() - && hostResource.getItem().getProperties() - .contains(PackageVocabs.ITEM_VOCAB.get(PackageVocabs.ITEM_PROPERTIES.DATA_NAV))) - { - // Ignore, - return; - } - // Non-ID-based fragments are ignored - else if (fragment.getId().isEmpty()) + // Check media overlays requirements + if (reference.type == Type.OVERLAY_TEXT_LINK) { - return; + // Check that references to XHTML indicate an element by ID + if (MIMEType.XHTML.is(targetMimetype) && fragment.getId().isEmpty()) + { + report.message(MessageId.MED_017, reference.location, fragment.toString()); + } + // Check that references to SVG use a SVG fragment identifier + else if (MIMEType.SVG.is(targetMimetype) && !fragment.isValid()) + { + report.message(MessageId.MED_018, reference.location, fragment.toString()); + } } - // Fragment Identifier (by default) - else if (!container.isRemote(reference.targetDoc)) + + // Check ID-based fragments + // Other fragment types (e.g. EPUB CFI) are not currently supported + if (!fragment.getId().isEmpty() && !container.isRemote(reference.targetDoc)) { - ID anchor = targetResource.ids.get(fragment.getId()); - if (anchor == null) + ID targetID = targetResource.ids.get(fragment.getId()); + if (targetID == null) { report.message(MessageId.RSC_012, reference.location.context(reference.url.toString())); return; @@ -617,7 +619,7 @@ else if (!container.isRemote(reference.targetDoc)) { case SVG_PAINT: case SVG_CLIP_PATH: - if (anchor.type != reference.type) + if (targetID.type != reference.type) { report.message(MessageId.RSC_014, reference.location.context(reference.url.toString())); return; @@ -625,7 +627,8 @@ else if (!container.isRemote(reference.targetDoc)) break; case SVG_SYMBOL: case HYPERLINK: - if (anchor.type != reference.type && anchor.type != Type.GENERIC) + case OVERLAY_TEXT_LINK: + if (targetID.type != reference.type && targetID.type != Type.GENERIC) { report.message(MessageId.RSC_014, reference.location.context(reference.url.toString())); return; diff --git a/src/main/java/com/adobe/epubcheck/ops/OPSHandler.java b/src/main/java/com/adobe/epubcheck/ops/OPSHandler.java index ad3993eaa..f2590e9f9 100755 --- a/src/main/java/com/adobe/epubcheck/ops/OPSHandler.java +++ b/src/main/java/com/adobe/epubcheck/ops/OPSHandler.java @@ -290,8 +290,6 @@ else if (name.equals("script")) checkScript(); } - resourceType = XRefChecker.Type.HYPERLINK; - String style = e.getAttribute("style"); if (style != null && style.length() > 0) { diff --git a/src/main/java/com/adobe/epubcheck/overlay/OverlayHandler.java b/src/main/java/com/adobe/epubcheck/overlay/OverlayHandler.java index 6903e0036..59cf5e24a 100644 --- a/src/main/java/com/adobe/epubcheck/overlay/OverlayHandler.java +++ b/src/main/java/com/adobe/epubcheck/overlay/OverlayHandler.java @@ -12,6 +12,7 @@ import com.adobe.epubcheck.opf.OPFChecker30; import com.adobe.epubcheck.opf.ValidationContext; import com.adobe.epubcheck.opf.XRefChecker; +import com.adobe.epubcheck.opf.XRefChecker.Type; import com.adobe.epubcheck.util.EpubConstants; import com.adobe.epubcheck.vocab.AggregateVocab; import com.adobe.epubcheck.vocab.PackageVocabs; @@ -22,7 +23,6 @@ import com.adobe.epubcheck.vocab.VocabUtil; import com.adobe.epubcheck.xml.handlers.XMLHandler; import com.adobe.epubcheck.xml.model.XMLElement; -import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; @@ -54,6 +54,8 @@ public void startElement() XMLElement e = currentElement(); String name = e.getName(); + processGlobalAttrs(); + switch (name) { case "smil": @@ -64,8 +66,7 @@ public void startElement() case "body": case "seq": - case "par": - processGlobalAttrs(); + processTextRef(); break; case "text": @@ -140,79 +141,65 @@ private void checkType(String type) private void processTextSrc() { - URL srcURL = checkURL(currentElement().getAttribute("src")); - if (srcURL != null) + URL url = checkURL(currentElement().getAttribute("src")); + if (url != null && context.xrefChecker.isPresent()) { - processRef(srcURL, XRefChecker.Type.HYPERLINK); - - if (context.xrefChecker.isPresent()) - { - context.xrefChecker.get().registerReference(srcURL, XRefChecker.Type.OVERLAY_TEXT_LINK, - location()); - } + processContentDocumentLink(url); } } + private void processTextRef() + { + URL url = checkURL( + currentElement().getAttributeNS(EpubConstants.EpubTypeNamespaceUri, "textref")); + if (url != null && context.xrefChecker.isPresent()) + { + processContentDocumentLink(url); + } + } + private void processAudioSrc() { - URL srcURL = checkURL(currentElement().getAttribute("src")); - if (srcURL != null) + URL url = checkURL(currentElement().getAttribute("src")); + if (url != null && context.xrefChecker.isPresent()) { - processRef(srcURL, XRefChecker.Type.AUDIO); + // check that the audio type is a core media type resource + String mimeType = context.xrefChecker.get().getMimeType(url); + if (mimeType != null && !OPFChecker30.isBlessedAudioType(mimeType)) + { + report.message(MessageId.MED_005, location(), context.relativize(url), mimeType); + } + + // register the URL for cross-reference checking + context.xrefChecker.get().registerReference(url, Type.AUDIO, location()); - if (context.isRemote(srcURL)) + // if needed, register we found a remote resource + if (context.isRemote(url)) { requiredProperties.add(ITEM_PROPERTIES.REMOTE_RESOURCES); } } } - private void processRef(URL ref, XRefChecker.Type type) + private void processContentDocumentLink(URL url) { - assert ref != null; - if (context.xrefChecker.isPresent()) + assert url != null; + assert context.xrefChecker.isPresent(); + assert context.overlayTextChecker.isPresent(); + URL documentURL = URLUtils.docURL(url); + if (!context.overlayTextChecker.get().registerOverlay(documentURL, + context.opfItem.get().getId())) { - if (type == XRefChecker.Type.AUDIO) - { - String mimeType = context.xrefChecker.get().getMimeType(ref); - if (mimeType != null && !OPFChecker30.isBlessedAudioType(mimeType)) - { - report.message(MessageId.MED_005, location(), context.relativize(ref), mimeType); - } - } - else - { - checkFragment(ref); - URL resourceURL = URLUtils.docURL(ref); - // FIXME 2022 see if test case is needed - // if (!Strings.isNullOrEmpty(uniqueResource)) - // { - // (uniqueResource was ref-minus-fragment string) - // OverlayTextChecker must be present if XRefChecker is also present - assert context.overlayTextChecker.isPresent(); - if (!context.overlayTextChecker.get().registerOverlay(resourceURL, context.opfItem.get().getId())) - { - report.message(MessageId.MED_011, location(), context.relativize(ref)); - } - // } - } - context.xrefChecker.get().registerReference(ref, type, location()); + report.message(MessageId.MED_011, location(), context.relativize(url)); } + context.xrefChecker.get().registerReference(url, Type.OVERLAY_TEXT_LINK, location()); } private void processGlobalAttrs() { XMLElement e = currentElement(); - if (!e.getName().equals("audio")) - { - URL textrefURL = checkURL(e.getAttributeNS(EpubConstants.EpubTypeNamespaceUri, "textref")); - if (textrefURL != null) - { - processRef(textrefURL, XRefChecker.Type.HYPERLINK); - } - } checkType(e.getAttributeNS(EpubConstants.EpubTypeNamespaceUri, "type")); } @@ -238,17 +225,6 @@ private void checkItemReferences() } - private void checkFragment(URL url) - { - String fragment = url.fragment(); - - if (Strings.isNullOrEmpty(fragment)) - { - // must include a non-empty fragid - report.message(MessageId.MED_014, location()); - } - } - protected void checkProperties() { if (!context.container.isPresent()) // single file validation diff --git a/src/main/java/com/adobe/epubcheck/overlay/OverlayTextChecker.java b/src/main/java/com/adobe/epubcheck/overlay/OverlayTextChecker.java index ee974abd6..37466d0db 100644 --- a/src/main/java/com/adobe/epubcheck/overlay/OverlayTextChecker.java +++ b/src/main/java/com/adobe/epubcheck/overlay/OverlayTextChecker.java @@ -24,8 +24,7 @@ public boolean registerOverlay(URL contentDocURL, String overlayID) } else { - // TODO check if case must really be ignored - return overlayID.equalsIgnoreCase(docToOverlayMap.get(contentDocURL)); + return overlayID.equals(docToOverlayMap.get(contentDocURL)); } } @@ -40,7 +39,6 @@ public boolean isReferencedByOverlay(URL contentDocURL) public boolean isCorrectOverlay(URL contentDocURL, String overlayID) { - // TODO check if case must really be ignored - return overlayID.equalsIgnoreCase(docToOverlayMap.get(contentDocURL)); + return overlayID.equals(docToOverlayMap.get(contentDocURL)); } } diff --git a/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties b/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties index 9c361cf09..a5ae619f9 100644 --- a/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties +++ b/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties @@ -144,7 +144,9 @@ MED_012=The "media-overlay" attribute does not match the ID of the Media Overlay MED_013=Media Overlay Document referenced from the "media-overlay" attribute does not contain a reference to this Content Document. MED_014=A non-empty fragment identifier is required. MED_015=Media overlay text references must be in reading order. Text target "%1$s" is before the previous link target in %2$s order. -MED_016=Media Overlays total duration should be the sum of the durations of all Media Overlays documents. +MED_016=Media Overlays total duration should be the sum of the durations of all Media Overlays documents. +MED_017=URL fragment should indicate an element ID, but found '#%1$s'. +MED_018=URL fragment should be an SVG fragment identifier, but found '#%1$s'. #NAV EPUB v3 Table of contents NAV_001=The nav file is not supported for EPUB v2. diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/content_001.mp3 b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/content_001.mp3 similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/content_001.mp3 rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/content_001.mp3 diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/content_001.smil b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/content_001.smil new file mode 100644 index 000000000..d08dc8bdf --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/content_001.smil @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/content_001.xhtml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/content_001.xhtml similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/content_001.xhtml rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/content_001.xhtml diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/nav.xhtml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/nav.xhtml similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/nav.xhtml rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/nav.xhtml diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/package.opf b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/package.opf similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/package.opf rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/EPUB/package.opf diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/META-INF/container.xml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/META-INF/container.xml similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/META-INF/container.xml rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/META-INF/container.xml diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/mimetype b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/mimetype similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/mimetype rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-schemebased-warning/mimetype diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/EPUB/content_001.mp3 b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/EPUB/content_001.mp3 similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/EPUB/content_001.mp3 rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/EPUB/content_001.mp3 diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/EPUB/content_001.smil b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/EPUB/content_001.smil similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/EPUB/content_001.smil rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/EPUB/content_001.smil diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/EPUB/content_001.xhtml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/EPUB/content_001.xhtml similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/EPUB/content_001.xhtml rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/EPUB/content_001.xhtml diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/EPUB/nav.xhtml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/EPUB/nav.xhtml similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/EPUB/nav.xhtml rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/EPUB/nav.xhtml diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/EPUB/package.opf b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/EPUB/package.opf similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/EPUB/package.opf rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/EPUB/package.opf diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/META-INF/container.xml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/META-INF/container.xml similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/META-INF/container.xml rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/META-INF/container.xml diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/mimetype b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/mimetype similarity index 100% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-resolve-error/mimetype rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-fragment-unresolved-error/mimetype diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/content_001.mp3 b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/content_001.mp3 new file mode 100644 index 000000000..3f140bbc4 Binary files /dev/null and b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/content_001.mp3 differ diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/content_001.smil b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/content_001.smil similarity index 73% rename from src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/content_001.smil rename to src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/content_001.smil index d76eca32b..72c1f9c94 100644 --- a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-fragid-invalid-error/EPUB/content_001.smil +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/content_001.smil @@ -1,8 +1,8 @@ - + - + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/content_001.xhtml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/content_001.xhtml new file mode 100644 index 000000000..28757800c --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/content_001.xhtml @@ -0,0 +1,11 @@ + + + + + Minimal EPUB + + +

Loomings

+

Call me Ishmael.

+ + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/nav.xhtml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/nav.xhtml new file mode 100644 index 000000000..240745e63 --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/nav.xhtml @@ -0,0 +1,14 @@ + + + + + Minimal Nav + + + + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/package.opf b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/package.opf new file mode 100644 index 000000000..d45324410 --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/EPUB/package.opf @@ -0,0 +1,20 @@ + + + + Minimal EPUB 3.0 + en + NOID + 2017-06-14T00:00:01Z + 2.5s + 2.5s + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/META-INF/container.xml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/META-INF/container.xml new file mode 100644 index 000000000..318782179 --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/META-INF/container.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/mimetype b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/mimetype new file mode 100644 index 000000000..57ef03f24 --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-no-fragment-valid/mimetype @@ -0,0 +1 @@ +application/epub+zip \ No newline at end of file diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/content_001.mp3 b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/content_001.mp3 new file mode 100644 index 000000000..3f140bbc4 Binary files /dev/null and b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/content_001.mp3 differ diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/content_001.smil b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/content_001.smil new file mode 100644 index 000000000..6373498aa --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/content_001.smil @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/content_001.svg b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/content_001.svg new file mode 100644 index 000000000..cb4d2de6e --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/content_001.svg @@ -0,0 +1,6 @@ + + + SVG Content Document + Rectangle + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/nav.xhtml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/nav.xhtml new file mode 100644 index 000000000..b75e4403d --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/nav.xhtml @@ -0,0 +1,14 @@ + + + + + Minimal Nav + + + + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/package.opf b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/package.opf new file mode 100644 index 000000000..454ecc580 --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/EPUB/package.opf @@ -0,0 +1,20 @@ + + + + Minimal EPUB 3.0 + en + NOID + 2017-06-14T00:00:01Z + 2.5s + 2.5s + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/META-INF/container.xml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/META-INF/container.xml new file mode 100644 index 000000000..318782179 --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/META-INF/container.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/mimetype b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/mimetype new file mode 100644 index 000000000..57ef03f24 --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-invalid-warning/mimetype @@ -0,0 +1 @@ +application/epub+zip \ No newline at end of file diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/content_001.mp3 b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/content_001.mp3 new file mode 100644 index 000000000..3f140bbc4 Binary files /dev/null and b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/content_001.mp3 differ diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/content_001.smil b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/content_001.smil new file mode 100644 index 000000000..0d7c9439f --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/content_001.smil @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/content_001.svg b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/content_001.svg new file mode 100644 index 000000000..cb4d2de6e --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/content_001.svg @@ -0,0 +1,6 @@ + + + SVG Content Document + Rectangle + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/nav.xhtml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/nav.xhtml new file mode 100644 index 000000000..b75e4403d --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/nav.xhtml @@ -0,0 +1,14 @@ + + + + + Minimal Nav + + + + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/package.opf b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/package.opf new file mode 100644 index 000000000..454ecc580 --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/EPUB/package.opf @@ -0,0 +1,20 @@ + + + + Minimal EPUB 3.0 + en + NOID + 2017-06-14T00:00:01Z + 2.5s + 2.5s + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/META-INF/container.xml b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/META-INF/container.xml new file mode 100644 index 000000000..318782179 --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/META-INF/container.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/mimetype b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/mimetype new file mode 100644 index 000000000..57ef03f24 --- /dev/null +++ b/src/test/resources/epub3/09-media-overlays/files/mediaoverlays-textref-svg-fragment-viewbox-valid/mimetype @@ -0,0 +1 @@ +application/epub+zip \ No newline at end of file diff --git a/src/test/resources/epub3/09-media-overlays/media-overlays.feature b/src/test/resources/epub3/09-media-overlays/media-overlays.feature index 027a47b6a..5a84c3934 100644 --- a/src/test/resources/epub3/09-media-overlays/media-overlays.feature +++ b/src/test/resources/epub3/09-media-overlays/media-overlays.feature @@ -69,12 +69,6 @@ Feature: EPUB 3 — Media Overlays | RSC-005 | element "audio" not allowed here | And no other errors or warnings are reported - @spec @xref:sec-smil-seq-elem - Scenario: Report a fragment identifier that does not resolve to an element - When checking EPUB 'mediaoverlays-fragid-resolve-error' - Then error RSC-012 is reported - And no other errors or warnings are reported - #### 9.2.2.6 The `par` element @@ -94,12 +88,6 @@ Feature: EPUB 3 — Media Overlays #### 9.2.2.7 The `text` element - - @spec @xref:sec-smil-text-elem @xref:sec-smil-body-elem - Scenario: Report empty fragment identifiers - When checking EPUB 'mediaoverlays-fragid-invalid-error' - Then error MED-014 is reported 2 times - And no other errors or warnings are reported #### 9.2.2.8 The `audio` element @@ -153,7 +141,36 @@ Feature: EPUB 3 — Media Overlays When checking EPUB 'mediaoverlays-text-reading-order-error' Then usage MED-015 is reported And no other errors or warnings are reported + + ### 9.3.2.2 Referencing document fragments + + @spec @xref:sec-media-overlays-fragids + Scenario: Allow empty fragment identifiers + When checking EPUB 'mediaoverlays-textref-no-fragment-valid' + Then no errors or warnings are reported + @spec @xref:sec-media-overlays-fragids + Scenario: Report a fragment identifier that does not resolve to an element + When checking EPUB 'mediaoverlays-textref-fragment-unresolved-error' + Then error RSC-012 is reported + And no other errors or warnings are reported + + @spec @xref:sec-media-overlays-fragids + Scenario: Warn about XHTML scheme-based fragments + When checking EPUB 'mediaoverlays-textref-fragment-schemebased-warning' + Then warning MED-017 is reported + And no other errors or warnings are reported + + @spec @xref:sec-media-overlays-fragids + Scenario: Allow SVG fragment identifiers + When checking EPUB 'mediaoverlays-textref-svg-fragment-viewbox-valid' + Then no errors or warnings are reported + + @spec @xref:sec-media-overlays-fragids + Scenario: Warn about invalid SVG fragment identifiers + When checking EPUB 'mediaoverlays-textref-svg-fragment-invalid-warning' + Then warning MED-018 is reported + And no other errors or warnings are reported ### 9.3.3 Structural semantics