Skip to content

Commit 9dffa11

Browse files
authored
Implement sniffing of CSS and JS files (readium#455)
1 parent 5e807f6 commit 9dffa11

File tree

4 files changed

+104
-1
lines changed

4 files changed

+104
-1
lines changed

readium/shared/src/main/java/org/readium/r2/shared/util/asset/Defaults.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ import org.readium.r2.shared.util.format.ArchiveSniffer
1515
import org.readium.r2.shared.util.format.AudioSniffer
1616
import org.readium.r2.shared.util.format.BitmapSniffer
1717
import org.readium.r2.shared.util.format.CompositeFormatSniffer
18+
import org.readium.r2.shared.util.format.CssSniffer
1819
import org.readium.r2.shared.util.format.EpubDrmSniffer
1920
import org.readium.r2.shared.util.format.EpubSniffer
2021
import org.readium.r2.shared.util.format.FormatSniffer
2122
import org.readium.r2.shared.util.format.HtmlSniffer
23+
import org.readium.r2.shared.util.format.JavaScriptSniffer
2224
import org.readium.r2.shared.util.format.JsonSniffer
2325
import org.readium.r2.shared.util.format.LcpLicenseSniffer
2426
import org.readium.r2.shared.util.format.LpfSniffer
@@ -92,5 +94,7 @@ public class DefaultFormatSniffer(
9294
LcpLicenseSniffer,
9395
EpubDrmSniffer,
9496
W3cWpubSniffer,
95-
RwpmSniffer
97+
RwpmSniffer,
98+
CssSniffer,
99+
JavaScriptSniffer
96100
)

readium/shared/src/main/java/org/readium/r2/shared/util/format/Format.kt

+8
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,11 @@ public object Opds1EntrySpecification : Specification
137137
public object Opds2CatalogSpecification : Specification
138138
public object Opds2PublicationSpecification : Specification
139139
public object OpdsAuthenticationSpecification : Specification
140+
141+
/*
142+
* Language specifications
143+
*/
144+
145+
public object JavaScriptSpecification : Specification
146+
147+
public object CssSpecification : Specification

readium/shared/src/main/java/org/readium/r2/shared/util/format/Sniffers.kt

+49
Original file line numberDiff line numberDiff line change
@@ -1260,6 +1260,55 @@ public object EpubDrmSniffer : FormatSniffer {
12601260
}
12611261
}
12621262

1263+
/**
1264+
* Sniffs CSS.
1265+
*/
1266+
1267+
public object CssSniffer : FormatSniffer {
1268+
override fun sniffHints(format: Format, hints: FormatHints): Format {
1269+
if (format.hasAnySpecification()) {
1270+
return format
1271+
}
1272+
1273+
if (hints.hasFileExtension("css") ||
1274+
hints.hasMediaType("text/css")
1275+
) {
1276+
return Format(
1277+
specification = FormatSpecification(CssSpecification),
1278+
mediaType = MediaType.CSS,
1279+
fileExtension = FileExtension("css")
1280+
)
1281+
}
1282+
1283+
return format
1284+
}
1285+
}
1286+
1287+
/**
1288+
* Sniffs JavaScript.
1289+
*/
1290+
1291+
public object JavaScriptSniffer : FormatSniffer {
1292+
override fun sniffHints(format: Format, hints: FormatHints): Format {
1293+
if (format.hasAnySpecification()) {
1294+
return format
1295+
}
1296+
1297+
if (hints.hasFileExtension("js") ||
1298+
hints.hasMediaType("text/javascript") ||
1299+
hints.hasMediaType("application/javascript")
1300+
) {
1301+
return Format(
1302+
specification = FormatSpecification(JavaScriptSpecification),
1303+
mediaType = MediaType.JAVASCRIPT,
1304+
fileExtension = FileExtension("js")
1305+
)
1306+
}
1307+
1308+
return format
1309+
}
1310+
}
1311+
12631312
private suspend fun Readable.canReadWholeBlob() =
12641313
length().getOrDefault(0) < 5 * 1000 * 1000
12651314

readium/shared/src/test/java/org/readium/r2/shared/util/asset/AssetSnifferTest.kt

+42
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import org.readium.r2.shared.util.data.EmptyContainer
2020
import org.readium.r2.shared.util.file.FileResource
2121
import org.readium.r2.shared.util.format.AvifSpecification
2222
import org.readium.r2.shared.util.format.BmpSpecification
23+
import org.readium.r2.shared.util.format.CssSpecification
2324
import org.readium.r2.shared.util.format.EpubSpecification
2425
import org.readium.r2.shared.util.format.Format
2526
import org.readium.r2.shared.util.format.FormatHints
@@ -28,6 +29,7 @@ import org.readium.r2.shared.util.format.GifSpecification
2829
import org.readium.r2.shared.util.format.HtmlSpecification
2930
import org.readium.r2.shared.util.format.InformalAudiobookSpecification
3031
import org.readium.r2.shared.util.format.InformalComicSpecification
32+
import org.readium.r2.shared.util.format.JavaScriptSpecification
3133
import org.readium.r2.shared.util.format.JpegSpecification
3234
import org.readium.r2.shared.util.format.JsonSpecification
3335
import org.readium.r2.shared.util.format.JxlSpecification
@@ -840,4 +842,44 @@ class AssetSnifferTest {
840842
).checkSuccess()
841843
)
842844
}
845+
846+
private val cssFormat = Format(
847+
specification = FormatSpecification(CssSpecification),
848+
mediaType = MediaType.CSS,
849+
fileExtension = FileExtension("css")
850+
)
851+
852+
@Test
853+
fun `sniff CSS`() = runBlocking {
854+
assertEquals(
855+
cssFormat,
856+
sniffer.sniffFileExtension("css").checkSuccess()
857+
)
858+
assertEquals(
859+
cssFormat,
860+
sniffer.sniffMediaType("text/css").checkSuccess()
861+
)
862+
}
863+
864+
private val jsFormat = Format(
865+
specification = FormatSpecification(JavaScriptSpecification),
866+
mediaType = MediaType.JAVASCRIPT,
867+
fileExtension = FileExtension("js")
868+
)
869+
870+
@Test
871+
fun `sniff JavaScript`() = runBlocking {
872+
assertEquals(
873+
jsFormat,
874+
sniffer.sniffFileExtension("js").checkSuccess()
875+
)
876+
assertEquals(
877+
jsFormat,
878+
sniffer.sniffMediaType("text/javascript").checkSuccess()
879+
)
880+
assertEquals(
881+
jsFormat,
882+
sniffer.sniffMediaType("application/javascript").checkSuccess()
883+
)
884+
}
843885
}

0 commit comments

Comments
 (0)