diff --git a/src/main/java/com/adobe/epubcheck/vocab/PackageVocabs.java b/src/main/java/com/adobe/epubcheck/vocab/PackageVocabs.java
index 129a22383..469124736 100644
--- a/src/main/java/com/adobe/epubcheck/vocab/PackageVocabs.java
+++ b/src/main/java/com/adobe/epubcheck/vocab/PackageVocabs.java
@@ -88,6 +88,7 @@ public static enum LINKREL_PROPERTIES implements PropertyStatus
MODS_RECORD(DEPRECATED),
ONIX_RECORD(DEPRECATED),
RECORD,
+ VOICING,
XML_SIGNATURE(DEPRECATED),
XMP_RECORD(DEPRECATED);
diff --git a/src/main/resources/com/adobe/epubcheck/schema/30/package-30.sch b/src/main/resources/com/adobe/epubcheck/schema/30/package-30.sch
index 75b99c30a..f0d8b3ab0 100644
--- a/src/main/resources/com/adobe/epubcheck/schema/30/package-30.sch
+++ b/src/main/resources/com/adobe/epubcheck/schema/30/package-30.sch
@@ -54,6 +54,13 @@
have a 'refines' attribute).
+
+
+
+ 'voicing' links must have a 'media-type' attribute identifying an audio MIME type.
+ 'voicing' links must have a 'refines' attribute.
+
+
diff --git a/src/test/java/com/adobe/epubcheck/opf/OPFCheckerTest.java b/src/test/java/com/adobe/epubcheck/opf/OPFCheckerTest.java
index 901d70c6e..6f18dc673 100644
--- a/src/test/java/com/adobe/epubcheck/opf/OPFCheckerTest.java
+++ b/src/test/java/com/adobe/epubcheck/opf/OPFCheckerTest.java
@@ -764,6 +764,37 @@ public void testLinkRelRecordWithRefines()
expectedErrors.add(MessageId.RSC_005);
testValidateDocument("invalid/link-rel-record-refines.opf", EPUBVersion.VERSION_3);
}
+
+ @Test
+ public void testLinkRelVoicing()
+ {
+ // tests that the 'voicing' link rel keyword is accepted
+ testValidateDocument("valid/link-rel-voicing.opf", EPUBVersion.VERSION_3);
+ }
+
+ @Test
+ public void testLinkRelVoicingWithNoRefinesAttribute()
+ {
+ // tests that 'voicing' links must have a 'refines' attribute
+ expectedErrors.add(MessageId.RSC_005);
+ testValidateDocument("invalid/link-rel-voicing-no-refines.opf", EPUBVersion.VERSION_3);
+ }
+
+ @Test
+ public void testLinkRelVoicingWithNoMediaType()
+ {
+ // tests that 'voicing' links must have a 'media-type' attribute
+ expectedErrors.add(MessageId.RSC_005);
+ testValidateDocument("invalid/link-rel-voicing-no-type.opf", EPUBVersion.VERSION_3);
+ }
+
+ @Test
+ public void testLinkRelVoicingWithMediaTypeNotAudio()
+ {
+ // tests that 'voicing' links must refer to resources with an audio mime type
+ expectedErrors.add(MessageId.RSC_005);
+ testValidateDocument("invalid/link-rel-voicing-not-audio.opf", EPUBVersion.VERSION_3);
+ }
@Test
public void testLink_ResourceInManifest()
diff --git a/src/test/resources/30/single/opf/invalid/link-rel-voicing-no-refines.opf b/src/test/resources/30/single/opf/invalid/link-rel-voicing-no-refines.opf
new file mode 100644
index 000000000..34cd1b43c
--- /dev/null
+++ b/src/test/resources/30/single/opf/invalid/link-rel-voicing-no-refines.opf
@@ -0,0 +1,17 @@
+
+
+
+ xxx
+ Title
+ en
+ 2019-01-01T12:00:00Z
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/30/single/opf/invalid/link-rel-voicing-no-type.opf b/src/test/resources/30/single/opf/invalid/link-rel-voicing-no-type.opf
new file mode 100644
index 000000000..21e2d5cce
--- /dev/null
+++ b/src/test/resources/30/single/opf/invalid/link-rel-voicing-no-type.opf
@@ -0,0 +1,17 @@
+
+
+
+ xxx
+ Title
+ en
+ 2019-01-01T12:00:00Z
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/30/single/opf/invalid/link-rel-voicing-not-audio.opf b/src/test/resources/30/single/opf/invalid/link-rel-voicing-not-audio.opf
new file mode 100644
index 000000000..1d0ef7177
--- /dev/null
+++ b/src/test/resources/30/single/opf/invalid/link-rel-voicing-not-audio.opf
@@ -0,0 +1,17 @@
+
+
+
+ xxx
+ Title
+ en
+ 2019-01-01T12:00:00Z
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/30/single/opf/valid/link-rel-voicing.opf b/src/test/resources/30/single/opf/valid/link-rel-voicing.opf
new file mode 100644
index 000000000..f1ab0d74d
--- /dev/null
+++ b/src/test/resources/30/single/opf/valid/link-rel-voicing.opf
@@ -0,0 +1,17 @@
+
+
+
+ xxx
+ Title
+ en
+ 2019-01-01T12:00:00Z
+
+
+
+
+
+
+
+
+