From 446c0275e0c653ec508e475fc3d1abcb6322b92d Mon Sep 17 00:00:00 2001 From: j <0x006A@0x2620.org> Date: Thu, 9 Jan 2014 14:05:57 +0530 Subject: [PATCH] update pdf.js --- .../pdf.js/images/findbarButton-next-rtl.png | Bin 371 -> 272 bytes static/pdf.js/images/findbarButton-next.png | Bin 381 -> 268 bytes .../images/findbarButton-previous-rtl.png | Bin 381 -> 268 bytes .../pdf.js/images/findbarButton-previous.png | Bin 371 -> 272 bytes static/pdf.js/images/loading-small.png | Bin 9025 -> 3612 bytes .../secondaryToolbarButton-firstPage.png | Bin 1291 -> 340 bytes .../secondaryToolbarButton-lastPage.png | Bin 1188 -> 315 bytes .../secondaryToolbarButton-rotateCcw.png | Bin 3061 -> 414 bytes .../secondaryToolbarButton-rotateCw.png | Bin 3066 -> 414 bytes static/pdf.js/images/shadow.png | Bin 454 -> 290 bytes static/pdf.js/images/texture.png | Bin 2459 -> 2418 bytes .../pdf.js/images/toolbarButton-bookmark.png | Bin 244 -> 210 bytes .../pdf.js/images/toolbarButton-download.png | Bin 512 -> 343 bytes .../images/toolbarButton-menuArrows.png | Bin 237 -> 200 bytes .../pdf.js/images/toolbarButton-openFile.png | Bin 417 -> 348 bytes .../images/toolbarButton-pageDown-rtl.png | Bin 558 -> 462 bytes .../pdf.js/images/toolbarButton-pageDown.png | Bin 353 -> 296 bytes .../images/toolbarButton-pageUp-rtl.png | Bin 426 -> 310 bytes static/pdf.js/images/toolbarButton-pageUp.png | Bin 344 -> 307 bytes .../images/toolbarButton-presentationMode.png | Bin 491 -> 450 bytes static/pdf.js/images/toolbarButton-print.png | Bin 474 -> 437 bytes static/pdf.js/images/toolbarButton-search.png | Bin 503 -> 411 bytes ...olbarButton-secondaryToolbarToggle-rtl.png | Bin 1221 -> 583 bytes .../toolbarButton-secondaryToolbarToggle.png | Bin 302 -> 296 bytes .../toolbarButton-sidebarToggle-rtl.png | Bin 1193 -> 548 bytes .../images/toolbarButton-sidebarToggle.png | Bin 349 -> 306 bytes .../images/toolbarButton-viewOutline-rtl.png | Bin 3036 -> 405 bytes .../images/toolbarButton-viewOutline.png | Bin 300 -> 261 bytes .../images/toolbarButton-viewThumbnail.png | Bin 211 -> 182 bytes .../pdf.js/images/toolbarButton-zoomOut.png | Bin 143 -> 141 bytes static/pdf.js/locale/es/viewer.properties | 9 +- static/pdf.js/pdf.js | 357 ++++++++----- static/pdf.js/pdf.worker.js | 502 ++++++++++++------ static/pdf.js/viewer.js | 248 +++++---- 34 files changed, 702 insertions(+), 414 deletions(-) diff --git a/static/pdf.js/images/findbarButton-next-rtl.png b/static/pdf.js/images/findbarButton-next-rtl.png index 08a2c25327d7df3c77186cc3048bf02b7e72f393..4b5551e23600acf956df706d73cab427db50b90c 100644 GIT binary patch delta 244 zcmV+{%>G# zW#Gdq&8xbl`~TYiYZ-zV1mL2~NV?Z`{a*os422BN3|7LH_NFC+8I)8*3W-H+ u|I7ZDp#&6qP_JtFUw|v9iHIy5(G38jXr5&x9k}fP0000X?- delta 344 zcmV-e0jK_u0`mfpB!2>8OGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA00(qQ zO+^RX3I!GvFvOasTmS$81W80eR4C7Nkj+ZNKoo_)n}*aD3>x6#~cz*bByt9JFw?s8?3-v{BJ0Jx@)|j*!Bbc-rqj&kHulwyq z1cLxz00A-?xOfDEleUlICxnc7m*!)4qfRlNmrS0eSo7*=FUBAe^Fo5gCqWZQnd9YQCjxopiRgEdinsl<+XWP3 qGX8Z=Bi;-N9t%kY>zK~!%*)ZkHew>0000Q6$+<-A&dniceemt#Srqp_i2AW81{i75_@|yNI}5= z4lJ8OGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA00(qQ zO+^RX3I!G(02r)(dH?_c4oO5oR4C7Nkv&TTK@f(Y-90Y%Vd6n5!H_~tVUgA!AZTNw zO(H_jLJ+}!BZ#0N2#Q)LXcPP=DZNqxLcrwq64&DH!gAtUEPu1}KC{g1C~Qf5JYZ(0 zY`HA=4{6~34>Y$nUyp4>0?NXx%y!n^PO8lU5vvjOn@v3E&~2En%3 zM*;>A02l=3;j?=|jFv2*(IokqkYu+`?f#Sot_0GOokeN4@_t0%AeiK{n7pfbJT>4j zCFQRS;-#{C!&|q*7Zc>X+7!fN*f}Rg3tB`d0!AnT+9t#x?!tqsY)prN^>D-@t8g3j za=ZN1Ka9{%wcd4Mm*vswpRr;uOO)2_p-AlNUke&ra5_KluK)l507*qoM6N<$f)qlV AY5)KL diff --git a/static/pdf.js/images/findbarButton-previous-rtl.png b/static/pdf.js/images/findbarButton-previous-rtl.png index beef8ccea48c932571c9c9009df916a61c850a1c..f681e4ee44e4dd520759b974a7a1f6f868f30894 100644 GIT binary patch delta 240 zcmVQ6$+<-A&dniceemt#Srqp_i2AW81{i75_@|yNI}5= z4lJ8OGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA00(qQ zO+^RX3I!G(02r)(dH?_c4oO5oR4C7Nkv&TTK@f(Y-90Y%Vd6n5!H_~tVUgA!AZTNw zO(H_jLJ+}!BZ#0N2#Q)LXcPP=DZNqxLcrwq64&DH!gAtUEPu1}KC{g1C~Qf5JYZ(0 zY`HA=4{6~34>Y$nUyp4>0?NXx%y!n^PO8lU5vvjOn@v3E&~2En%3 zM*;>A02l=3;j?=|jFv2*(IokqkYu+`?f#Sot_0GOokeN4@_t0%AeiK{n7pfbJT>4j zCFQRS;-#{C!&|q*7Zc>X+7!fN*f}Rg3tB`d0!AnT+9t#x?!tqsY)prN^>D-@t8g3j za=ZN1Ka9{%wcd4Mm*vswpRr;uOO)2_p-AlNUke&ra5_KluK)l507*qoM6N<$f)qlV AY5)KL diff --git a/static/pdf.js/images/findbarButton-previous.png b/static/pdf.js/images/findbarButton-previous.png index 08a2c25327d7df3c77186cc3048bf02b7e72f393..4b5551e23600acf956df706d73cab427db50b90c 100644 GIT binary patch delta 244 zcmV+{%>G# zW#Gdq&8xbl`~TYiYZ-zV1mL2~NV?Z`{a*os422BN3|7LH_NFC+8I)8*3W-H+ u|I7ZDp#&6qP_JtFUw|v9iHIy5(G38jXr5&x9k}fP0000X?- delta 344 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 hz@LRXHuETLi_&HcR;M1%flMGcckUd70Th9N zS+iyVMIaC&aGTekukOP4MMlFODYTfBJjpFe-Tefzd((ISY-1q&7c z84xpf?%WB~2-LOwOT97B6qS-7KcM|V+mzWR&sxBs*37lqb?f|H&0D(H_jasU)3#Ks zc_ssIE(1f8kD@nFeX*yDV@O5Z+;gY-4jJ&c1oB%r%#!lD{C)R_|NlFB0|b*AkK8;P z%llW+_uTI7Dyl7~>xy|7JT&HEsh|DO;{46TebpHa@3fA2aqHaB^P0G61JkBh@5|eI zuY`G&U!OnkmmjyK+~&vLW}6nL&gGk(8M|-(zb_1b^4Q|sYioso)-!mz`njxgN@xNA Do0FTA literal 1291 zcmbVMZD`zN9MAQb&b7tCKFqEKpJf)5^^!~4OM7W!FS+E}gI?EN4|ZB;&0U`BrEQXH zl6u#IaBid6IYF5s7KXKmesb)PAzF1puTY052#&S%gKQrho30G2!*=C-()Ow!$^?@< zd0z7W{r>Nn>gn#NK5*m!hGEs=PBDt+gU;Ch74nkR2H!r)3Zt!`j+&896x&ZIFP2s?Oo7b60Vo zDja^w7x6|iL6}xMCrsEo(H%=p3@7~x-u^sj%dv<+gSHHE+K6tkIS$|AWzpI>CULMO zVh?lpwo&m&4+t721U{nClk`#)U>JgG@-Yn60BA2olV0>N9;%7;F)ZB-b}k%gGnEt@ z6+=6^(2m2?ww+-~GMmj3*+#-J2T98B_d6Uk?LiVAYh1VGoJY5gl^H~6B~3MBtA-97 zMmb@O*&L26-F89CL?XMyy0sH16f!a=XGn_hlA7lDwIyxYQTUG;drDie@eCxR&@#r% zB+5tXSQ(6B_h?0qAhL!%VX7!8@`z|8$26$hVUfep7eY}LR`i9?-7GPTz)Lhm@jTNa z2$Em&2_hu~y=9KQuuTF(^SnZoH()EY6ia38~5tznUm<(3l< zOQm*qeSYdyAy9Cg4}7<;NCz68EPnaS?XN0|C*t|yXD@u3T3B9Ms(EGO&o|zB>S9A6 zbF(;gK~>c&fPC%b&u;3?%6`|Vr>nTQxL+)|3cp_er0-Cm&M;Q@1@2G>OKkRD-A7b_ z1QtL2&bywz>y_tkdO%g;OmW7%u{JZ*|AnnK_uQHQ{nZP1`NZwXJk~g!T3UGh@W-K! zj^mq~8xJ1*@P7MyrH6mbFBXeyeFFmnosuMtZm$24&ENUD;{Jf*{$~2H=f$_{YHN=_ zu9UE$_4#Yp)+^8QBQrM)j^lU;Vg1a}tUT$RZzAKD!BK+fKJsDB5X)4VPh6dyo&9mL zy7u0gD%V2m>h~9053Q`M*ntnal(oWd%UAB6o15FHIM<8c%Ks9|V{Yu^h0|x#pZ`?v O{GP&6w|Gf->Ga>4J;0^_ diff --git a/static/pdf.js/images/secondaryToolbarButton-lastPage.png b/static/pdf.js/images/secondaryToolbarButton-lastPage.png index 3967cc619606b37c53d2a62478143374fe950949..55a9efe42f1318ada3290f56edc9214eab3d7fdd 100644 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*>;M1%flMGcckUd70Th9Q zS+i!r1%Zr3ixvT;fQ-e97cW?_;Lo2w-@bj@xpOB_aM`kDKyvHWtw32IF2fsg%nDH{D5`_ZDUiOJZr(~W-hgvu5C+sJDOLl$z9*OrCDtLuI{a8?%QSq z)n<9RIEH8hPd#^&&%r>X<)Nl-mUdQl?)(4K`X+U`DE-_0a~<1{_-X9rsq+@T>pl_w z#dODo;u_QJg9mp6gg#m|G6y3m<6X5(om-!$&A6oc iCHEzZ&BLcJ)2*-FWo>rwnsWeXD}$%2pUXO@geCwxg_3>% literal 1188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDi`Xl(9gVe07U=4Rw* zYH8>U)9aF-T$-DjR|3H{644~kf%h=vIPQxAvk`JC z-DPigJ$m#mGscyyFBxB^vI*5U{&?NSEB#JeTYL4Z z*RQ*s_8#kDE!K(K^TV^I=1+~nZ^IKu&jhG9@<#5j`x`5&aN+W0;s3wC>wi8!-`?`y zpPz@1u`s^zo~BbNATDmszD#oU{f3CjmzS2_J@93tTt~R`$Epbu9(=3V>KPhE^rE+| z5noZr&Cz^ghl%kcLzlAG*Vb|>^ljh%ohjxVo1}tS_O&%J+}zy73+n$12)D$jTi z8zg@zSM0x$`<_en?PEc{&o7^GmH5U#{IloxtM`swx^iK$-+!>2N@HYbkzx?YVtAmc zZ?K1H$q%;2|CnFQ+Sqh{p=ax)Sv%PF9iLI})c05F!S{TtE8fwJ3=Q?)dD&jet=(e> PbP$85tDnm{r-UW|ClUC! literal 3061 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 YWOatv5#0Ns01E&B07*qoM6N<$f>=;~rT_o{ delta 439 zcmV;o0Z9I$0>%T78Gi-<0044OHp~D300v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sj0}muB7H%IR0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#8DoI2^R5;6pl-rKOAPhtYFn?+L|NmMk0VjPKMU*>)Ui&AuMEm!uL0=P#xn)LC9nZtW~e1l2e481g=ZHbM&LpH1?vEw zgayzD3(uTl{82F+Q2EDwTEa zO#m$p)&x}#H-CP2CcFrE(yjq03R7s47J2d~Q}WiN(h+j2sppD3H}UqB043QJEPCjY zXP0o^lISy?yX{Q6T1O=kyYpa^wwMVV@Y7^703&t&nUa1`W(J$gnn`CXXh>_gz;=GS zy|vWYIwE0Q)1VKT%R}Dpahf!!sQ_~Un*!UZJrDX=bTD>Xz&v?3{=3giMDMd}QPn>$ hM}^kKO&it!S|9ajk{t`vv?c%m002ovPDHLkV1jh>tPB7E diff --git a/static/pdf.js/images/texture.png b/static/pdf.js/images/texture.png index df00864932368d75024b46b3a1993d0f51f1d59a..eb5ccb5ec3cdf7f20c344483958a2684e11e6df5 100644 GIT binary patch delta 2308 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 Z{s6Ex^Oi{w%uoOT002ovPDHLkV1j(Skn{im delta 497 zcmVeSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00E*&L_t(|+I&+_O9D|4f2(b^5D{%_8`LGE?BGpu6+NgIKY$5-f}qdP zrBfe7@RBEyj@n6(I(qTX%}XMbDIu=qHWTw=*mfKE@n+u6-+$kmRUF3=ilS@^A@%^< zfPnZbAAkwK1}y0m7`sLe`-8#YE*uUU!bhOUZL8HvC6mc}Fo!aUtfoWo7FF`YNg|O* zRVtNh(2oG?JOLUDYR?ZFfO)A@I&Lrxq+A-XMf!0h(scNaC$&QqtQNAqnD7_;Ufs*;8(ic?lT-usCPP@cQ{N}M?rT2 z+vR{2-FX>oKr1FbEuL`oHY|;{VG|G%^Sz`(%6pvBN=OXh;*!{2EW1I+@fK4jeM3kQqr#VaFkF zK9L_uw2+l;XGOM5nsloCosflOzbch4HL0tboBLIgFr{ZLv93z2QDjxGZVvP*5yqKd e@(&aGB=QL`^xW-##_}=%0000yj>DP@;v_+u@+$sG-z@fkCn+Bs~SboD<=L(K7$~5sejdKI=`TJ@#LQ8d0&p> zd<(AYPJQ2>P9~E_6)yx~?B1UWYPQZ?#${ zEGO5pUNPWKFn diff --git a/static/pdf.js/images/toolbarButton-pageDown-rtl.png b/static/pdf.js/images/toolbarButton-pageDown-rtl.png index c0051f8f040826d06f38468fcc4d657cfc69e880..9ba3667e94986235e8a27dff14d6a70f26e49193 100644 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfmH?j+S0D`s{|NzPl|VL7IYgwP zp`oUx2Ey*{?nYAv=hoHLRaRE+-o3lIxfvq(^XJdT#zr6;s9juK9K!hb?;p@)pwzKr z#~{kCU%!6)_U(v>2q5>wi4#{c)RzKTHYGuR!3<17c5U^Q3wmcwp1FEiu@1BP2BY1Y z5mn`UywzeH5_w#fjBME@nY9*jJ5p^GefU$iZCX0VT50~$66t1H-y9{NIlZ1Pjv*Cs zt|vmp4mk+8T%5SP@CF7qS zdwsomf8Xz9y*>A|{zy!3-O%5#C3(x)#+2YGi6RS+y_MXwQ%vl^^{z!e0p?lqLCO+e zn3P%7PM)1$vgwF}%{dOs8$WiO?(6pTpQ<8iYMa{mw_d0F7x(M$Ji6Q!ALT$k_jL7h JS?83{1OT;+xZnT) delta 544 zcmV+*0^j}41Fi&+8Gi-<001BJ|6u?C00DDSM?wIu&K&6g000JJOGiWi{{a60|De66 zlK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX1p)vd2`8DY2><{Au1Q2eR5;6h zlTC}$P!xurJBis?bwvCC3xoXyt}B$%k6+R0a(+ZhN=a?I>VK+hch$YP5Fv$xPAPSz zi&+eI)l*aZ0dNUi03IOsiJw`P zb+THm-g%z)NlIzQy<9F|o2K~!IM{PJ4@}cMiK6JEl=6d=@_pQk#o`U{3b-Ew^bEkG zMx#*_LR_a0#((4SIq)602BLj{!$P58sCjqFah!AD7ZApKSpdT@j38^a^?H4&%;PqI z0Q^1v+@zh?0YiPRhrk`+D1A$!j)1>vyx+iu0PfkgeO#;6UM60=+5^bNi|KUwwO+5k z)c}1mnRvNe?n$v&ya6`Kq^#Zmo6%_Wv)OFAzz*i9NNmlB1Ysa)4|1J(Hrnl$o_>GYUY4OGUfm^W)yo0o{W2>3&uU6-Nfip=Y!FewVUV~wW+OZzuHZPtzqlG ec9J|p(r^Agoe@%^zFiUk00005tPoJ_^mgN)V zcY}|v>ppP+OO};o*uEYF!8xS2S?aoe#(qmVX6XC=A%xdi@HtcLC$544*oW{Uf!z*p z&Mv}_65L6`JXke;Ux4tv1a~?!qN824SQN!E0uKgv5@v=DU7!}gB+v6JEN=e;vvjnp zJg@=|vMjqs;7Y~@Gt6oSF2*cLlH?M>P=Y&2{#AlocLCwdgzqHz&yp|i zeT_M<2A0>8QSRf3lk%~F$=TaT{9oU`ch6xtFm8`lcj8N5`k#;Qe&>Nx%s&AZ$8@;n h29GNo_G#qD9~4!zoSRPl>Q4Xw002ovPDHLkV1fk0eLDaE delta 400 zcmV;B0dM}c0;&U$B!2;OQb$4nuFf3k00002VoOIv0RM-N%)bBt010qNS#tmY3ljhU z3ljkVnw%H_000McNliru+yw#vA1>NWGF|`x0WL{IK~yNuRgpbQ!%!54pPQ75wM8U| z6cbBRKbBU9&aMi&byQjkB8Y#+zfct2v|St&`~ePK#K{k&T7ShwC}?7uuR6q#+k2PG zd7caJIY%I$G#S9gO-f=68<$PkZt<2Vs*KMLYvrZoALxVR}o930@6 zp(NN0qDLwom^PW@u!zT$2vh6%MCb}ESrAN6sL$a=rH~_wuUJq3(a_q}numw?3VtQ&&YGO)d;mK5+jfz5y0B;Bn A;s5{u diff --git a/static/pdf.js/images/toolbarButton-presentationMode.png b/static/pdf.js/images/toolbarButton-presentationMode.png index fa730955054b440a9e32ce282a3361cf13f198fa..2bd1c1dfe84330ee65430f38f73abee8eb2bb72a 100644 GIT binary patch delta 425 zcmV;a0apI&1HuE4BYy#jNkl6JA%b}mjaznqvT8QGtEH%c$;flrB z&Qf{{I&86Z>e8V`un}aogQY@vsbo$`Oz=K-8T$jeHIS{O|Dl_`z4$R6e(>@P3GlYrEKl=2FJ9w0I?Pa>4$p}dabL;YYF`at|*V} T2_=9@00000NkvXXu0mjfQX$O- delta 466 zcmV;@0WJQ*1M35jBYyxHbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz zjY&j7R47wLQB5yHK@>gp@kF&{Rb5bNGzijG&{UKVshtpNClNu)%Ekhbw2`1J>Z6Ht zgGN0xKEhh;{0EDsrSU_qGw%`SWF~jcxpQak3{VFTy2*App?^U^W7KYF9=h<#tI78* z*o_4H`_`WZFA$U$MLmtM$|tM{>uFO(5Ezgr#jo4IB3Y`Hbbm$Mzqn4;4PN=;~lr(@=9 z6FsOU1L=*xEPpK*9S2Z>Dh`cFEofj=!P(7~hDyWvg@rpEyn%woc5DAFjm>GW1^e_x z)~Mz#cWz-Q$RyK&>unXj&avXLWUf|VgYA4#GUXHhIQ(>6fKN_y@j^;c#e?2)RD>|-rwPl1nct% zo)F_R=gc5Ot?t(!v~U0f&t$E1b-L?_1^_LVQT>$JKzkAcF)W4J+_ zmFT@V4hO=-)8+iE)q~YbN;!q zC#(*h9{(dOgnv~(fCJ)uP}h2hKF$#uloA&QbeKau2DCX!aK)J2TR07L3Gf?m1prQ< zwF!KY%kRKmxxZ6vl&X*JtdV2MpS!(YFE@*yOPRZz1(QqMnkzRST6t0={VD4~voOC# zmWzZ0!N9I%6AmZ&*FoJ#zGatz01zQY6c{j~fL}D&hZVoWw{+vX;?|4+0000R2Ufr!B0z*aR30|=ePH_&CN9bGN^_S5((O&!lLLBgeMOj6rwNSAv$&FSRbGu zsH=zQ0~B3+I+E7_$u#lzZc?gOzn_dVuoBQZj8+QHKH; zeR5sbzJ{izrl#H4s$|P^MxY=XtDT=8&O3^tL?V$WW+mxj&9q@jH1ud;>7v##i?bVr zqziP)H)f>$VSn$|0TKN$60RRM9+}it{j`O!IX&)d9K)*b%U@JI`ot-Z|jYQiA}1 ry${99uWjlEaNMLCx&VmS@l})m=P-e`!Dh&<00000NkvXXu0mjfHmlQE diff --git a/static/pdf.js/images/toolbarButton-search.png b/static/pdf.js/images/toolbarButton-search.png index 604e652e5ec48052efa7b342c41c33729dbd287c..e52370e68dcaa9fd75a8764505d617d1cc8b2689 100644 GIT binary patch delta 396 zcmV;70dxNM1DgYo8Gi%-006c6H|hWY0b)r+K~yMHb(I=y6!UV0h3$jH;@9Y#F}+7EK?TfmEkMwf3< z?(GMH^&o6t%dHW`1%S(l%B_7vxE>6BD9NcLKALI9$Q?`WLorxmjbZCpR5_;({1g5O zbx_WVitW%-jSfN{*_gb@Xo9rft5P^V^Kli32pc zmllgj*{|-+?lQ$B5h9G^r=2DM_j;swD2eLMOoA|8+<5TNiWA4rfA7_*#H*Xr+k|MV qEgQ$hNOEIt?LUSlybNIc$KTkqeozAONfQ77002ovP6b4+LSTYMKge4E delta 488 zcmVh<8m3!Gk~Xk5eA5h^ zQG@4(UabwL3x9=z3R6Z^Rhdr$-2y3-$y`vQ2kR-VKQN;x3QcOQR^uk8Hk)mQu*WP- z&F}XI;T`=Q9`X5ne*E)Gm=u8uQbhDhGMNm+I|q7xguPy`r&6iJU^;I!8e!bzJfF{p z@!n6^yWQ?Xco)GC==chIJf1CtWrR-)&ZkVMP eSDgS-yWtNpKna1!X!M-`0000pFMtTt-F)P>_j<2`C6;K%{^S z2uU&SD%!?0q8+7+H$#Tu53?JLhV&R{ORX|&;ZPKJ3gSGh$BuZ5oJeCGw_Rt~aK zhW7S026oz&GJK`d_JX>V^3GaS;-36vMlRuTUxDT?^K@|x(Kz3F-c{(3g8=J=nLFAQ z7@OGIAG~{~_kBP2<&%t`#Pcs+z4}#J@qU7ko*2jLDe62s*bW;=-o2{GTs-CZ&j;0f zdMDa;_Gp}1V6XP=mWbQh;HXKPURy_OFmRhYNvEC5z94mSbB5dHlA24b{o9shzOWH# zN%``TW%;y3g+D)6Wo_Jcv&p(hNeDyt@@KsZm|KD6c X$wgTF*mRTWpz!f@^>bP0l+XkKcCF5e delta 1212 zcmV;t1Vj7B1jPxE8Gi%-006c6H|hWY010qNS#tmY3ljhU3ljkVnw%H_00SFoLqkwd zXm50Hb7*gHAW1_*AaHVTW@&6?004N}V_;yO;OOGy$|S(RP*7A-A zje(hgfq{X6Au+kQz%d}ehk=2CAum5Kl>rqnGBA9*#=ywHz<L4HwU zNoooM0|V3!27d+y240u^5(W3f%sd4{Q&k2kgNVo|1qcffJ_s=cNG>fZg9jx8g8+jT zgC9dB!zzXcjM9uzjPn?uG8r;8FkNESU~Xi-%VNVakCmA$apIif zTP0E?g(Z(lRY>bfKarUu8!9I#cUHbf!AFr-@q*G69)tuXJmsIW}5^0BtCQMDDZW3l^c|J>oW z;{~T<&VPGdwz{r&Tj{>kW0B`VuLa%v{M~HOlHNM6?SFcQV5fIid-vg9hCciLx(WLx{-5kP zrFH6w>AW+7XU>}SXpYw0l6m_Ua4ig5w0QByr4Gv`EPuGtcvb7_n`?E~HLbt7(O^@@ z<_BA?woTpsVW;n|ReL!0rtdp`K>c9nq1Q+Jj&43Kexml|lhfX3ww#ka-+tlKrMSzd zu76rwTXsYAX6vo5chc|Pyzleiz$4SgtDh=9oB2ZUW!G!wH+64+zAydo=~KbycVF|q zz59{>^TY4rKi~dU{r?XDE({%upgajN0000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0003bNkl*fLB5sx`50{TMdj5h7V2cznnb6vs$2!Bkj z$R}BowY^i)6Kjt5Pe|Ye2+pj^M_HBCT#-~X?b<*CAQ_kUvMkG+MT~^udJ)w*PP0`$ z0YXjQx{;wF34q%CE==X8u`@BDUOX4{d;~ia6I!X!XhnNH6d#n!x;5YTB{eUDCWD?_cNP$pyVSL3+x7Wq)m!+msbM09R{s6X ap8)`ZfrN|Y*6G9m0000s;giyCBGF!61gj z=0=!c-@fAiRUo{{Vb9qJz{67JN zXQiDP>|ksedj?*Z5@rU2uo?dk0^xBBBL*WF+g6Xk77T$3q<>Ru{_g}qQ&R?67~9g2 z!4e38R!Ftx{@?z8m@pH}{V z<^RS17qe6{=)&2h41CalI+OtvnEQV&Qz?Tu5}Owh3g!$M3^@!b;GjmZsRjTFBaUbt TT=)_I0000=O)OX%MzuI*Tn>{(mq7!)yL042nSJkH5?e zFJSCH%nX)52(&_~HTVDa{~P~rRv1E{OEwid!Td-g2E z6+o_!k57Jn{R16W^yLWF#M+cAux(BH1R`|3& zpoB+BkYBJRgHFiq4Vjg-v)U#vTfHE!x4zgyfTP?fLw-}CP_d?YuFSFkt!9zP!qBxo z-aDM#Q)~n5+vZzmGG!Y_)WmgnI$1O3R_9cw9@_Up2WaMIPZ!4!jbPvNSNWP97+fwc z+!C9@D)!3n?%lip|M%}|S@O`%_uOrT%NeTwwn|BgG^MOr&=6xNx_U`p#od$aL1E?T>gTe~DWM4fdzI;B delta 1184 zcmV;R1Yi541gQy-8Gi%-006c6H|hWY010qNS#tmY3ljhU3ljkVnw%H_00SFoLqkwd zXm50Hb7*gHAW1_*AaHVTW@&6?004N}V_;yO;OOGy$|S(RP*7A-A zje(hgfq{X6Au+kQz%d}ehk=2CAum5Kl>rqnGBA9*#=ywHz<L4HwU zNoooM0|V3!27d+y240u^5(W3f%sd4{Q&k2kgNVo|1qcffJ_s=cNG>fZg9jx8g8+jT zgC9dB!zzXcjM9uzjPn?uG8r;8FkNESU~Xi-%VNVakCmA$apIif zTP0E?g(Z(lRY>bfKarUu8!9I#cUHbf!AFr-@q*G69)tuXJmsIW}5^0BtCQMDDZW3l^c|J>oW z;{~T<&VPGdwz{r&Tj{>kW0B`VuLa%v{M~HOlHNM6?SFcQV5fIid-vg9hCciLx(WLx{-5kP zrFH6w>AW+7XU>}SXpYw0l6m_Ua4ig5w0QByr4Gv`EPuGtcvb7_n`?E~HLbt7(O^@@ z<_BA?woTpsVW;n|ReL!0rtdp`K>c9nq1Q+Jj&43Kexml|lhfX3ww#ka-+tlKrMSzd zu76rwTXsYAX6vo5chc|Pyzleiz$4SgtDh=9oB2ZUW!G!wH+64+zAydo=~KbycVF|q zz59{>^TY4rKi~dU{r?XDE({%upgajN0000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}00039Nkl?UwS!xW^`o(V&0|G1@_8!ha+e{PODF&ZET>}(96r=}v9A0YX&TOtM#ll60l-_q7% zto?_>9H0f!QjG9$v3Z1wyo)Ew) y;%>TYcqwc#%1XCFtQhXyP(zjc${8?V_%#4}6mk8BE;c~`0000-B!BryL_t(|UX_nMF9cB-M$fyhA;C%vp<6LXBt*HrEi`_E|DmDu zQp&3hCW^Vub{y?Y>1|aE;M+L3o#Vp delta 322 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 ijwS89RZ+=3_!R&Qo=tDjU66bL0000YA61;3;N? zVK5kG#vu4HB)v(CfFQT(acjHtHKW-GSlmcA|DOv0?MS*z76447%is-wfpq0Sn!+Y7 zU3v_ibTd2n13X+wm(|@0cv(sRI-CG#XVPWz%ns=?*s?=<{~pc#P(6lDc)!CJFxocu T2PRUk00000NkvXXu0mjfmw-sh delta 194 zcmV;z06qV<0n-7H8Gi-<001BJ|6u?C0GdfeK~#9!rP84a0#Ou%;nNK^`+{u+o3L#k z!k4gEOeWvKXfjzWb|3CK1Cy44x!}Sd4&O<8ZsA*@0qqtIvgEaGt$kgz4zB}-kBipf zHDP$WXwkLsa?zq|;pw7vc}8ywk{ROZ;uvCaI{C-{|MtwPGZL>bXh|`!+;LdLam0$nz=PM^j5(y?OJ0&e zh;AF>Er(sxC3r%+6B{H1tQiV977i Q>llE*)78&qol`;+0Bw6DoB#j- delta 114 zcmV-&0FD2R0gnNYBx_blL_t(|+U?S@2>>AsKv4@jEv)Q?>+Xhd2-k8Vhs%BYKm;uf zJko?;#fiw48#ozY0t!AuLC^vZd#sqZTHs~(74udLWK=XmMb-iy5y=qY?;{-y{7*}m UsUF^C-~a#s07*qoM6N<$f?OgkU;qFB diff --git a/static/pdf.js/locale/es/viewer.properties b/static/pdf.js/locale/es/viewer.properties index fcc07eda0..fc8848f8b 100644 --- a/static/pdf.js/locale/es/viewer.properties +++ b/static/pdf.js/locale/es/viewer.properties @@ -38,7 +38,7 @@ print.title=Imprimir print_label=Imprimir download.title=Descargar download_label=Descargar -bookmark.title=Vista actual (copie o abra en una ventana nueva) +bookmark.title=Vista actual (para copiar o abrir en otra ventana) bookmark_label=Vista actual # Secondary toolbar and context menu @@ -57,6 +57,11 @@ page_rotate_ccw.title=Girar a la izquierda page_rotate_ccw.label=Girar a la izquierda page_rotate_ccw_label=Girar a la izquierda +hand_tool_enable.title=Activar la herramienta Mano +hand_tool_enable_label=Activar la herramienta Mano +hand_tool_disable.title=Desactivar la herramienta Mano +hand_tool_disable_label=Desactivar la herramienta Mano + # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) @@ -133,4 +138,4 @@ password_cancel=Cancelar printing_not_supported=Aviso: Este navegador no es compatible completamente con la impresión. printing_not_ready=Aviso: El PDF no se ha cargado completamente para su impresión. web_fonts_disabled=Se han desactivado los tipos de letra web: no se pueden usar los tipos de letra incrustados en el PDF. -web_colors_disabled=Se han desactivado los colores web. +document_colors_disabled=No se permite que los documentos PDF usen sus propios colores: la opción «Permitir que las páginas elijan sus propios colores» está desactivada en el navegador. diff --git a/static/pdf.js/pdf.js b/static/pdf.js/pdf.js index 6ad4852e4..b23e8a334 100644 --- a/static/pdf.js/pdf.js +++ b/static/pdf.js/pdf.js @@ -20,8 +20,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '0.8.798'; -PDFJS.build = '5b0eebb'; +PDFJS.version = '0.8.846'; +PDFJS.build = '05f937e'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -43,7 +43,8 @@ PDFJS.build = '5b0eebb'; * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL */ +/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL, + Promise */ 'use strict'; @@ -51,9 +52,6 @@ var globalScope = (typeof window === 'undefined') ? this : window; var isWorker = (typeof window == 'undefined'); -var ERRORS = 0, WARNINGS = 1, INFOS = 5; -var verbosity = WARNINGS; - var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; var TextRenderingMode = { @@ -78,6 +76,12 @@ if (!globalScope.PDFJS) { globalScope.PDFJS.pdfBug = false; +PDFJS.VERBOSITY_LEVELS = { + errors: 0, + warnings: 1, + infos: 5 +}; + // All the possible operations for an operator list. var OPS = PDFJS.OPS = { // Intentionally start from 1 so it is easy to spot bad operators that will be @@ -182,21 +186,19 @@ var log = (function() { } })(); -// A notice for devs that will not trigger the fallback UI. These are good -// for things that are helpful to devs, such as warning that Workers were -// disabled, which is important to devs but not end users. +// A notice for devs. These are good for things that are helpful to devs, such +// as warning that Workers were disabled, which is important to devs but not +// end users. function info(msg) { - if (verbosity >= INFOS) { + if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) { log('Info: ' + msg); - PDFJS.LogManager.notify('info', msg); } } -// Non-fatal warnings that should trigger the fallback UI. +// Non-fatal warnings. function warn(msg) { - if (verbosity >= WARNINGS) { + if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) { log('Warning: ' + msg); - PDFJS.LogManager.notify('warn', msg); } } @@ -214,15 +216,10 @@ function error(msg) { log('Error: ' + msg); } log(backtrace()); - PDFJS.LogManager.notify('error', msg); + UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown); throw new Error(msg); } -// Missing features that should trigger the fallback UI. -function TODO(what) { - warn('TODO: ' + what); -} - function backtrace() { try { throw new Error(); @@ -236,6 +233,31 @@ function assert(cond, msg) { error(msg); } +var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = { + unknown: 'unknown', + forms: 'forms', + javaScript: 'javaScript', + smask: 'smask', + shadingPattern: 'shadingPattern', + font: 'font' +}; + +var UnsupportedManager = PDFJS.UnsupportedManager = + (function UnsupportedManagerClosure() { + var listeners = []; + return { + listen: function (cb) { + listeners.push(cb); + }, + notify: function (featureId) { + warn('Unsupported feature "' + featureId + '"'); + for (var i = 0, ii = listeners.length; i < ii; i++) { + listeners[i](featureId); + } + } + }; +})(); + // Combines two URLs. The baseUrl shall be absolute URL. If the url is an // absolute URL, it will be returned as is. function combineUrl(baseUrl, url) { @@ -289,22 +311,6 @@ function assertWellFormed(cond, msg) { error(msg); } -var LogManager = PDFJS.LogManager = (function LogManagerClosure() { - var loggers = []; - return { - addLogger: function logManager_addLogger(logger) { - loggers.push(logger); - }, - notify: function(type, message) { - for (var i = 0, ii = loggers.length; i < ii; i++) { - var logger = loggers[i]; - if (logger[type]) - logger[type](message); - } - } - }; -})(); - function shadow(obj, prop, value) { Object.defineProperty(obj, prop, { value: value, enumerable: true, @@ -834,6 +840,24 @@ function isPDFFunction(v) { } /** + * Legacy support for PDFJS Promise implementation. + * TODO remove eventually + */ +var LegacyPromise = PDFJS.LegacyPromise = (function LegacyPromiseClosure() { + return function LegacyPromise() { + var resolve, reject; + var promise = new Promise(function (resolve_, reject_) { + resolve = resolve_; + reject = reject_; + }); + promise.resolve = resolve; + promise.reject = reject; + return promise; + }; +})(); + +/** + * Polyfill for Promises: * The following promise implementation tries to generally implment the * Promise/A+ spec. Some notable differences from other promise libaries are: * - There currently isn't a seperate deferred and promise object. @@ -842,7 +866,39 @@ function isPDFFunction(v) { * Based off of the work in: * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 */ -var Promise = PDFJS.Promise = (function PromiseClosure() { +(function PromiseClosure() { + if (globalScope.Promise) { + // Promises existing in the DOM/Worker, checking presence of all/resolve + if (typeof globalScope.Promise.all !== 'function') { + globalScope.Promise.all = function (iterable) { + var count = 0, results = [], resolve, reject; + var promise = new globalScope.Promise(function (resolve_, reject_) { + resolve = resolve_; + reject = reject_; + }); + iterable.forEach(function (p, i) { + count++; + p.then(function (result) { + results[i] = result; + count--; + if (count === 0) { + resolve(results); + } + }, reject); + }); + if (count === 0) { + resolve(results); + } + return promise; + }; + } + if (typeof globalScope.Promise.resolve !== 'function') { + globalScope.Promise.resolve = function (x) { + return new globalScope.Promise(function (resolve) { resolve(x); }); + }; + } + return; + } var STATUS_PENDING = 0; var STATUS_RESOLVED = 1; var STATUS_REJECTED = 2; @@ -875,6 +931,8 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { }, runHandlers: function runHandlers() { + var RUN_TIMEOUT = 1; // ms + var timeoutAt = Date.now() + RUN_TIMEOUT; while (this.handlers.length > 0) { var handler = this.handlers.shift(); @@ -900,6 +958,14 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { } handler.nextPromise._updateStatus(nextStatus, nextValue); + if (Date.now() >= timeoutAt) { + break; + } + } + + if (this.handlers.length > 0) { + setTimeout(this.runHandlers.bind(this), 0); + return; } this.running = false; @@ -950,9 +1016,10 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { } }; - function Promise() { + function Promise(resolver) { this._status = STATUS_PENDING; this._handlers = []; + resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); } /** * Builds a promise that is resolved when all the passed in promises are @@ -961,11 +1028,15 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { * @return {Promise} New dependant promise. */ Promise.all = function Promise_all(promises) { - var deferred = new Promise(); + var resolveAll, rejectAll; + var deferred = new Promise(function (resolve, reject) { + resolveAll = resolve; + rejectAll = reject; + }); var unresolved = promises.length; var results = []; if (unresolved === 0) { - deferred.resolve(results); + resolveAll(results); return deferred; } function reject(reason) { @@ -973,7 +1044,7 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { return; } results = []; - deferred.reject(reason); + rejectAll(reason); } for (var i = 0, ii = promises.length; i < ii; ++i) { var promise = promises[i]; @@ -985,7 +1056,7 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { results[i] = value; unresolved--; if (unresolved === 0) - deferred.resolve(results); + resolveAll(results); }; })(i); if (Promise.isPromise(promise)) { @@ -1004,6 +1075,14 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { Promise.isPromise = function Promise_isPromise(value) { return value && typeof value.then === 'function'; }; + /** + * Creates resolved promise + * @param x resolve value + * @returns {Promise} + */ + Promise.resolve = function Promise_resolve(x) { + return new Promise(function (resolve) { resolve(x); }); + }; Promise.prototype = { _status: null, @@ -1035,24 +1114,19 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { HandlerManager.scheduleHandlers(this); }, - get isResolved() { - return this._status === STATUS_RESOLVED; - }, - - get isRejected() { - return this._status === STATUS_REJECTED; - }, - - resolve: function Promise_resolve(value) { + _resolve: function Promise_resolve(value) { this._updateStatus(STATUS_RESOLVED, value); }, - reject: function Promise_reject(reason) { + _reject: function Promise_reject(reason) { this._updateStatus(STATUS_REJECTED, reason); }, then: function Promise_then(onResolve, onReject) { - var nextPromise = new Promise(); + var nextPromise = new Promise(function (resolve, reject) { + this.resolve = reject; + this.reject = reject; + }); this._handlers.push({ thisPromise: this, onResolve: onResolve, @@ -1064,7 +1138,7 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { } }; - return Promise; + globalScope.Promise = Promise; })(); var StatTimer = (function StatTimerClosure() { @@ -1178,8 +1252,8 @@ function MessageHandler(name, comObj) { log.apply(null, data); }]; } - ah['_warn'] = [function ah_Warn(data) { - warn(data); + ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) { + UnsupportedManager.notify(data); }]; comObj.onmessage = function messageHandlerComObjOnMessage(event) { @@ -1196,7 +1270,12 @@ function MessageHandler(name, comObj) { } else if (data.action in ah) { var action = ah[data.action]; if (data.callbackId) { - var promise = new Promise(); + var deferred = {}; + var promise = new Promise(function (resolve, reject) { + deferred.resolve = resolve; + deferred.reject = reject; + }); + deferred.promise = promise; promise.then(function(resolvedData) { comObj.postMessage({ isReply: true, @@ -1204,7 +1283,7 @@ function MessageHandler(name, comObj) { data: resolvedData }); }); - action[0].call(action[1], data.data, promise); + action[0].call(action[1], data.data, deferred); } else { action[0].call(action[1], data.data); } @@ -1876,8 +1955,8 @@ var DeviceCmykCS = (function DeviceCmykCSClosure() { var CalGrayCS = (function CalGrayCSClosure() { function CalGrayCS(whitePoint, blackPoint, gamma) { this.name = 'CalGray'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); + this.numComps = 1; + this.defaultColor = new Float32Array([0]); if (!whitePoint) { error('WhitePoint missing - required for color space CalGray'); @@ -1908,7 +1987,7 @@ var CalGrayCS = (function CalGrayCSClosure() { } if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { - TODO(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + + warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + ', ZB: ' + this.ZB + ', only default values are supported.'); } @@ -1919,6 +1998,33 @@ var CalGrayCS = (function CalGrayCSClosure() { } } + function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { + // A represents a gray component of a calibrated gray space. + // A <---> AG in the spec + var A = src[srcOffset] * scale; + var AG = Math.pow(A, cs.G); + + // Computes intermediate variables M, L, N as per spec. + // Except if other than default BlackPoint values are used. + var M = cs.XW * AG; + var L = cs.YW * AG; + var N = cs.ZW * AG; + + // Decode XYZ, as per spec. + var X = M; + var Y = L; + var Z = N; + + // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4. + // This yields values in range [0, 100]. + var Lstar = Math.max(116 * Math.pow(Y, 1 / 3) - 16, 0); + + // Convert values to rgb range [0, 255]. + dest[destOffset] = Lstar * 255 / 100; + dest[destOffset + 1] = Lstar * 255 / 100; + dest[destOffset + 2] = Lstar * 255 / 100; + } + CalGrayCS.prototype = { getRgb: function CalGrayCS_getRgb(src, srcOffset) { var rgb = new Uint8Array(3); @@ -1927,41 +2033,16 @@ var CalGrayCS = (function CalGrayCSClosure() { }, getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, dest, destOffset) { - // A represents a gray component of a calibrated gray space. - // A <---> AG in the spec - var A = src[srcOffset]; - var AG = Math.pow(A, this.G); - - // Computes intermediate variables M, L, N as per spec. - // Except if other than default BlackPoint values are used. - var M = this.XW * AG; - var L = this.YW * AG; - var N = this.ZW * AG; - - // Decode XYZ, as per spec. - var X = M; - var Y = L; - var Z = N; - - // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4. - // This yields values in range [0, 100]. - var Lstar = Math.max(116 * Math.pow(Y, 1 / 3) - 16, 0); - - // Convert values to rgb range [0, 255]. - dest[destOffset] = Lstar * 255 / 100; - dest[destOffset + 1] = Lstar * 255 / 100; - dest[destOffset + 2] = Lstar * 255 / 100; + convertToRgb(this, src, srcOffset, dest, destOffset, 1); }, getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits) { - // TODO: This part is copied from DeviceGray. Make this utility function. - var scale = 255 / ((1 << bits) - 1); - var j = srcOffset, q = destOffset; + var scale = 1 / ((1 << bits) - 1); + for (var i = 0; i < count; ++i) { - var c = (scale * src[j++]) | 0; - dest[q++] = c; - dest[q++] = c; - dest[q++] = c; + convertToRgb(this, src, srcOffset, dest, destOffset, scale); + srcOffset += 1; + destOffset += 3; } }, getOutputLength: function CalGrayCS_getOutputLength(inputLength) { @@ -2155,7 +2236,7 @@ var Pattern = (function PatternClosure() { // Both radial and axial shadings are handled by RadialAxial shading. return new Shadings.RadialAxial(dict, matrix, xref, res); default: - TODO('Unsupported shading type: ' + type); + UnsupportedManager.notify(UNSUPPORTED_FEATURES.shadingPattern); return new Shadings.Dummy(); } }; @@ -2415,7 +2496,7 @@ var TilingPattern = (function TilingPatternClosure() { var commonObjs = this.commonObjs; var ctx = this.ctx; - TODO('TilingType: ' + tilingType); + info('TilingType: ' + tilingType); var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3]; @@ -2628,7 +2709,7 @@ var PDFFunction = (function PDFFunctionClosure() { if (order !== 1) { // No description how cubic spline interpolation works in PDF32000:2008 // As in poppler, ignoring order, linear interpolation may work as good - TODO('No support for cubic spline interpolation: ' + order); + info('No support for cubic spline interpolation: ' + order); } var encode = dict.get('Encode'); @@ -3521,7 +3602,7 @@ var Annotation = (function AnnotationClosure() { }, loadResources: function(keys) { - var promise = new Promise(); + var promise = new LegacyPromise(); this.appearance.dict.getAsync('Resources').then(function(resources) { if (!resources) { promise.resolve(); @@ -3540,7 +3621,7 @@ var Annotation = (function AnnotationClosure() { getOperatorList: function Annotation_getToOperatorList(evaluator) { - var promise = new Promise(); + var promise = new LegacyPromise(); if (!this.appearance) { promise.resolve(new OperatorList()); @@ -3646,7 +3727,7 @@ var Annotation = (function AnnotationClosure() { if (annotation.isViewable()) { return annotation; } else { - TODO('unimplemented annotation type: ' + subtype); + warn('unimplemented annotation type: ' + subtype); } }; @@ -3657,7 +3738,7 @@ var Annotation = (function AnnotationClosure() { annotationsReadyPromise.reject(e); } - var annotationsReadyPromise = new Promise(); + var annotationsReadyPromise = new LegacyPromise(); var annotationPromises = []; for (var i = 0, n = annotations.length; i < n; ++i) { @@ -3738,7 +3819,7 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() { Util.inherit(WidgetAnnotation, Annotation, { isViewable: function WidgetAnnotation_isViewable() { if (this.data.fieldType === 'Sig') { - TODO('unimplemented annotation type: Widget signature'); + warn('unimplemented annotation type: Widget signature'); return false; } @@ -3819,7 +3900,7 @@ var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() { return Annotation.prototype.getOperatorList.call(this, evaluator); } - var promise = new Promise(); + var promise = new LegacyPromise(); var opList = new OperatorList(); var data = this.data; @@ -3896,7 +3977,7 @@ var TextAnnotation = (function TextAnnotationClosure() { Util.inherit(TextAnnotation, Annotation, { getOperatorList: function TextAnnotation_getOperatorList(evaluator) { - var promise = new Promise(); + var promise = new LegacyPromise(); promise.resolve(new OperatorList()); return promise; }, @@ -4023,7 +4104,7 @@ var LinkAnnotation = (function LinkAnnotationClosure() { } else if (linkType === 'Named') { data.action = action.get('N').name; } else { - TODO('unrecognized link type: ' + linkType); + warn('unrecognized link type: ' + linkType); } } else if (dict.has('Dest')) { // simple destination link @@ -4148,6 +4229,18 @@ PDFJS.pdfBug = PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug; */ PDFJS.postMessageTransfers = PDFJS.postMessageTransfers === undefined ? true : PDFJS.postMessageTransfers; + +/** + * Controls the logging level. + * The constants from PDFJS.VERBOSITY_LEVELS should be used: + * - errors + * - warnings [default] + * - infos + * @var {Number} + */ +PDFJS.verbosity = PDFJS.verbosity === undefined ? + PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity; + /** * This is the main entry point for loading a PDF and interacting with it. * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR) @@ -4204,8 +4297,8 @@ PDFJS.getDocument = function getDocument(source, params[key] = source[key]; } - workerInitializedPromise = new PDFJS.Promise(); - workerReadyPromise = new PDFJS.Promise(); + workerInitializedPromise = new PDFJS.LegacyPromise(); + workerReadyPromise = new PDFJS.LegacyPromise(); transport = new WorkerTransport(workerInitializedPromise, workerReadyPromise, pdfDataRangeTransport, progressCallback); workerInitializedPromise.then(function transportInitialized() { @@ -4273,7 +4366,7 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { * JavaScript strings in the name tree. */ getJavaScript: function PDFDocumentProxy_getJavaScript() { - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); var js = this.pdfInfo.javaScript; promise.resolve(js); return promise; @@ -4294,7 +4387,7 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { * ]. */ getOutline: function PDFDocumentProxy_getOutline() { - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); var outline = this.pdfInfo.outline; promise.resolve(outline); return promise; @@ -4306,7 +4399,7 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { * {Metadata} object with information from the metadata section of the PDF. */ getMetadata: function PDFDocumentProxy_getMetadata() { - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); var info = this.pdfInfo.info; var metadata = this.pdfInfo.metadata; promise.resolve({ @@ -4316,7 +4409,7 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { return promise; }, isEncrypted: function PDFDocumentProxy_isEncrypted() { - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); promise.resolve(this.pdfInfo.encrypted); return promise; }, @@ -4325,7 +4418,7 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { * the raw data from the PDF. */ getData: function PDFDocumentProxy_getData() { - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); this.transport.getData(promise); return promise; }, @@ -4406,7 +4499,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() { if (this.annotationsPromise) return this.annotationsPromise; - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); this.annotationsPromise = promise; this.transport.getAnnotations(this.pageInfo.pageIndex); return promise; @@ -4440,7 +4533,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() { // requested before. Make the request and create the promise. if (!this.displayReadyPromise) { this.receivingOperatorList = true; - this.displayReadyPromise = new Promise(); + this.displayReadyPromise = new LegacyPromise(); this.operatorList = { fnArray: [], argsArray: [], @@ -4487,9 +4580,9 @@ var PDFPageProxy = (function PDFPageProxyClosure() { self._tryDestroy(); if (error) { - renderTask.reject(error); + renderTask.promise.reject(error); } else { - renderTask.resolve(); + renderTask.promise.resolve(); } stats.timeEnd('Rendering'); stats.timeEnd('Overall'); @@ -4502,7 +4595,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() { * content from the page. */ getTextContent: function PDFPageProxy_getTextContent() { - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); this.transport.messageHandler.send('GetTextContent', { pageIndex: this.pageNumber - 1 }, @@ -4516,7 +4609,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() { * Stub for future feature. */ getOperationList: function PDFPageProxy_getOperationList() { - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); var operationList = { // not implemented dependencyFontsID: null, operatorList: null @@ -4668,7 +4761,7 @@ var WorkerTransport = (function WorkerTransportClosure() { loadFakeWorkerFiles: function WorkerTransport_loadFakeWorkerFiles() { if (!PDFJS.fakeWorkerFilesLoadedPromise) { - PDFJS.fakeWorkerFilesLoadedPromise = new Promise(); + PDFJS.fakeWorkerFilesLoadedPromise = new LegacyPromise(); // In the developer build load worker_loader which in turn loads all the // other files and resolves the promise. In production only the // pdf.worker.js file is needed. @@ -4873,7 +4966,7 @@ var WorkerTransport = (function WorkerTransportClosure() { error(data.error); }, this); - messageHandler.on('JpegDecode', function(data, promise) { + messageHandler.on('JpegDecode', function(data, deferred) { var imageUrl = data[0]; var components = data[1]; if (components != 3 && components != 1) @@ -4902,7 +4995,7 @@ var WorkerTransport = (function WorkerTransportClosure() { buf[j] = data[i]; } } - promise.resolve({ data: buf, width: width, height: height}); + deferred.resolve({ data: buf, width: width, height: height}); }).bind(this); img.src = imageUrl; }); @@ -4915,7 +5008,8 @@ var WorkerTransport = (function WorkerTransportClosure() { source: source, disableRange: PDFJS.disableRange, maxImageSize: PDFJS.maxImageSize, - disableFontFace: PDFJS.disableFontFace + disableFontFace: PDFJS.disableFontFace, + verbosity: PDFJS.verbosity }); }, @@ -4926,7 +5020,7 @@ var WorkerTransport = (function WorkerTransportClosure() { }, dataLoaded: function WorkerTransport_dataLoaded() { - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); this.messageHandler.send('DataLoaded', null, function(args) { promise.resolve(args); }); @@ -4937,14 +5031,14 @@ var WorkerTransport = (function WorkerTransportClosure() { var pageIndex = pageNumber - 1; if (pageIndex in this.pagePromises) return this.pagePromises[pageIndex]; - var promise = new PDFJS.Promise('Page ' + pageNumber); + var promise = new PDFJS.LegacyPromise(); this.pagePromises[pageIndex] = promise; this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex }); return promise; }, getPageIndex: function WorkerTransport_getPageIndexByRef(ref) { - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); this.messageHandler.send('GetPageIndex', { ref: ref }, function (pageIndex) { promise.resolve(pageIndex); @@ -4959,7 +5053,7 @@ var WorkerTransport = (function WorkerTransportClosure() { }, getDestinations: function WorkerTransport_getDestinations() { - var promise = new PDFJS.Promise(); + var promise = new PDFJS.LegacyPromise(); this.messageHandler.send('GetDestinations', null, function transportDestinations(destinations) { promise.resolve(destinations); @@ -5008,7 +5102,7 @@ var PDFObjects = (function PDFObjectsClosure() { return this.objs[objId]; var obj = { - promise: new Promise(objId), + promise: new LegacyPromise(), data: null, resolved: false }; @@ -5089,17 +5183,13 @@ var PDFObjects = (function PDFObjectsClosure() { }; return PDFObjects; })(); -/* - * RenderTask is basically a promise but adds a cancel function to terminate it. - */ + var RenderTask = (function RenderTaskClosure() { function RenderTask(internalRenderTask) { this.internalRenderTask = internalRenderTask; - Promise.call(this); + this.promise = new PDFJS.LegacyPromise(); } - RenderTask.prototype = Object.create(Promise.prototype); - /** * Cancel the rendering task. If the task is curently rendering it will not be * cancelled until graphics pauses with a timeout. The promise that this @@ -5782,6 +5872,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var commonObjs = this.commonObjs; var objs = this.objs; var fnId; + var deferred = Promise.resolve(); while (true) { if (stepper && i === stepper.nextBreakPoint) { @@ -5823,7 +5914,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { // to continue exeution after a short delay. // However, this is only possible if a 'continueCallback' is passed in. if (continueCallback && Date.now() > endTime) { - setTimeout(continueCallback, 0); + deferred.then(continueCallback); return i; } @@ -6734,7 +6825,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { // TODO knockout - supposedly possible with the clever use of compositing // modes. if (group.knockout) { - TODO('Support knockout groups.'); + warn('Knockout groups not supported.'); } var currentTransform = currentCtx.mozCurrentTransform; diff --git a/static/pdf.js/pdf.worker.js b/static/pdf.js/pdf.worker.js index 8b8ab366b..1d984a552 100644 --- a/static/pdf.js/pdf.worker.js +++ b/static/pdf.js/pdf.worker.js @@ -20,8 +20,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '0.8.798'; -PDFJS.build = '5b0eebb'; +PDFJS.version = '0.8.846'; +PDFJS.build = '05f937e'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -43,7 +43,8 @@ PDFJS.build = '5b0eebb'; * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL */ +/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL, + Promise */ 'use strict'; @@ -51,9 +52,6 @@ var globalScope = (typeof window === 'undefined') ? this : window; var isWorker = (typeof window == 'undefined'); -var ERRORS = 0, WARNINGS = 1, INFOS = 5; -var verbosity = WARNINGS; - var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; var TextRenderingMode = { @@ -78,6 +76,12 @@ if (!globalScope.PDFJS) { globalScope.PDFJS.pdfBug = false; +PDFJS.VERBOSITY_LEVELS = { + errors: 0, + warnings: 1, + infos: 5 +}; + // All the possible operations for an operator list. var OPS = PDFJS.OPS = { // Intentionally start from 1 so it is easy to spot bad operators that will be @@ -182,21 +186,19 @@ var log = (function() { } })(); -// A notice for devs that will not trigger the fallback UI. These are good -// for things that are helpful to devs, such as warning that Workers were -// disabled, which is important to devs but not end users. +// A notice for devs. These are good for things that are helpful to devs, such +// as warning that Workers were disabled, which is important to devs but not +// end users. function info(msg) { - if (verbosity >= INFOS) { + if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) { log('Info: ' + msg); - PDFJS.LogManager.notify('info', msg); } } -// Non-fatal warnings that should trigger the fallback UI. +// Non-fatal warnings. function warn(msg) { - if (verbosity >= WARNINGS) { + if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) { log('Warning: ' + msg); - PDFJS.LogManager.notify('warn', msg); } } @@ -214,15 +216,10 @@ function error(msg) { log('Error: ' + msg); } log(backtrace()); - PDFJS.LogManager.notify('error', msg); + UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown); throw new Error(msg); } -// Missing features that should trigger the fallback UI. -function TODO(what) { - warn('TODO: ' + what); -} - function backtrace() { try { throw new Error(); @@ -236,6 +233,31 @@ function assert(cond, msg) { error(msg); } +var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = { + unknown: 'unknown', + forms: 'forms', + javaScript: 'javaScript', + smask: 'smask', + shadingPattern: 'shadingPattern', + font: 'font' +}; + +var UnsupportedManager = PDFJS.UnsupportedManager = + (function UnsupportedManagerClosure() { + var listeners = []; + return { + listen: function (cb) { + listeners.push(cb); + }, + notify: function (featureId) { + warn('Unsupported feature "' + featureId + '"'); + for (var i = 0, ii = listeners.length; i < ii; i++) { + listeners[i](featureId); + } + } + }; +})(); + // Combines two URLs. The baseUrl shall be absolute URL. If the url is an // absolute URL, it will be returned as is. function combineUrl(baseUrl, url) { @@ -289,22 +311,6 @@ function assertWellFormed(cond, msg) { error(msg); } -var LogManager = PDFJS.LogManager = (function LogManagerClosure() { - var loggers = []; - return { - addLogger: function logManager_addLogger(logger) { - loggers.push(logger); - }, - notify: function(type, message) { - for (var i = 0, ii = loggers.length; i < ii; i++) { - var logger = loggers[i]; - if (logger[type]) - logger[type](message); - } - } - }; -})(); - function shadow(obj, prop, value) { Object.defineProperty(obj, prop, { value: value, enumerable: true, @@ -834,6 +840,24 @@ function isPDFFunction(v) { } /** + * Legacy support for PDFJS Promise implementation. + * TODO remove eventually + */ +var LegacyPromise = PDFJS.LegacyPromise = (function LegacyPromiseClosure() { + return function LegacyPromise() { + var resolve, reject; + var promise = new Promise(function (resolve_, reject_) { + resolve = resolve_; + reject = reject_; + }); + promise.resolve = resolve; + promise.reject = reject; + return promise; + }; +})(); + +/** + * Polyfill for Promises: * The following promise implementation tries to generally implment the * Promise/A+ spec. Some notable differences from other promise libaries are: * - There currently isn't a seperate deferred and promise object. @@ -842,7 +866,39 @@ function isPDFFunction(v) { * Based off of the work in: * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 */ -var Promise = PDFJS.Promise = (function PromiseClosure() { +(function PromiseClosure() { + if (globalScope.Promise) { + // Promises existing in the DOM/Worker, checking presence of all/resolve + if (typeof globalScope.Promise.all !== 'function') { + globalScope.Promise.all = function (iterable) { + var count = 0, results = [], resolve, reject; + var promise = new globalScope.Promise(function (resolve_, reject_) { + resolve = resolve_; + reject = reject_; + }); + iterable.forEach(function (p, i) { + count++; + p.then(function (result) { + results[i] = result; + count--; + if (count === 0) { + resolve(results); + } + }, reject); + }); + if (count === 0) { + resolve(results); + } + return promise; + }; + } + if (typeof globalScope.Promise.resolve !== 'function') { + globalScope.Promise.resolve = function (x) { + return new globalScope.Promise(function (resolve) { resolve(x); }); + }; + } + return; + } var STATUS_PENDING = 0; var STATUS_RESOLVED = 1; var STATUS_REJECTED = 2; @@ -875,6 +931,8 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { }, runHandlers: function runHandlers() { + var RUN_TIMEOUT = 1; // ms + var timeoutAt = Date.now() + RUN_TIMEOUT; while (this.handlers.length > 0) { var handler = this.handlers.shift(); @@ -900,6 +958,14 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { } handler.nextPromise._updateStatus(nextStatus, nextValue); + if (Date.now() >= timeoutAt) { + break; + } + } + + if (this.handlers.length > 0) { + setTimeout(this.runHandlers.bind(this), 0); + return; } this.running = false; @@ -950,9 +1016,10 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { } }; - function Promise() { + function Promise(resolver) { this._status = STATUS_PENDING; this._handlers = []; + resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); } /** * Builds a promise that is resolved when all the passed in promises are @@ -961,11 +1028,15 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { * @return {Promise} New dependant promise. */ Promise.all = function Promise_all(promises) { - var deferred = new Promise(); + var resolveAll, rejectAll; + var deferred = new Promise(function (resolve, reject) { + resolveAll = resolve; + rejectAll = reject; + }); var unresolved = promises.length; var results = []; if (unresolved === 0) { - deferred.resolve(results); + resolveAll(results); return deferred; } function reject(reason) { @@ -973,7 +1044,7 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { return; } results = []; - deferred.reject(reason); + rejectAll(reason); } for (var i = 0, ii = promises.length; i < ii; ++i) { var promise = promises[i]; @@ -985,7 +1056,7 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { results[i] = value; unresolved--; if (unresolved === 0) - deferred.resolve(results); + resolveAll(results); }; })(i); if (Promise.isPromise(promise)) { @@ -1004,6 +1075,14 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { Promise.isPromise = function Promise_isPromise(value) { return value && typeof value.then === 'function'; }; + /** + * Creates resolved promise + * @param x resolve value + * @returns {Promise} + */ + Promise.resolve = function Promise_resolve(x) { + return new Promise(function (resolve) { resolve(x); }); + }; Promise.prototype = { _status: null, @@ -1035,24 +1114,19 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { HandlerManager.scheduleHandlers(this); }, - get isResolved() { - return this._status === STATUS_RESOLVED; - }, - - get isRejected() { - return this._status === STATUS_REJECTED; - }, - - resolve: function Promise_resolve(value) { + _resolve: function Promise_resolve(value) { this._updateStatus(STATUS_RESOLVED, value); }, - reject: function Promise_reject(reason) { + _reject: function Promise_reject(reason) { this._updateStatus(STATUS_REJECTED, reason); }, then: function Promise_then(onResolve, onReject) { - var nextPromise = new Promise(); + var nextPromise = new Promise(function (resolve, reject) { + this.resolve = reject; + this.reject = reject; + }); this._handlers.push({ thisPromise: this, onResolve: onResolve, @@ -1064,7 +1138,7 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { } }; - return Promise; + globalScope.Promise = Promise; })(); var StatTimer = (function StatTimerClosure() { @@ -1178,8 +1252,8 @@ function MessageHandler(name, comObj) { log.apply(null, data); }]; } - ah['_warn'] = [function ah_Warn(data) { - warn(data); + ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) { + UnsupportedManager.notify(data); }]; comObj.onmessage = function messageHandlerComObjOnMessage(event) { @@ -1196,7 +1270,12 @@ function MessageHandler(name, comObj) { } else if (data.action in ah) { var action = ah[data.action]; if (data.callbackId) { - var promise = new Promise(); + var deferred = {}; + var promise = new Promise(function (resolve, reject) { + deferred.resolve = resolve; + deferred.reject = reject; + }); + deferred.promise = promise; promise.then(function(resolvedData) { comObj.postMessage({ isReply: true, @@ -1204,7 +1283,7 @@ function MessageHandler(name, comObj) { data: resolvedData }); }); - action[0].call(action[1], data.data, promise); + action[0].call(action[1], data.data, deferred); } else { action[0].call(action[1], data.data); } @@ -1876,8 +1955,8 @@ var DeviceCmykCS = (function DeviceCmykCSClosure() { var CalGrayCS = (function CalGrayCSClosure() { function CalGrayCS(whitePoint, blackPoint, gamma) { this.name = 'CalGray'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); + this.numComps = 1; + this.defaultColor = new Float32Array([0]); if (!whitePoint) { error('WhitePoint missing - required for color space CalGray'); @@ -1908,7 +1987,7 @@ var CalGrayCS = (function CalGrayCSClosure() { } if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { - TODO(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + + warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + ', ZB: ' + this.ZB + ', only default values are supported.'); } @@ -1919,6 +1998,33 @@ var CalGrayCS = (function CalGrayCSClosure() { } } + function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { + // A represents a gray component of a calibrated gray space. + // A <---> AG in the spec + var A = src[srcOffset] * scale; + var AG = Math.pow(A, cs.G); + + // Computes intermediate variables M, L, N as per spec. + // Except if other than default BlackPoint values are used. + var M = cs.XW * AG; + var L = cs.YW * AG; + var N = cs.ZW * AG; + + // Decode XYZ, as per spec. + var X = M; + var Y = L; + var Z = N; + + // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4. + // This yields values in range [0, 100]. + var Lstar = Math.max(116 * Math.pow(Y, 1 / 3) - 16, 0); + + // Convert values to rgb range [0, 255]. + dest[destOffset] = Lstar * 255 / 100; + dest[destOffset + 1] = Lstar * 255 / 100; + dest[destOffset + 2] = Lstar * 255 / 100; + } + CalGrayCS.prototype = { getRgb: function CalGrayCS_getRgb(src, srcOffset) { var rgb = new Uint8Array(3); @@ -1927,41 +2033,16 @@ var CalGrayCS = (function CalGrayCSClosure() { }, getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, dest, destOffset) { - // A represents a gray component of a calibrated gray space. - // A <---> AG in the spec - var A = src[srcOffset]; - var AG = Math.pow(A, this.G); - - // Computes intermediate variables M, L, N as per spec. - // Except if other than default BlackPoint values are used. - var M = this.XW * AG; - var L = this.YW * AG; - var N = this.ZW * AG; - - // Decode XYZ, as per spec. - var X = M; - var Y = L; - var Z = N; - - // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4. - // This yields values in range [0, 100]. - var Lstar = Math.max(116 * Math.pow(Y, 1 / 3) - 16, 0); - - // Convert values to rgb range [0, 255]. - dest[destOffset] = Lstar * 255 / 100; - dest[destOffset + 1] = Lstar * 255 / 100; - dest[destOffset + 2] = Lstar * 255 / 100; + convertToRgb(this, src, srcOffset, dest, destOffset, 1); }, getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits) { - // TODO: This part is copied from DeviceGray. Make this utility function. - var scale = 255 / ((1 << bits) - 1); - var j = srcOffset, q = destOffset; + var scale = 1 / ((1 << bits) - 1); + for (var i = 0; i < count; ++i) { - var c = (scale * src[j++]) | 0; - dest[q++] = c; - dest[q++] = c; - dest[q++] = c; + convertToRgb(this, src, srcOffset, dest, destOffset, scale); + srcOffset += 1; + destOffset += 3; } }, getOutputLength: function CalGrayCS_getOutputLength(inputLength) { @@ -2155,7 +2236,7 @@ var Pattern = (function PatternClosure() { // Both radial and axial shadings are handled by RadialAxial shading. return new Shadings.RadialAxial(dict, matrix, xref, res); default: - TODO('Unsupported shading type: ' + type); + UnsupportedManager.notify(UNSUPPORTED_FEATURES.shadingPattern); return new Shadings.Dummy(); } }; @@ -2415,7 +2496,7 @@ var TilingPattern = (function TilingPatternClosure() { var commonObjs = this.commonObjs; var ctx = this.ctx; - TODO('TilingType: ' + tilingType); + info('TilingType: ' + tilingType); var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3]; @@ -2628,7 +2709,7 @@ var PDFFunction = (function PDFFunctionClosure() { if (order !== 1) { // No description how cubic spline interpolation works in PDF32000:2008 // As in poppler, ignoring order, linear interpolation may work as good - TODO('No support for cubic spline interpolation: ' + order); + info('No support for cubic spline interpolation: ' + order); } var encode = dict.get('Encode'); @@ -3521,7 +3602,7 @@ var Annotation = (function AnnotationClosure() { }, loadResources: function(keys) { - var promise = new Promise(); + var promise = new LegacyPromise(); this.appearance.dict.getAsync('Resources').then(function(resources) { if (!resources) { promise.resolve(); @@ -3540,7 +3621,7 @@ var Annotation = (function AnnotationClosure() { getOperatorList: function Annotation_getToOperatorList(evaluator) { - var promise = new Promise(); + var promise = new LegacyPromise(); if (!this.appearance) { promise.resolve(new OperatorList()); @@ -3646,7 +3727,7 @@ var Annotation = (function AnnotationClosure() { if (annotation.isViewable()) { return annotation; } else { - TODO('unimplemented annotation type: ' + subtype); + warn('unimplemented annotation type: ' + subtype); } }; @@ -3657,7 +3738,7 @@ var Annotation = (function AnnotationClosure() { annotationsReadyPromise.reject(e); } - var annotationsReadyPromise = new Promise(); + var annotationsReadyPromise = new LegacyPromise(); var annotationPromises = []; for (var i = 0, n = annotations.length; i < n; ++i) { @@ -3738,7 +3819,7 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() { Util.inherit(WidgetAnnotation, Annotation, { isViewable: function WidgetAnnotation_isViewable() { if (this.data.fieldType === 'Sig') { - TODO('unimplemented annotation type: Widget signature'); + warn('unimplemented annotation type: Widget signature'); return false; } @@ -3819,7 +3900,7 @@ var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() { return Annotation.prototype.getOperatorList.call(this, evaluator); } - var promise = new Promise(); + var promise = new LegacyPromise(); var opList = new OperatorList(); var data = this.data; @@ -3896,7 +3977,7 @@ var TextAnnotation = (function TextAnnotationClosure() { Util.inherit(TextAnnotation, Annotation, { getOperatorList: function TextAnnotation_getOperatorList(evaluator) { - var promise = new Promise(); + var promise = new LegacyPromise(); promise.resolve(new OperatorList()); return promise; }, @@ -4023,7 +4104,7 @@ var LinkAnnotation = (function LinkAnnotationClosure() { } else if (linkType === 'Named') { data.action = action.get('N').name; } else { - TODO('unrecognized link type: ' + linkType); + warn('unrecognized link type: ' + linkType); } } else if (dict.has('Dest')) { // simple destination link @@ -4512,7 +4593,7 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() { this.requestsByChunk = {}; this.callbacksByRequest = {}; - this.loadedStream = new Promise(); + this.loadedStream = new LegacyPromise(); if (args.initialData) { this.setInitialData(args.initialData); } @@ -4823,7 +4904,7 @@ var LocalPdfManager = (function LocalPdfManagerClosure() { function LocalPdfManager(data, password) { var stream = new Stream(data); this.pdfModel = new PDFDocument(this, stream, password); - this.loadedStream = new Promise(); + this.loadedStream = new LegacyPromise(); this.loadedStream.resolve(stream); } @@ -4832,7 +4913,7 @@ var LocalPdfManager = (function LocalPdfManagerClosure() { LocalPdfManager.prototype.ensure = function LocalPdfManager_ensure(obj, prop, args) { - var promise = new Promise(); + var promise = new LegacyPromise(); try { var value = obj[prop]; var result; @@ -4851,7 +4932,7 @@ var LocalPdfManager = (function LocalPdfManagerClosure() { LocalPdfManager.prototype.requestRange = function LocalPdfManager_requestRange(begin, end) { - var promise = new Promise(); + var promise = new LegacyPromise(); promise.resolve(); return promise; }; @@ -4900,7 +4981,7 @@ var NetworkPdfManager = (function NetworkPdfManagerClosure() { NetworkPdfManager.prototype.ensure = function NetworkPdfManager_ensure(obj, prop, args) { - var promise = new Promise(); + var promise = new LegacyPromise(); this.ensureHelper(promise, obj, prop, args); return promise; }; @@ -4931,7 +5012,7 @@ var NetworkPdfManager = (function NetworkPdfManagerClosure() { NetworkPdfManager.prototype.requestRange = function NetworkPdfManager_requestRange(begin, end) { - var promise = new Promise(); + var promise = new LegacyPromise(); this.streamManager.requestRange(begin, end, function() { promise.resolve(); }); @@ -5058,7 +5139,7 @@ var Page = (function PageClosure() { // TODO: add async inheritPageProp and remove this. this.resourcesPromise = this.pdfManager.ensure(this, 'resources'); } - var promise = new Promise(); + var promise = new LegacyPromise(); this.resourcesPromise.then(function resourceSuccess() { var objectLoader = new ObjectLoader(this.resources.map, keys, @@ -5071,13 +5152,13 @@ var Page = (function PageClosure() { }, getOperatorList: function Page_getOperatorList(handler) { var self = this; - var promise = new Promise(); + var promise = new LegacyPromise(); function reject(e) { promise.reject(e); } - var pageListPromise = new Promise(); + var pageListPromise = new LegacyPromise(); var pdfManager = this.pdfManager; var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', @@ -5143,7 +5224,7 @@ var Page = (function PageClosure() { var self = this; - var textContentPromise = new Promise(); + var textContentPromise = new LegacyPromise(); var pdfManager = this.pdfManager; var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', @@ -5518,7 +5599,7 @@ var Dict = (function DictClosure() { if (xref) { return xref.fetchIfRefAsync(value); } - promise = new Promise(); + promise = new LegacyPromise(); promise.resolve(value); return promise; } @@ -5527,7 +5608,7 @@ var Dict = (function DictClosure() { if (xref) { return xref.fetchIfRefAsync(value); } - promise = new Promise(); + promise = new LegacyPromise(); promise.resolve(value); return promise; } @@ -5535,7 +5616,7 @@ var Dict = (function DictClosure() { if (xref) { return xref.fetchIfRefAsync(value); } - promise = new Promise(); + promise = new LegacyPromise(); promise.resolve(value); return promise; }, @@ -5855,7 +5936,7 @@ var Catalog = (function CatalogClosure() { }, getPageDict: function Catalog_getPageDict(pageIndex) { - var promise = new Promise(); + var promise = new LegacyPromise(); var nodesToVisit = [this.catDict.getRaw('Pages')]; var currentPageIndex = 0; var xref = this.xref; @@ -6541,14 +6622,14 @@ var XRef = (function XRefClosure() { }, fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) { if (!isRef(obj)) { - var promise = new Promise(); + var promise = new LegacyPromise(); promise.resolve(obj); return promise; } return this.fetchAsync(obj); }, fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) { - var promise = new Promise(); + var promise = new LegacyPromise(); var tryFetch = function (promise) { try { promise.resolve(this.fetch(ref, suppressEncryption)); @@ -6675,7 +6756,7 @@ var ObjectLoader = (function() { load: function ObjectLoader_load() { var keys = this.keys; - this.promise = new Promise(); + this.promise = new LegacyPromise(); // Don't walk the graph if all the data is already loaded. if (!(this.xref.stream instanceof ChunkedStream) || this.xref.stream.getMissingChunks().length === 0) { @@ -14841,9 +14922,9 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { gStateObj.push([key, value]); break; case 'SMask': - // We support the default so don't trigger the TODO. + // We support the default so don't trigger a warning bar. if (!isName(value) || value.name != 'None') - TODO('graphic state operator ' + key); + UnsupportedManager.notify(UNSUPPORTED_FEATURES.smask); break; // Only generate info log messages for the following since // they are unlikey to have a big impact on the rendering. @@ -14933,6 +15014,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { try { translated = this.translateFont(font, xref); } catch (e) { + UnsupportedManager.notify(UNSUPPORTED_FEATURES.font); translated = new ErrorFont(e instanceof Error ? e.message : e); } font.translated = translated; @@ -14980,7 +15062,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // dictionary var parser = new Parser(new Lexer(stream, OP_MAP), false, xref); - var promise = new Promise(); + var promise = new LegacyPromise(); var args = []; while (true) { @@ -15416,10 +15498,11 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { Encodings.WinAnsiEncoding : Encodings.StandardEncoding; // The Symbolic attribute can be misused for regular fonts - // Heuristic: we have to check if the font is a standard one also + // Heuristic: we have to check if the font is a standard one or + // toUnicode is provided if (!!(flags & FontFlags.Symbolic)) { - baseEncoding = !properties.file ? Encodings.SymbolSetEncoding : - Encodings.MacRomanEncoding; + baseEncoding = !properties.file && !properties.toUnicode ? + Encodings.SymbolSetEncoding : Encodings.MacRomanEncoding; } if (dict.has('Encoding')) { var encoding = dict.get('Encoding'); @@ -16546,6 +16629,76 @@ var HalfwidthCMaps = { 'UniJIS-UCS2-HW-V': true }; +// Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID fonts +// but does not embed the CID to GID mapping. The mapping is incomplete for all +// glyphs, but common for some set of the standard fonts. +var GlyphMapForStandardFonts = { + '2': 10, '3': 32, '4': 33, '5': 34, '6': 35, '7': 36, '8': 37, '9': 38, + '10': 39, '11': 40, '12': 41, '13': 42, '14': 43, '15': 44, '16': 173, + '17': 46, '18': 47, '19': 48, '20': 49, '21': 50, '22': 51, '23': 52, + '24': 53, '25': 54, '26': 55, '27': 56, '28': 57, '29': 58, '30': 894, + '31': 60, '32': 61, '33': 62, '34': 63, '35': 64, '36': 65, '37': 66, + '38': 67, '39': 68, '40': 69, '41': 70, '42': 71, '43': 72, '44': 73, + '45': 74, '46': 75, '47': 76, '48': 77, '49': 78, '50': 79, '51': 80, + '52': 81, '53': 82, '54': 83, '55': 84, '56': 85, '57': 86, '58': 87, + '59': 88, '60': 89, '61': 90, '62': 91, '63': 92, '64': 93, '65': 94, + '66': 95, '67': 96, '68': 97, '69': 98, '70': 99, '71': 100, '72': 101, + '73': 102, '74': 103, '75': 104, '76': 105, '77': 106, '78': 107, '79': 108, + '80': 109, '81': 110, '82': 111, '83': 112, '84': 113, '85': 114, '86': 115, + '87': 116, '88': 117, '89': 118, '90': 119, '91': 120, '92': 121, '93': 122, + '94': 123, '95': 124, '96': 125, '97': 126, '98': 196, '99': 197, '100': 199, + '101': 201, '102': 209, '103': 214, '104': 220, '105': 225, '106': 224, + '107': 226, '108': 228, '109': 227, '110': 229, '111': 231, '112': 233, + '113': 232, '114': 234, '115': 235, '116': 237, '117': 236, '118': 238, + '119': 239, '120': 241, '121': 243, '122': 242, '123': 244, '124': 246, + '125': 245, '126': 250, '127': 249, '128': 251, '129': 252, '130': 8224, + '131': 176, '132': 162, '133': 163, '134': 167, '135': 8226, '136': 182, + '137': 223, '138': 174, '139': 169, '140': 8482, '141': 180, '142': 168, + '143': 8800, '144': 198, '145': 216, '146': 8734, '147': 177, '148': 8804, + '149': 8805, '150': 165, '151': 181, '152': 8706, '153': 8721, '154': 8719, + '156': 8747, '157': 170, '158': 186, '159': 8486, '160': 230, '161': 248, + '162': 191, '163': 161, '164': 172, '165': 8730, '166': 402, '167': 8776, + '168': 8710, '169': 171, '170': 187, '171': 8230, '210': 218, '305': 963, + '306': 964, '307': 966, '308': 8215, '309': 8252, '310': 8319, '311': 8359, + '312': 8592, '313': 8593, '337': 9552, '493': 1039, '494': 1040, '705': 1524, + '706': 8362, '710': 64288, '711': 64298, '759': 1617, '761': 1776, + '763': 1778, '775': 1652, '777': 1764, '778': 1780, '779': 1781, '780': 1782, + '782': 771, '783': 64726, '786': 8363, '788': 8532, '790': 768, '791': 769, + '792': 768, '795': 803, '797': 64336, '798': 64337, '799': 64342, + '800': 64343, '801': 64344, '802': 64345, '803': 64362, '804': 64363, + '805': 64364, '2424': 7821, '2425': 7822, '2426': 7823, '2427': 7824, + '2428': 7825, '2429': 7826, '2430': 7827, '2433': 7682, '2678': 8045, + '2679': 8046, '2830': 1552, '2838': 686, '2840': 751, '2842': 753, + '2843': 754, '2844': 755, '2846': 757, '2856': 767, '2857': 848, '2858': 849, + '2862': 853, '2863': 854, '2864': 855, '2865': 861, '2866': 862, '2906': 7460, + '2908': 7462, '2909': 7463, '2910': 7464, '2912': 7466, '2913': 7467, + '2914': 7468, '2916': 7470, '2917': 7471, '2918': 7472, '2920': 7474, + '2921': 7475, '2922': 7476, '2924': 7478, '2925': 7479, '2926': 7480, + '2928': 7482, '2929': 7483, '2930': 7484, '2932': 7486, '2933': 7487, + '2934': 7488, '2936': 7490, '2937': 7491, '2938': 7492, '2940': 7494, + '2941': 7495, '2942': 7496, '2944': 7498, '2946': 7500, '2948': 7502, + '2950': 7504, '2951': 7505, '2952': 7506, '2954': 7508, '2955': 7509, + '2956': 7510, '2958': 7512, '2959': 7513, '2960': 7514, '2962': 7516, + '2963': 7517, '2964': 7518, '2966': 7520, '2967': 7521, '2968': 7522, + '2970': 7524, '2971': 7525, '2972': 7526, '2974': 7528, '2975': 7529, + '2976': 7530, '2978': 1537, '2979': 1538, '2980': 1539, '2982': 1549, + '2983': 1551, '2984': 1552, '2986': 1554, '2987': 1555, '2988': 1556, + '2990': 1623, '2991': 1624, '2995': 1775, '2999': 1791, '3002': 64290, + '3003': 64291, '3004': 64292, '3006': 64294, '3007': 64295, '3008': 64296, + '3011': 1900, '3014': 8223, '3015': 8244, '3017': 7532, '3018': 7533, + '3019': 7534, '3075': 7590, '3076': 7591, '3079': 7594, '3080': 7595, + '3083': 7598, '3084': 7599, '3087': 7602, '3088': 7603, '3091': 7606, + '3092': 7607, '3095': 7610, '3096': 7611, '3099': 7614, '3100': 7615, + '3103': 7618, '3104': 7619, '3107': 8337, '3108': 8338, '3116': 1884, + '3119': 1885, '3120': 1885, '3123': 1886, '3124': 1886, '3127': 1887, + '3128': 1887, '3131': 1888, '3132': 1888, '3135': 1889, '3136': 1889, + '3139': 1890, '3140': 1890, '3143': 1891, '3144': 1891, '3147': 1892, + '3148': 1892, '3153': 580, '3154': 581, '3157': 584, '3158': 585, '3161': 588, + '3162': 589, '3165': 891, '3166': 892, '3169': 1274, '3170': 1275, + '3173': 1278, '3174': 1279, '3181': 7622, '3182': 7623, '3282': 11799, + '3316': 578, '3379': 42785, '3393': 1159, '3416': 8377 +}; + var decodeBytes; if (typeof TextDecoder !== 'undefined') { // The encodings supported by TextDecoder can be found at: @@ -16585,7 +16738,7 @@ function sjis83pvToUnicode(str) { // TODO: 83pv has incompatible mappings in ed40..ee9c range. return decodeBytes(bytes, 'shift_jis', true); } catch (e) { - TODO('Unsupported 83pv character found'); + warn('Unsupported 83pv character found'); // Just retry without checking errors for now. return decodeBytes(bytes, 'shift_jis'); } @@ -16597,7 +16750,7 @@ function sjis90pvToUnicode(str) { // TODO: 90pv has incompatible mappings in 8740..879c and eb41..ee9c. return decodeBytes(bytes, 'shift_jis', true); } catch (e) { - TODO('Unsupported 90pv character found'); + warn('Unsupported 90pv character found'); // Just retry without checking errors for now. return decodeBytes(bytes, 'shift_jis'); } @@ -18300,6 +18453,7 @@ var Font = (function FontClosure() { // The file data is not specified. Trying to fix the font name // to be used with the canvas.font. var fontName = name.replace(/[,_]/g, '-'); + var isStandardFont = fontName in stdFontMap; fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; this.bold = (fontName.search(/bold/gi) != -1); @@ -18315,6 +18469,17 @@ var Font = (function FontClosure() { this.encoding = properties.baseEncoding; this.noUnicodeAdaptation = true; + if (isStandardFont && type === 'CIDFontType2' && + properties.cidEncoding.indexOf('Identity-') === 0) { + // Standard fonts might be embedded as CID font without glyph mapping. + // Building one based on GlyphMapForStandardFonts. + var map = []; + for (var code in GlyphMapForStandardFonts) { + map[+code] = GlyphMapForStandardFonts[code]; + } + this.toFontChar = map; + this.toUnicode = map; + } this.loadedName = fontName.split('-')[0]; this.loading = false; return; @@ -20429,7 +20594,7 @@ var Font = (function FontClosure() { var cidEncoding = properties.cidEncoding; if (properties.toUnicode) { if (cidEncoding && cidEncoding.indexOf('Identity-') !== 0) { - TODO('Need to create a reverse mapping from \'ToUnicode\' CMap'); + warn('Need to create a reverse mapping from \'ToUnicode\' CMap'); } return; // 'ToUnicode' CMap will be used } @@ -28110,7 +28275,7 @@ var PDFImage = (function PDFImageClosure() { if (image.getParams) { // JPX/JPEG2000 streams directly contain bits per component // and color space mode information. - TODO('get params from actual stream'); + warn('get params from actual stream'); // var bits = ... // var colorspace = ... } @@ -28143,7 +28308,7 @@ var PDFImage = (function PDFImageClosure() { if (!this.imageMask) { var colorSpace = dict.get('ColorSpace', 'CS'); if (!colorSpace) { - TODO('JPX images (which don"t require color spaces'); + warn('JPX images (which don"t require color spaces'); colorSpace = new Name('DeviceRGB'); } this.colorSpace = ColorSpace.parse(colorSpace, xref, res); @@ -28185,9 +28350,9 @@ var PDFImage = (function PDFImageClosure() { */ PDFImage.buildImage = function PDFImage_buildImage(callback, handler, xref, res, image, inline) { - var imageDataPromise = new Promise(); - var smaskPromise = new Promise(); - var maskPromise = new Promise(); + var imageDataPromise = new LegacyPromise(); + var smaskPromise = new LegacyPromise(); + var maskPromise = new LegacyPromise(); // The image data and smask data may not be ready yet, wait till both are // resolved. Promise.all([imageDataPromise, smaskPromise, maskPromise]).then( @@ -32732,12 +32897,18 @@ var FlateStream = (function FlateStreamClosure() { var buffer = this.ensureBuffer(bufferLength + blockLen); var end = bufferLength + blockLen; this.bufferLength = end; - for (var n = bufferLength; n < end; ++n) { - if (typeof (b = bytes[bytesPos++]) == 'undefined') { + if (blockLen === 0) { + if (typeof bytes[bytesPos] == 'undefined') { this.eof = true; - break; } - buffer[n] = b; + } else { + for (var n = bufferLength; n < end; ++n) { + if (typeof (b = bytes[bytesPos++]) == 'undefined') { + this.eof = true; + break; + } + buffer[n] = b; + } } this.bytesPos = bytesPos; return; @@ -34562,7 +34733,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { var pdfManager; function loadDocument(recoveryMode) { - var loadDocumentPromise = new Promise(); + var loadDocumentPromise = new LegacyPromise(); var parseSuccess = function parseSuccess() { var numPagesPromise = pdfManager.ensureModel('numPages'); @@ -34606,7 +34777,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { } function getPdfManager(data) { - var pdfManagerPromise = new Promise(); + var pdfManagerPromise = new LegacyPromise(); var source = data.source; var disableRange = data.disableRange; @@ -34765,6 +34936,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { PDFJS.maxImageSize = data.maxImageSize === undefined ? -1 : data.maxImageSize; PDFJS.disableFontFace = data.disableFontFace; + PDFJS.verbosity = data.verbosity; getPdfManager(data).then(function pdfManagerReady() { loadDocument(false).then(onSuccess, function loadFailure(ex) { @@ -34773,7 +34945,8 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { if (ex instanceof PasswordException) { // after password exception prepare to receive a new password // to repeat loading - pdfManager.passwordChangedPromise = new Promise(); + pdfManager.passwordChangedPromise = + new LegacyPromise(); pdfManager.passwordChangedPromise.then(pdfManagerReady); } @@ -34810,31 +34983,31 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { }); }); - handler.on('GetPageIndex', function wphSetupGetPageIndex(data, promise) { + handler.on('GetPageIndex', function wphSetupGetPageIndex(data, deferred) { var ref = new Ref(data.ref.num, data.ref.gen); pdfManager.pdfModel.catalog.getPageIndex(ref).then(function (pageIndex) { - promise.resolve(pageIndex); - }, promise.reject.bind(promise)); + deferred.resolve(pageIndex); + }, deferred.reject); }); handler.on('GetDestinations', - function wphSetupGetDestinations(data, promise) { + function wphSetupGetDestinations(data, deferred) { pdfManager.ensureCatalog('destinations').then(function(destinations) { - promise.resolve(destinations); + deferred.resolve(destinations); }); } ); - handler.on('GetData', function wphSetupGetData(data, promise) { + handler.on('GetData', function wphSetupGetData(data, deferred) { pdfManager.requestLoadedStream(); pdfManager.onLoadedStream().then(function(stream) { - promise.resolve(stream.bytes); + deferred.resolve(stream.bytes); }); }); - handler.on('DataLoaded', function wphSetupDataLoaded(data, promise) { + handler.on('DataLoaded', function wphSetupDataLoaded(data, deferred) { pdfManager.onLoadedStream().then(function(stream) { - promise.resolve({ length: stream.bytes.byteLength }); + deferred.resolve({ length: stream.bytes.byteLength }); }); }); @@ -34899,29 +35072,29 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { }); }, this); - handler.on('GetTextContent', function wphExtractText(data, promise) { + handler.on('GetTextContent', function wphExtractText(data, deferred) { pdfManager.getPage(data.pageIndex).then(function(page) { var pageNum = data.pageIndex + 1; var start = Date.now(); page.extractTextContent().then(function(textContent) { - promise.resolve(textContent); + deferred.resolve(textContent); log('text indexing: page=%d - time=%dms', pageNum, Date.now() - start); }, function (e) { // Skip errored pages - promise.reject(e); + deferred.reject(e); }); }); }); - handler.on('Cleanup', function wphCleanup(data, promise) { + handler.on('Cleanup', function wphCleanup(data, deferred) { pdfManager.cleanup(); - promise.resolve(true); + deferred.resolve(true); }); - handler.on('Terminate', function wphTerminate(data, promise) { + handler.on('Terminate', function wphTerminate(data, deferred) { pdfManager.terminate(); - promise.resolve(); + deferred.resolve(); }); } }; @@ -34963,15 +35136,12 @@ var workerConsole = { if (typeof window === 'undefined') { globalScope.console = workerConsole; - // Add a logger so we can pass warnings on to the main thread, errors will - // throw an exception which will be forwarded on automatically. - PDFJS.LogManager.addLogger({ - warn: function(msg) { - globalScope.postMessage({ - action: '_warn', - data: msg - }); - } + // Listen for unsupported features so we can pass them on to the main thread. + PDFJS.UnsupportedManager.listen(function (msg) { + globalScope.postMessage({ + action: '_unsupported_feature', + data: msg + }); }); var handler = new MessageHandler('worker_processor', this); diff --git a/static/pdf.js/viewer.js b/static/pdf.js/viewer.js index 08cbaea18..bb3f54e49 100644 --- a/static/pdf.js/viewer.js +++ b/static/pdf.js/viewer.js @@ -17,8 +17,9 @@ /* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, PDFFindBar, CustomStyle, PDFFindController, ProgressBar, TextLayerBuilder, DownloadManager, getFileName, scrollIntoView, getPDFFileNameFromURL, PDFHistory, - Preferences, Settings, PageView, ThumbnailView, noContextMenuHandler, - SecondaryToolbar, PasswordPrompt, PresentationMode, HandTool */ + Preferences, ViewHistory, PageView, ThumbnailView, + noContextMenuHandler, SecondaryToolbar, PasswordPrompt, + PresentationMode, HandTool, Promise */ 'use strict'; @@ -32,8 +33,8 @@ var VERTICAL_PADDING = 5; var MAX_AUTO_SCALE = 1.25; var MIN_SCALE = 0.25; var MAX_SCALE = 4.0; +var VIEW_HISTORY_MEMORY = 20; var IMAGE_DIR = '/static/pdf.js/images/'; -var SETTINGS_MEMORY = 20; var SCALE_SELECT_CONTAINER_PADDING = 8; var SCALE_SELECT_PADDING = 22; var THUMBNAIL_SCROLL_MARGIN = -19; @@ -323,7 +324,9 @@ var DEFAULT_PREFERENCES = { var Preferences = (function PreferencesClosure() { function Preferences() { this.prefs = {}; + this.isInitializedPromiseResolved = false; this.initializedPromise = this.readFromStorage().then(function(prefObj) { + this.isInitializedPromiseResolved = true; if (prefObj) { this.prefs = prefObj; } @@ -336,19 +339,19 @@ var Preferences = (function PreferencesClosure() { }, readFromStorage: function Preferences_readFromStorage() { - var readFromStoragePromise = new PDFJS.Promise(); + var readFromStoragePromise = Promise.resolve(); return readFromStoragePromise; }, reset: function Preferences_reset() { - if (this.initializedPromise.isResolved) { + if (this.isInitializedPromiseResolved) { this.prefs = {}; this.writeToStorage(this.prefs); } }, set: function Preferences_set(name, value) { - if (!this.initializedPromise.isResolved) { + if (!this.isInitializedPromiseResolved) { return; } else if (DEFAULT_PREFERENCES[name] === undefined) { console.error('Preferences_set: \'' + name + '\' is undefined.'); @@ -379,7 +382,7 @@ var Preferences = (function PreferencesClosure() { if (defaultPref === undefined) { console.error('Preferences_get: \'' + name + '\' is undefined.'); return; - } else if (this.initializedPromise.isResolved) { + } else if (this.isInitializedPromiseResolved) { var pref = this.prefs[name]; if (pref !== undefined) { @@ -401,11 +404,12 @@ Preferences.prototype.writeToStorage = function(prefObj) { }; Preferences.prototype.readFromStorage = function() { - var readFromStoragePromise = new PDFJS.Promise(); - if (isLocalStorageEnabled) { - var readPrefs = JSON.parse(localStorage.getItem('preferences')); - readFromStoragePromise.resolve(readPrefs); - } + var readFromStoragePromise = new Promise(function (resolve) { + if (isLocalStorageEnabled) { + var readPrefs = JSON.parse(localStorage.getItem('preferences')); + resolve(readPrefs); + } + }); return readFromStoragePromise; }; @@ -614,34 +618,28 @@ var currentPageNumber = 1; /** - * Settings Manager - This is a utility for saving settings. + * View History - This is a utility for saving various view parameters for + * recently opened files. * - * The way that settings are stored depends on how PDF.js is built, + * The way that the view parameters are stored depends on how PDF.js is built, * for 'node make ' the following cases exist: * - FIREFOX or MOZCENTRAL - uses about:config. * - B2G - uses asyncStorage. * - GENERIC or CHROME - uses localStorage, if it is available. */ -var Settings = (function SettingsClosure() { - var isLocalStorageEnabled = (function localStorageEnabledTest() { - // Feature test as per http://diveintohtml5.info/storage.html - // The additional localStorage call is to get around a FF quirk, see - // bug #495747 in bugzilla - try { - return ('localStorage' in window && window['localStorage'] !== null && - localStorage); - } catch (e) { - return false; - } - })(); - - function Settings(fingerprint) { +var ViewHistory = (function ViewHistoryClosure() { + function ViewHistory(fingerprint) { this.fingerprint = fingerprint; - this.initializedPromise = new PDFJS.Promise(); + var initializedPromiseResolve; + this.isInitializedPromiseResolved = false; + this.initializedPromise = new Promise(function (resolve) { + initializedPromiseResolve = resolve; + }); - var resolvePromise = (function settingsResolvePromise(db) { + var resolvePromise = (function ViewHistoryResolvePromise(db) { + this.isInitializedPromiseResolved = true; this.initialize(db || '{}'); - this.initializedPromise.resolve(); + initializedPromiseResolve(); }).bind(this); @@ -651,13 +649,13 @@ var Settings = (function SettingsClosure() { } } - Settings.prototype = { - initialize: function settingsInitialize(database) { + ViewHistory.prototype = { + initialize: function ViewHistory_initialize(database) { database = JSON.parse(database); if (!('files' in database)) { database.files = []; } - if (database.files.length >= SETTINGS_MEMORY) { + if (database.files.length >= VIEW_HISTORY_MEMORY) { database.files.shift(); } var index; @@ -675,8 +673,8 @@ var Settings = (function SettingsClosure() { this.database = database; }, - set: function settingsSet(name, val) { - if (!this.initializedPromise.isResolved) { + set: function ViewHistory_set(name, val) { + if (!this.isInitializedPromiseResolved) { return; } var file = this.file; @@ -690,15 +688,15 @@ var Settings = (function SettingsClosure() { } }, - get: function settingsGet(name, defaultValue) { - if (!this.initializedPromise.isResolved) { + get: function ViewHistory_get(name, defaultValue) { + if (!this.isInitializedPromiseResolved) { return defaultValue; } return this.file[name] || defaultValue; } }; - return Settings; + return ViewHistory; })(); @@ -861,7 +859,7 @@ var PDFFindBar = { -/* globals PDFFindBar, PDFJS, FindStates, FirefoxCom */ +/* globals PDFFindBar, PDFJS, FindStates, FirefoxCom, Promise */ /** * Provides a "search" or "find" functionality for the PDF. @@ -909,8 +907,6 @@ var PDFFindController = { integratedFind: false, - firstPagePromise: new PDFJS.Promise(), - initialize: function(options) { if(typeof PDFFindBar === 'undefined' || PDFFindBar === null) { throw 'PDFFindController cannot be initialized ' + @@ -927,6 +923,9 @@ var PDFFindController = { 'findcasesensitivitychange' ]; + this.firstPagePromise = new Promise(function (resolve) { + this.resolveFirstPage = resolve; + }.bind(this)); this.handleEvent = this.handleEvent.bind(this); for (var i = 0; i < events.length; i++) { @@ -984,8 +983,11 @@ var PDFFindController = { this.startedTextExtraction = true; this.pageContents = []; + var extractTextPromisesResolves = []; for (var i = 0, ii = this.pdfPageSource.pdfDocument.numPages; i < ii; i++) { - this.extractTextPromises.push(new PDFJS.Promise()); + this.extractTextPromises.push(new Promise(function (resolve) { + extractTextPromisesResolves.push(resolve); + })); } var self = this; @@ -1003,7 +1005,7 @@ var PDFFindController = { // Store the pageContent as a string. self.pageContents.push(str); - self.extractTextPromises[pageIndex].resolve(pageIndex); + extractTextPromisesResolves[pageIndex](pageIndex); if ((pageIndex + 1) < self.pdfPageSource.pages.length) extractPageText(pageIndex + 1); } @@ -1572,7 +1574,10 @@ var SecondaryToolbar = { // Attach the event listeners. var elements = [ + // Button to toggle the visibility of the secondary toolbar: { element: this.toggleButton, handler: this.toggle }, + // All items within the secondary toolbar + // (except for toggleHandTool, hand_tool.js is responsible for it): { element: this.presentationModeButton, handler: this.presentationModeClick }, { element: this.openFile, handler: this.openFileClick }, @@ -2158,6 +2163,9 @@ var HandTool = { this.handTool = new GrabToPan({ element: options.container, onActiveChanged: function(isActive) { + if (!toggleHandTool) { + return; + } if (isActive) { toggleHandTool.title = mozL10n.get('hand_tool_disable.title', null, 'Disable hand tool'); @@ -2169,9 +2177,11 @@ var HandTool = { toggleHandTool.firstElementChild.textContent = mozL10n.get('hand_tool_enable_label', null, 'Enable hand tool'); } - } + } }); - toggleHandTool.addEventListener('click', this.handTool.toggle, false); + if (toggleHandTool) { + toggleHandTool.addEventListener('click', this.handTool.toggle, false); + } // TODO: Read global prefs and call this.handTool.activate() if needed. }, @@ -2312,19 +2322,37 @@ var PDFView = { }, true); }, + _setScaleUpdatePages: function pdfView_setScaleUpdatePages( + newScale, newValue, resetAutoSettings, noScroll) { + this.currentScaleValue = newValue; + if (newScale === this.currentScale) { + return; + } + for (var i = 0, ii = this.pages.length; i < ii; i++) { + this.pages[i].update(newScale); + } + this.currentScale = newScale; + + if (!noScroll) { + this.pages[this.page - 1].scrollIntoView(); + } + var event = document.createEvent('UIEvents'); + event.initUIEvent('scalechange', false, false, window, 0); + event.scale = newScale; + event.resetAutoSettings = resetAutoSettings; + window.dispatchEvent(event); + }, + setScale: function pdfViewSetScale(value, resetAutoSettings, noScroll) { if (value === 'custom') { return; } - var pages = this.pages; - var currentPage = pages[this.page - 1]; - var number = parseFloat(value); - var scale; + var scale = parseFloat(value); - if (number > 0) { - scale = number; - resetAutoSettings = true; + if (scale > 0) { + this._setScaleUpdatePages(scale, value, true, noScroll); } else { + var currentPage = this.pages[this.page - 1]; if (!currentPage) { return; } @@ -2353,28 +2381,8 @@ var PDFView = { '\' is an unknown zoom value.'); return; } - } - this.currentScaleValue = value; + this._setScaleUpdatePages(scale, value, resetAutoSettings, noScroll); - if (scale === this.currentScale) { - return; - } - for (var i = 0, ii = pages.length; i < ii; i++) { - pages[i].update(scale); - } - this.currentScale = scale; - - if (!noScroll) { - currentPage.scrollIntoView(); - } - - var event = document.createEvent('UIEvents'); - event.initUIEvent('scalechange', false, false, window, 0); - event.scale = scale; - event.resetAutoSettings = resetAutoSettings; - window.dispatchEvent(event); - - if (!number) { selectScaleOption(value); } }, @@ -2681,7 +2689,7 @@ var PDFView = { ).then(null, noData); }, - fallback: function pdfViewFallback() { + fallback: function pdfViewFallback(featureId) { return; }, @@ -2842,12 +2850,17 @@ var PDFView = { load: function pdfViewLoad(pdfDocument, scale) { var self = this; - var onePageRendered = new PDFJS.Promise(); + var isOnePageRenderedResolved = false; + var resolveOnePageRendered = null; + var onePageRendered = new Promise(function (resolve) { + resolveOnePageRendered = resolve; + }); function bindOnAfterDraw(pageView, thumbnailView) { // when page is painted, using the image as thumbnail base pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() { - if (!onePageRendered.isResolved) { - onePageRendered.resolve(); + if (!isOnePageRenderedResolved) { + isOnePageRenderedResolved = true; + resolveOnePageRendered(); } thumbnailView.setImage(pageView.canvas); }; @@ -2888,7 +2901,7 @@ var PDFView = { var prefs = PDFView.prefs = new Preferences(); PDFView.documentFingerprint = id; - var store = PDFView.store = new Settings(id); + var store = PDFView.store = new ViewHistory(id); this.pageRotation = 0; @@ -2896,7 +2909,11 @@ var PDFView = { var pagesRefMap = this.pagesRefMap = {}; var thumbnails = this.thumbnails = []; - var pagesPromise = this.pagesPromise = new PDFJS.Promise(); + var resolvePagesPromise; + var pagesPromise = new Promise(function (resolve) { + resolvePagesPromise = resolve; + }); + this.pagesPromise = pagesPromise; var firstPagePromise = pdfDocument.getPage(1); @@ -2932,13 +2949,13 @@ var PDFView = { pagesRefMap[refStr] = pageNum; getPagesLeft--; if (!getPagesLeft) { - pagesPromise.resolve(); + resolvePagesPromise(); } }.bind(null, pageNum)); } } else { // XXX: Printing is semi-broken with auto fetch disabled. - pagesPromise.resolve(); + resolvePagesPromise(); } }); @@ -2948,12 +2965,12 @@ var PDFView = { PDFView.loadingBar.setWidth(container); - PDFFindController.firstPagePromise.resolve(); + PDFFindController.resolveFirstPage(); }); var prefsPromise = prefs.initializedPromise; var storePromise = store.initializedPromise; - PDFJS.Promise.all([firstPagePromise, prefsPromise, storePromise]). + Promise.all([firstPagePromise, prefsPromise, storePromise]). then(function() { var showPreviousViewOnLoad = prefs.get('showPreviousViewOnLoad'); var defaultZoomValue = prefs.get('defaultZoomValue'); @@ -2987,7 +3004,7 @@ var PDFView = { pdfDocument.getJavaScript().then(function(javaScript) { if (javaScript.length) { console.warn('Warning: JavaScript is not supported'); - PDFView.fallback(); + PDFView.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript); } // Hack to support auto printing. var regex = /\bprint\s*\(/g; @@ -3013,7 +3030,7 @@ var PDFView = { // outline depends on destinations and pagesRefMap var promises = [pagesPromise, destinationsPromise, PDFView.animationStartedPromise]; - PDFJS.Promise.all(promises).then(function() { + Promise.all(promises).then(function() { pdfDocument.getOutline().then(function(outline) { self.outline = new DocumentOutlineView(outline); document.getElementById('viewOutline').disabled = !outline; @@ -3052,7 +3069,7 @@ var PDFView = { if (info.IsAcroFormPresent) { console.warn('Warning: AcroForm/XFA is not supported'); - PDFView.fallback(); + PDFView.fallback(PDFJS.UNSUPPORTED_FEATURES.forms); } }); @@ -3396,7 +3413,7 @@ var PDFView = { div.removeChild(div.lastChild); }, - rotatePages: function pdfViewPageRotation(delta) { + rotatePages: function pdfViewRotatePages(delta) { this.pageRotation = (this.pageRotation + 360 + delta) % 360; @@ -4045,7 +4062,7 @@ var PageView = function pageView(container, id, scale, }; var renderTask = this.renderTask = this.pdfPage.render(renderContext); - this.renderTask.then( + this.renderTask.promise.then( function pdfPageRenderCallback() { pageViewDrawCallback(null); }, @@ -4105,7 +4122,7 @@ var PageView = function pageView(container, id, scale, viewport: viewport }; - pdfPage.render(renderContext).then(function() { + pdfPage.render(renderContext).promise.then(function() { // Tell the printEngine that rendering this canvas/page has finished. obj.done(); self.pdfPage.destroy(); @@ -4147,7 +4164,7 @@ var ThumbnailView = function thumbnailView(container, id, defaultViewport) { this.pdfPage = undefined; this.viewport = defaultViewport; - this.pdfPageRotate = defaultViewport.rotate; + this.pdfPageRotate = defaultViewport.rotation; this.rotation = 0; this.pageWidth = this.viewport.width; @@ -4184,20 +4201,16 @@ var ThumbnailView = function thumbnailView(container, id, defaultViewport) { this.setPdfPage = function thumbnailViewSetPdfPage(pdfPage) { this.pdfPage = pdfPage; this.pdfPageRotate = pdfPage.rotate; - this.viewport = pdfPage.getViewport(1); + var totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport(1, totalRotation); this.update(); }; - this.update = function thumbnailViewUpdate(rot) { - if (!this.pdfPage) { - return; + this.update = function thumbnailViewUpdate(rotation) { + if (rotation !== undefined) { + this.rotation = rotation; } - - if (rot !== undefined) { - this.rotation = rot; - } - - var totalRotation = (this.rotation + this.pdfPage.rotate) % 360; + var totalRotation = (this.rotation + this.pdfPageRotate) % 360; this.viewport = this.viewport.clone({ scale: 1, rotation: totalRotation @@ -4283,7 +4296,7 @@ var ThumbnailView = function thumbnailView(container, id, defaultViewport) { cont(); } }; - this.pdfPage.render(renderContext).then( + this.pdfPage.render(renderContext).promise.then( function pdfPageRenderCallback() { self.renderingState = RenderingStates.FINISHED; callback(); @@ -4297,8 +4310,17 @@ var ThumbnailView = function thumbnailView(container, id, defaultViewport) { }; this.setImage = function thumbnailViewSetImage(img) { - if (this.hasImage || !img) + if (!this.pdfPage) { + var promise = PDFView.getPage(this.id); + promise.then(function(pdfPage) { + this.setPdfPage(pdfPage); + this.setImage(img); + }.bind(this)); return; + } + if (this.hasImage || !img) { + return; + } this.renderingState = RenderingStates.FINISHED; var ctx = this.getPageDrawContext(); ctx.drawImage(img, 0, 0, img.width, img.height, @@ -4780,6 +4802,10 @@ document.addEventListener('DOMContentLoaded', function webViewerLoad(evt) { USE_ONLY_CSS_ZOOM = (hashParams['useOnlyCssZoom'] === 'true'); } + if ('verbosity' in hashParams) { + PDFJS.verbosity = hashParams['verbosity'] | 0; + } + var locale = navigator.language; if ('locale' in hashParams) locale = hashParams['locale']; @@ -4822,13 +4848,8 @@ document.addEventListener('DOMContentLoaded', function webViewerLoad(evt) { document.getElementById('viewFind').classList.add('hidden'); } - // Listen for warnings to trigger the fallback UI. Errors should be caught - // and call PDFView.error() so we don't need to listen for those. - PDFJS.LogManager.addLogger({ - warn: function() { - PDFView.fallback(); - } - }); + // Listen for unsuporrted features to trigger the fallback UI. + PDFJS.UnsupportedManager.listen(PDFView.fallback.bind(PDFView)); // Suppress context menus for some controls document.getElementById('scaleSelect').oncontextmenu = noContextMenuHandler; @@ -5366,9 +5387,10 @@ window.addEventListener('afterprint', function afterPrint(evt) { window.oRequestAnimationFrame || window.msRequestAnimationFrame || function startAtOnce(callback) { callback(); }; - PDFView.animationStartedPromise = new PDFJS.Promise(); - requestAnimationFrame(function onAnimationFrame() { - PDFView.animationStartedPromise.resolve(); + PDFView.animationStartedPromise = new Promise(function (resolve) { + requestAnimationFrame(function onAnimationFrame() { + resolve(); + }); }); })();