From c3d767cdaecf517fc3e9b86b43f7a52ba3daff4e Mon Sep 17 00:00:00 2001 From: Romain Deltour Date: Mon, 28 Nov 2022 02:38:00 +0100 Subject: [PATCH] fix: OPF-018 was incorrectly reported with inline CSS `OPF-018` checks that the `remote-resources` property is not defined if no remote resource was found. Prior to this commit, it was incorrectly reported when an XHTML content document carrying the property also contained inline CSS: the CSS checker thought that the property was not required since no remote resource was found in the CSS itself. This commit fixes that bug by only checking `OPF-018` for standalone CSS documents. Fix #1335 --- .../com/adobe/epubcheck/css/CSSChecker.java | 4 +-- .../com/adobe/epubcheck/css/CSSHandler.java | 29 ++++++++++++------- .../EPUB/content_001.xhtml | 17 +++++++++++ .../EPUB/nav.xhtml | 14 +++++++++ .../EPUB/package.opf | 17 +++++++++++ .../META-INF/container.xml | 6 ++++ .../mimetype | 1 + .../EPUB/content_001.xhtml | 17 +++++++++++ .../EPUB/nav.xhtml | 14 +++++++++ .../EPUB/package.opf | 17 +++++++++++ .../META-INF/container.xml | 6 ++++ .../mimetype | 1 + .../package-document.feature | 12 ++++++++ 13 files changed, 142 insertions(+), 13 deletions(-) create mode 100644 src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/content_001.xhtml create mode 100644 src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/nav.xhtml create mode 100644 src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/package.opf create mode 100644 src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/META-INF/container.xml create mode 100644 src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/mimetype create mode 100644 src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/content_001.xhtml create mode 100644 src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/nav.xhtml create mode 100644 src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/package.opf create mode 100644 src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/META-INF/container.xml create mode 100644 src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/mimetype diff --git a/src/main/java/com/adobe/epubcheck/css/CSSChecker.java b/src/main/java/com/adobe/epubcheck/css/CSSChecker.java index 5f64da66a..fa71a7ed0 100644 --- a/src/main/java/com/adobe/epubcheck/css/CSSChecker.java +++ b/src/main/java/com/adobe/epubcheck/css/CSSChecker.java @@ -45,7 +45,7 @@ public class CSSChecker extends PublicationResourceChecker private int line; // where css string occurs in host private final boolean isStyleAttribute; - private enum Mode + enum Mode { FILE, STRING @@ -94,7 +94,7 @@ protected boolean checkContent() try { - CSSHandler handler = new CSSHandler(context); + CSSHandler handler = new CSSHandler(context, mode); if (this.mode == Mode.STRING && this.line > -1) { handler.setStartingLineNumber(this.line); diff --git a/src/main/java/com/adobe/epubcheck/css/CSSHandler.java b/src/main/java/com/adobe/epubcheck/css/CSSHandler.java index 67397c17b..0899ba9e9 100644 --- a/src/main/java/com/adobe/epubcheck/css/CSSHandler.java +++ b/src/main/java/com/adobe/epubcheck/css/CSSHandler.java @@ -24,6 +24,7 @@ import com.adobe.epubcheck.api.EPUBLocation; import com.adobe.epubcheck.api.Report; +import com.adobe.epubcheck.css.CSSChecker.Mode; import com.adobe.epubcheck.messages.MessageId; import com.adobe.epubcheck.opf.OPFChecker; import com.adobe.epubcheck.opf.OPFChecker30; @@ -43,6 +44,7 @@ public class CSSHandler implements CssContentHandler, CssErrorHandler final ValidationContext context; final Report report; final EPUBVersion version; + final Mode mode; int startingLineNumber = 0; // append to line info from css parser int startingColumnNumber = 0; static final CharMatcher SPACE_AND_QUOTES = CharMatcher.anyOf(" \t\n\r\f\"'").precomputed(); @@ -64,11 +66,12 @@ public class CSSHandler implements CssContentHandler, CssErrorHandler // properties the must be declared on the related OPF item final Set detectedProperties = EnumSet.noneOf(ITEM_PROPERTIES.class); - public CSSHandler(ValidationContext context) + public CSSHandler(ValidationContext context, Mode mode) { this.context = context; this.report = context.report; this.version = context.version; + this.mode = mode; this.urlChecker = new URLChecker(context); } @@ -447,17 +450,21 @@ protected void checkProperties() EPUBLocation.of(context).at(startingLineNumber, startingColumnNumber), PackageVocabs.ITEM_VOCAB.getName(property)); } - - // Check that properties declared in the OPF item were found in the content - Set uncheckedProperties = Sets - .difference(declaredProperties, detectedProperties) - .copyInto(EnumSet.noneOf(ITEM_PROPERTIES.class)); - if (uncheckedProperties.contains(ITEM_PROPERTIES.REMOTE_RESOURCES)) - { - uncheckedProperties.remove(ITEM_PROPERTIES.REMOTE_RESOURCES); - report.message(MessageId.OPF_018, - EPUBLocation.of(context).at(startingLineNumber, startingColumnNumber)); + + if (mode == Mode.FILE) { + // Check that properties declared in the OPF item were found in the content + // We only check this for standalone CSS documents (not CSS inlined in HTML) + Set uncheckedProperties = Sets + .difference(declaredProperties, detectedProperties) + .copyInto(EnumSet.noneOf(ITEM_PROPERTIES.class)); + if (uncheckedProperties.contains(ITEM_PROPERTIES.REMOTE_RESOURCES)) + { + uncheckedProperties.remove(ITEM_PROPERTIES.REMOTE_RESOURCES); + report.message(MessageId.OPF_018, + EPUBLocation.of(context).at(startingLineNumber, startingColumnNumber)); + } } + } public void setStartingLineNumber(int offset) diff --git a/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/content_001.xhtml b/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/content_001.xhtml new file mode 100644 index 000000000..054410cf8 --- /dev/null +++ b/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/content_001.xhtml @@ -0,0 +1,17 @@ + + + + + Minimal EPUB + + + +

