From 0b0f2e1b2db80338ab78f10d07cd6d5f95f6e126 Mon Sep 17 00:00:00 2001 From: Christiaan Baartse Date: Fri, 22 May 2020 11:15:15 +0200 Subject: [PATCH 1/2] 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 From d690dd9d6872b7155a48b7853d1c092e8f084d3d Mon Sep 17 00:00:00 2001 From: Christiaan Baartse Date: Fri, 22 May 2020 11:34:03 +0200 Subject: [PATCH 2/2] Change Book.coverUrl to return null when there is no cover CoverUrl now returns an undefined when there is no cover. However not having a cover is expected behavior for an epub without a cover. --- documentation/md/API.md | 4 ++-- src/book.js | 21 +++++++++++---------- test/book.js | 2 +- types/book.d.ts | 2 +- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/documentation/md/API.md b/documentation/md/API.md index cfad86d..60a447b 100644 --- a/documentation/md/API.md +++ b/documentation/md/API.md @@ -134,9 +134,9 @@ Set headers request should use ### coverUrl -Get the cover url +Get the cover url if there is a cover -Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)>** Promise resolves with url string +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<[?string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)>** Promise resolves with maybe a url string ### getRange diff --git a/src/book.js b/src/book.js index c75c58d..f5fd332 100644 --- a/src/book.js +++ b/src/book.js @@ -661,19 +661,20 @@ class Book { /** * Get the cover url - * @return {Promise} coverUrl + * @return {Promise} coverUrl */ coverUrl() { - var retrieved = this.loaded.cover. - then(() => { - if(this.archived && this.cover) { - return this.archive.createUrl(this.cover); - }else{ - return this.cover; - } - }); + return this.loaded.cover.then(() => { + if (!this.cover) { + return null; + } - return retrieved; + if (this.archived) { + return this.archive.createUrl(this.cover); + } else { + return this.cover; + } + }); } /** diff --git a/test/book.js b/test/book.js index b839f56..41e2753 100644 --- a/test/book.js +++ b/test/book.js @@ -61,7 +61,7 @@ describe('Book', function() { }); it('should have a empty coverUrl', async function() { let coverUrl = await book.coverUrl() - assert.equal(coverUrl, undefined, "cover url should be undefined" ); + assert.equal(coverUrl, null, "cover url should be null" ); }); }); }); diff --git a/types/book.d.ts b/types/book.d.ts index 6f4a2ee..f1326b2 100644 --- a/types/book.d.ts +++ b/types/book.d.ts @@ -65,7 +65,7 @@ export default class Book { canonical(path: string): string; - coverUrl(): Promise; + coverUrl(): Promise; destroy(): void;