From 0b0f2e1b2db80338ab78f10d07cd6d5f95f6e126 Mon Sep 17 00:00:00 2001 From: Christiaan Baartse Date: Fri, 22 May 2020 11:15:15 +0200 Subject: [PATCH] Bugfix calling coverUrl throws error on book without cover When calling coverUrl on a book that has no cover a error is thrown > TypeError: Cannot read property 'substr' of undefined This is because Archive.getBlob is called with this.cover which is undefined. --- src/book.js | 4 ++-- test/book.js | 14 ++++++++++++++ test/fixtures/alice_without_cover.epub | Bin 0 -> 2981 bytes 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/alice_without_cover.epub diff --git a/src/book.js b/src/book.js index 0fcc30b..c75c58d 100644 --- a/src/book.js +++ b/src/book.js @@ -665,8 +665,8 @@ class Book { */ coverUrl() { var retrieved = this.loaded.cover. - then((url) => { - if(this.archived) { + then(() => { + if(this.archived && this.cover) { return this.archive.createUrl(this.cover); }else{ return this.cover; diff --git a/test/book.js b/test/book.js index a6c8539..b839f56 100644 --- a/test/book.js +++ b/test/book.js @@ -50,4 +50,18 @@ describe('Book', function() { assert( /^blob:http:\/\/localhost:9876\/[^\/]+$/.test(coverUrl), "cover url is available and a blob: url" ); }); }); + + describe('Archived epub without cover', function() { + var book = new Book("/fixtures/alice_without_cover.epub"); + + it('should open a archived epub', async function() { + await book.opened + assert.equal(book.isOpen, true, "book is opened"); + assert(book.archive, "book is unarchived"); + }); + it('should have a empty coverUrl', async function() { + let coverUrl = await book.coverUrl() + assert.equal(coverUrl, undefined, "cover url should be undefined" ); + }); + }); }); diff --git a/test/fixtures/alice_without_cover.epub b/test/fixtures/alice_without_cover.epub new file mode 100644 index 0000000000000000000000000000000000000000..b215b2aa5f424e59f386963f86ff0e1aba575f85 GIT binary patch literal 2981 zcmZ`*c{G&!8y_*Yt}UW5c5aMaWl!15PL%BHSZc;7gTYKuX$V;&#_k%EC88vIS+8{( zlp!R`m33_44mEz`cJI+2e(!sp^S;k}-p_N+^L@_e`FyO+7@7D009F7X;d+fV!lO){ zo&gSm{s{p0heMHJfl!aYK$yRm2htxApacyJ_LK|v548Rl$qMjMjWQ-1{UK9CN379< zpB@%Qc6tgXmc~k6hybLAe*pBhA_@+>`nZL?Rhipx^^Va1};L$!}<<0OM6q*sv2f3Y^S4xLm9n@}-MhcelP5(g25zh0u?rCxV2oVgLX@i~s;H zy)i3mTP37F5(W+Q@P#U({E%=M=E^|8kTM^J(md@cwS8uhfOA){Bn)u0AGd?CTCj?% z*Cmu|)<7G~Hg`t4-OcUdPW(>3@O3UbsGqn~elG&)D(I2~(~^v=KlA#7g#?I^Yd(OX`pEvWB1(r?ol@x_Pk6+1w z8EQnqlAAO=z%0m-u*o)6MB+*GELhs6<@JDwYg6C*&n-RGPnT#s-$B~7s+0gE#_@3q zHh$2C?buYAibBT98m6v{Dg5FOx#R(?2SFuqGXe9Emj*tZ@MZdhWBtNtHuMQ+9RmP3 z{+lqu>*s6}u2|UKSLSQnlgq6`rPzPVUt!Y9DYcI%oR3`A#m8!k#Xe2pt9s5Ctnvp4D{E zijC5SnNipm-f6fnn~Z$KuC|lWLQM7j{b!T$jP;+;s_fF!EU)Xi9aJ1YmeOID0%a;WJ;QIIM z13kQM9&ig0=#zGJ6)~jD{e$S{(TBa`ZaEk*Wc-0C!Q@Gju6{gQtWsB%Qi6jg%b0_` zI4zXupHgEBG$`F|YmQi@Of(^>+f^mqjMtyV6MZ&ia6F{e%SHC1&o_T>$ZqO)lXp_2 zP}y0HZ>A6Q?5QQpY=sL$MxQ2Em7$WQ1giYav|0v+WD3N8FV}3fA*CW6e=J8r*glnA ziR$+oJNb83%CLTk$XQubIs0)4n>?rgLq_Ikm7Qc|j(#`pm#}w1-8z%}X{IV4KZev$ zZl*{)6cn7jy?#FPPh?ETnf(DncU?}%l^19Z!|r&`Wa`y&raqy%6t0+04uOXL8z24H z_#0AtQRbuKtjEW}+U}K_{TJUkYToWIR}G$c_M1urK1ZJ_(-kIK7kW#+b}7}o!!x(< zy&|wdz89!1XV|Lv73iz4kL!abJ9lk>+%X+(sM|>{cy$*%8l2|hmxD{0f|ol-FP&Hy zG832Lvf$)B`}#VRV>kr2F_BpWfys|`H*fLk-ckYu4eK4{ITUyQP+|i z?=;_gwgVgGXAt02-crG^XlIHcWWo$_ySYo zyptNue`#it|9%~KkQIs82a zL*Ra}O22D#tLoi+eCvhXhIyXQS^}P-1ohSe^cOrXZs54+4*A78)p$my)9J0AtsUUA zZ~<~EWR{!Q5x}0f_Ej8*y(Eeq!hGN1(CQGj{82xxP=kuEe4`%+vGtm1xm$yETR5<2tAQMn)xrov&eLrl2Xf)SXd1<9aU%C`j|YXa90sdJXh? z!j#4=JRW?h>~G zZN7?Fx9%6A_Nu_*iSimQ2Sy16-$iC{3Hzj*5Om@Y^O|TIeXftWS!! zPE%XJX}^UhXl5|35R&+j^2$CBe_Qtx{^K)@I6mc+Xbt9X;p)H zwS34J$h;^Cf=-hyjJ}gn8Y!wBo?6@)lv7muPO#eAV*YjUYdTUD+awLZ-PxD3;GTJ9p<8&O3IghQ z?v$m8R}5rcAS3&$?2Ot{@igZ`^Yn0*vm6ui?+|FkJ8j`=#`Lnfd=!@7m*Bc{-#|R2q7bputOOI28;GFw%_M=yY^M*IL zhrjGSVGr9UhQ4zCk&Dp6xnN@?TZDDocU|0C6zcCakGqkjdX0Rk$E?j5j`1=6e`iSF z)&E@hsDsCUKJgHBv@86H0RZq(TJ+bWJ>su5jxu0}HF)WweS{tRwZKvOepq0O&W?Wy y{HON6LXVQCL+CB0pU_{#>R0el{5u5q)79>1Hd>njnGgPBrr)9T_D-=MWd8$Xf*-^H literal 0 HcmV?d00001