Loomings

+

Call me Ishmael.

+ + diff --git a/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/nav.xhtml b/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/nav.xhtml new file mode 100644 index 000000000..240745e63 --- /dev/null +++ b/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/nav.xhtml @@ -0,0 +1,14 @@ + + + + + Minimal Nav + + + + + diff --git a/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/package.opf b/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/package.opf new file mode 100644 index 000000000..9515dab81 --- /dev/null +++ b/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/EPUB/package.opf @@ -0,0 +1,17 @@ + + + + Minimal EPUB 3.0 + en + NOID + 2017-06-14T00:00:01Z + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/META-INF/container.xml b/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/META-INF/container.xml new file mode 100644 index 000000000..318782179 --- /dev/null +++ b/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/META-INF/container.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/mimetype b/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/mimetype new file mode 100644 index 000000000..57ef03f24 --- /dev/null +++ b/src/test/resources/epub3/05-package-document/files/package-remote-font-in-inline-css-missing-property-error/mimetype @@ -0,0 +1 @@ +application/epub+zip \ No newline at end of file diff --git a/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/content_001.xhtml b/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/content_001.xhtml new file mode 100644 index 000000000..ffd82f624 --- /dev/null +++ b/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/content_001.xhtml @@ -0,0 +1,17 @@ + + + + + Minimal EPUB + + + +

Loomings

+

Call me Ishmael.

+ + + diff --git a/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/nav.xhtml b/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/nav.xhtml new file mode 100644 index 000000000..240745e63 --- /dev/null +++ b/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/nav.xhtml @@ -0,0 +1,14 @@ + + + + + Minimal Nav + + + + + diff --git a/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/package.opf b/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/package.opf new file mode 100644 index 000000000..1f9502b4b --- /dev/null +++ b/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/EPUB/package.opf @@ -0,0 +1,17 @@ + + + + Minimal EPUB 3.0 + en + NOID + 2017-06-14T00:00:01Z + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/META-INF/container.xml b/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/META-INF/container.xml new file mode 100644 index 000000000..318782179 --- /dev/null +++ b/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/META-INF/container.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/mimetype b/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/mimetype new file mode 100644 index 000000000..57ef03f24 --- /dev/null +++ b/src/test/resources/epub3/05-package-document/files/package-remote-resource-and-inline-css-valid/mimetype @@ -0,0 +1 @@ +application/epub+zip \ No newline at end of file diff --git a/src/test/resources/epub3/05-package-document/package-document.feature b/src/test/resources/epub3/05-package-document/package-document.feature index 14eedc812..cf9991e69 100644 --- a/src/test/resources/epub3/05-package-document/package-document.feature +++ b/src/test/resources/epub3/05-package-document/package-document.feature @@ -534,6 +534,12 @@ Feature: EPUB 3 — Package document Then error OPF-014 is reported And no other errors or warnings are reported + @spec @xref:sec-item-resource-properties + Scenario: Report a missing `remote-resources` property when inline CSS has remote references + When checking EPUB 'package-remote-font-in-inline-css-missing-property-error' + Then error OPF-014 is reported + And no other errors or warnings are reported + @spec @xref:sec-item-resource-properties Scenario: Report an SVG using remote fonts without the `remote-resource` property set in the package document When checking EPUB 'package-remote-font-in-svg-missing-property-error' @@ -570,6 +576,12 @@ Feature: EPUB 3 — Package document Then error OPF-014 is reported And no other errors or warnings are reported + @spec @xref:sec-item-resource-properties + Scenario: Verify that inline CSS does not trigger an unrequired `remote-resources` property error + When checking EPUB 'package-remote-resource-and-inline-css-valid' + Then no errors or warnings are reported + + ##### scripted @spec @xref:sec-item-resource-properties