diff --git a/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java b/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java
index 3a242e949..0aa86617a 100644
--- a/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java
+++ b/src/main/java/com/adobe/epubcheck/messages/DefaultSeverities.java
@@ -296,7 +296,7 @@ private void initialize()
severities.put(MessageId.RSC_007, Severity.ERROR);
severities.put(MessageId.RSC_007w, Severity.WARNING);
severities.put(MessageId.RSC_008, Severity.ERROR);
- severities.put(MessageId.RSC_009, Severity.ERROR);
+ severities.put(MessageId.RSC_009, Severity.WARNING);
severities.put(MessageId.RSC_010, Severity.ERROR);
severities.put(MessageId.RSC_011, Severity.ERROR);
severities.put(MessageId.RSC_012, Severity.ERROR);
diff --git a/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java b/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java
index 2b74f671c..d077fe117 100755
--- a/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java
+++ b/src/main/java/com/adobe/epubcheck/opf/XRefChecker.java
@@ -333,7 +333,7 @@ else if (!undeclared.contains(ref.refResource)
}
break;
case IMAGE:
- if (ref.fragment != null)
+ if (ref.fragment != null && !res.item.getMimeType().equals("image/svg+xml"))
{
report.message(MessageId.RSC_009, EPUBLocation.create(ref.source, ref.lineNumber,
ref.columnNumber, ref.refResource + "#" + ref.fragment));
diff --git a/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties b/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties
index 33fd778d7..0fb8ce790 100644
--- a/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties
+++ b/src/main/resources/com/adobe/epubcheck/messages/MessageBundle.properties
@@ -305,7 +305,7 @@ RSC_006b=Resource '%1$s' is located outside the EPUB Container; please check the
RSC_007=Referenced resource '%1$s' could not be found in the EPUB.
RSC_007w=Referenced resource '%1$s' could not be found in the EPUB.
RSC_008=Referenced resource '%1$s' is not declared in the OPF manifest.
-RSC_009=A fragment identifier should not be used with an img src attribute.
+RSC_009=A non-SVG image resource should not be defined with a fragment identifier.
RSC_010=Reference to non-standard resource type found.
RSC_011=Found a reference to a resource that is not a spine item.
RSC_012=Fragment identifier is not defined.
diff --git a/src/test/java/com/adobe/epubcheck/api/Epub30CheckExpandedTest.java b/src/test/java/com/adobe/epubcheck/api/Epub30CheckExpandedTest.java
index b07991b0b..33c2c0f75 100644
--- a/src/test/java/com/adobe/epubcheck/api/Epub30CheckExpandedTest.java
+++ b/src/test/java/com/adobe/epubcheck/api/Epub30CheckExpandedTest.java
@@ -554,6 +554,22 @@ public void testValidateEPUB30_svgSwitch()
testValidateDocument("valid/svg-switch/");
}
+ @Test
+ public void testValidateEPUB30_ImageFragmentIsSVG()
+ {
+ // tests that images can point to SVG fragments
+ testValidateDocument("valid/image-fragment-svg/");
+ }
+
+ @Test
+ public void testValidateEPUB30_ImageFragmentNotSVG()
+ {
+ // tests that non-SVG images defined as fragments are reported as WARNING
+ // (1 warning for an SVG 'image' element, 1 warning for an HTML 'img' element)
+ Collections.addAll(expectedWarnings, MessageId.RSC_009, MessageId.RSC_009);
+ testValidateDocument("invalid/image-fragment-non-svg/");
+ }
+
@Test
public void testValidateEPUB30_InvalidLinks()
{
diff --git a/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java b/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java
index 2b3696303..2643162d6 100644
--- a/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java
+++ b/src/test/java/com/adobe/epubcheck/ops/OPSCheckerTest.java
@@ -756,6 +756,13 @@ public void testValidateSVG_DuplicateIds()
Collections.addAll(expectedErrors, MessageId.RSC_005, MessageId.RSC_005);
testValidateDocument("svg/invalid/duplicate-ids.svg", "image/svg+xml", EPUBVersion.VERSION_3);
}
+
+ @Test
+ public void testValidateSVG_ImageHrefWithAFragment()
+ {
+ // tests that SVG 'image' elements can have an 'xlink:href' URL pointing to a fragment
+ testValidateDocument("svg/valid/svg-image-fragment.svg", "image/svg+xml", EPUBVersion.VERSION_3);
+ }
@Test
diff --git a/src/test/resources/30/expanded/invalid/image-fragment-non-svg/META-INF/container.xml b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/META-INF/container.xml
new file mode 100644
index 000000000..cd9945b48
--- /dev/null
+++ b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/META-INF/container.xml
@@ -0,0 +1,6 @@
+
+
Call me Ishmael.
+ + + + diff --git a/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/image.jpg b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/image.jpg new file mode 100644 index 000000000..ff336a51f Binary files /dev/null and b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/image.jpg differ diff --git a/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/nav.xhtml b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/nav.xhtml new file mode 100644 index 000000000..fb044b8c6 --- /dev/null +++ b/src/test/resources/30/expanded/invalid/image-fragment-non-svg/OPS/nav.xhtml @@ -0,0 +1,19 @@ + + + + +Call me Ishmael.
+ + + + diff --git a/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/images.svg b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/images.svg new file mode 100644 index 000000000..deb18b7dd --- /dev/null +++ b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/images.svg @@ -0,0 +1,8 @@ + + diff --git a/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/nav.xhtml b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/nav.xhtml new file mode 100644 index 000000000..fb044b8c6 --- /dev/null +++ b/src/test/resources/30/expanded/valid/image-fragment-svg/OPS/nav.xhtml @@ -0,0 +1,19 @@ + + + + +