@internetarchive/bookreader 5.0.0-8-multiple-files → 5.0.0-80

Sign up to get free protection for your applications and to get access to all the features.
Files changed (321) hide show
  1. package/.eslintrc.js +17 -15
  2. package/.github/workflows/node.js.yml +78 -6
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +442 -1393
  6. package/BookReader/BookReader.js +2 -21564
  7. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1782 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/1up.svg +1 -12
  13. package/BookReader/icons/2up.svg +1 -15
  14. package/BookReader/icons/advance.svg +3 -26
  15. package/BookReader/icons/chevron-right.svg +1 -1
  16. package/BookReader/icons/close-circle-dark.svg +1 -0
  17. package/BookReader/icons/close-circle.svg +1 -1
  18. package/BookReader/icons/fullscreen.svg +1 -17
  19. package/BookReader/icons/fullscreen_exit.svg +1 -17
  20. package/BookReader/icons/hamburger.svg +1 -15
  21. package/BookReader/icons/left-arrow.svg +1 -12
  22. package/BookReader/icons/magnify-minus.svg +1 -16
  23. package/BookReader/icons/magnify-plus.svg +1 -17
  24. package/BookReader/icons/magnify.svg +1 -15
  25. package/BookReader/icons/pause.svg +1 -23
  26. package/BookReader/icons/play.svg +1 -22
  27. package/BookReader/icons/playback-speed.svg +1 -34
  28. package/BookReader/icons/read-aloud.svg +1 -22
  29. package/BookReader/icons/review.svg +3 -22
  30. package/BookReader/icons/thumbnails.svg +1 -17
  31. package/BookReader/icons/voice.svg +1 -0
  32. package/BookReader/icons/volume-full.svg +1 -22
  33. package/BookReader/images/BRicons.svg +5 -94
  34. package/BookReader/images/books_graphic.svg +1 -177
  35. package/BookReader/images/icon_book.svg +1 -12
  36. package/BookReader/images/icon_bookmark.svg +1 -12
  37. package/BookReader/images/icon_gear.svg +1 -14
  38. package/BookReader/images/icon_hamburger.svg +1 -20
  39. package/BookReader/images/icon_home.svg +1 -21
  40. package/BookReader/images/icon_info.svg +1 -11
  41. package/BookReader/images/icon_one_page.svg +1 -8
  42. package/BookReader/images/icon_pause.svg +1 -1
  43. package/BookReader/images/icon_play.svg +1 -1
  44. package/BookReader/images/icon_playback-rate.svg +1 -15
  45. package/BookReader/images/icon_search_button.svg +1 -8
  46. package/BookReader/images/icon_share.svg +1 -9
  47. package/BookReader/images/icon_skip-ahead.svg +1 -6
  48. package/BookReader/images/icon_skip-back.svg +2 -13
  49. package/BookReader/images/icon_speaker.svg +1 -18
  50. package/BookReader/images/icon_speaker_open.svg +1 -10
  51. package/BookReader/images/icon_thumbnails.svg +1 -12
  52. package/BookReader/images/icon_toc.svg +1 -5
  53. package/BookReader/images/icon_two_pages.svg +1 -9
  54. package/BookReader/images/marker_chap-off.svg +1 -11
  55. package/BookReader/images/marker_chap-on.svg +1 -11
  56. package/BookReader/images/marker_srch-on.svg +1 -11
  57. package/BookReader/jquery-3.js +2 -0
  58. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  59. package/BookReader/plugins/plugin.archive_analytics.js +1 -172
  60. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  61. package/BookReader/plugins/plugin.autoplay.js +1 -165
  62. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  63. package/BookReader/plugins/plugin.chapters.js +22 -301
  64. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  65. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  66. package/BookReader/plugins/plugin.iframe.js +1 -74
  67. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  68. package/BookReader/plugins/plugin.iiif.js +2 -0
  69. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  70. package/BookReader/plugins/plugin.resume.js +1 -368
  71. package/BookReader/plugins/plugin.resume.js.map +1 -1
  72. package/BookReader/plugins/plugin.search.js +2 -1420
  73. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  74. package/BookReader/plugins/plugin.search.js.map +1 -1
  75. package/BookReader/plugins/plugin.text_selection.js +2 -1080
  76. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  77. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  78. package/BookReader/plugins/plugin.tts.js +2 -9193
  79. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  80. package/BookReader/plugins/plugin.tts.js.map +1 -1
  81. package/BookReader/plugins/plugin.url.js +1 -269
  82. package/BookReader/plugins/plugin.url.js.map +1 -1
  83. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
  84. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  85. package/BookReader/webcomponents-bundle.js +3 -0
  86. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  87. package/BookReader/webcomponents-bundle.js.map +1 -0
  88. package/BookReaderDemo/BookReaderDemo.css +18 -19
  89. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
  90. package/BookReaderDemo/BookReaderJSAutoplay.js +4 -1
  91. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  92. package/BookReaderDemo/IADemoBr.js +147 -0
  93. package/BookReaderDemo/demo-advanced.html +2 -2
  94. package/BookReaderDemo/demo-autoplay.html +2 -3
  95. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  96. package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
  97. package/BookReaderDemo/demo-fullscreen.html +2 -4
  98. package/BookReaderDemo/demo-iiif.html +99 -12
  99. package/BookReaderDemo/demo-internetarchive.html +214 -18
  100. package/BookReaderDemo/demo-multiple.html +2 -1
  101. package/BookReaderDemo/demo-preview-pages.html +2 -1
  102. package/BookReaderDemo/demo-simple.html +2 -1
  103. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -4
  104. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  105. package/BookReaderDemo/immersion-1up.html +2 -2
  106. package/BookReaderDemo/immersion-mode.html +2 -4
  107. package/BookReaderDemo/toggle_controls.html +3 -2
  108. package/BookReaderDemo/view_mode.html +2 -1
  109. package/BookReaderDemo/viewmode-cycle.html +2 -3
  110. package/CHANGELOG.md +545 -33
  111. package/README.md +14 -1
  112. package/babel.config.js +20 -0
  113. package/codecov.yml +6 -0
  114. package/index.html +4 -1
  115. package/jsconfig.json +19 -0
  116. package/netlify.toml +9 -0
  117. package/package.json +70 -60
  118. package/renovate.json +52 -0
  119. package/scripts/preversion.js +0 -1
  120. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  121. package/src/BookNavigator/assets/button-base.js +9 -2
  122. package/src/BookNavigator/assets/ia-logo.js +17 -0
  123. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  124. package/src/BookNavigator/assets/icon_close.js +1 -1
  125. package/src/BookNavigator/book-navigator.js +590 -0
  126. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  127. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  128. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  129. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
  130. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  131. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  132. package/src/BookNavigator/delete-modal-actions.js +1 -1
  133. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  134. package/src/BookNavigator/downloads/downloads.js +41 -25
  135. package/src/BookNavigator/search/search-provider.js +80 -28
  136. package/src/BookNavigator/search/search-results.js +28 -25
  137. package/src/BookNavigator/sharing.js +27 -0
  138. package/src/BookNavigator/viewable-files.js +95 -0
  139. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
  140. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  141. package/src/BookReader/BookModel.js +64 -34
  142. package/src/BookReader/DragScrollable.js +233 -0
  143. package/src/BookReader/Mode1Up.js +56 -351
  144. package/src/BookReader/Mode1UpLit.js +388 -0
  145. package/src/BookReader/Mode2Up.js +73 -1318
  146. package/src/BookReader/Mode2UpLit.js +776 -0
  147. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  148. package/src/BookReader/ModeSmoothZoom.js +312 -0
  149. package/src/BookReader/ModeThumb.js +18 -12
  150. package/src/BookReader/Navbar/Navbar.js +14 -40
  151. package/src/BookReader/PageContainer.js +81 -6
  152. package/src/BookReader/ReduceSet.js +1 -1
  153. package/src/BookReader/Toolbar/Toolbar.js +10 -37
  154. package/src/BookReader/events.js +2 -3
  155. package/src/BookReader/options.js +27 -2
  156. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  157. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  158. package/src/BookReader/utils/SelectionObserver.js +45 -0
  159. package/src/BookReader/utils.js +118 -13
  160. package/src/BookReader.js +446 -1062
  161. package/src/assets/icons/close-circle-dark.svg +1 -0
  162. package/src/assets/icons/magnify-minus.svg +3 -7
  163. package/src/assets/icons/magnify-plus.svg +3 -7
  164. package/src/assets/icons/voice.svg +1 -0
  165. package/src/css/BookReader.scss +1 -17
  166. package/src/css/_BRBookmarks.scss +1 -1
  167. package/src/css/_BRComponent.scss +1 -1
  168. package/src/css/_BRmain.scss +33 -27
  169. package/src/css/_BRnav.scss +12 -39
  170. package/src/css/_BRpages.scss +149 -40
  171. package/src/css/_BRsearch.scss +68 -230
  172. package/src/css/_BRtoolbar.scss +5 -5
  173. package/src/css/_TextSelection.scss +87 -27
  174. package/src/css/_colorbox.scss +2 -2
  175. package/src/css/_controls.scss +20 -7
  176. package/src/css/_icons.scss +7 -1
  177. package/src/ia-bookreader/ia-bookreader.js +224 -0
  178. package/src/plugins/plugin.archive_analytics.js +3 -3
  179. package/src/plugins/plugin.autoplay.js +5 -11
  180. package/src/plugins/plugin.chapters.js +237 -191
  181. package/src/plugins/plugin.iiif.js +151 -0
  182. package/src/plugins/plugin.resume.js +3 -3
  183. package/src/plugins/plugin.text_selection.js +464 -134
  184. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  185. package/src/plugins/search/plugin.search.js +175 -120
  186. package/src/plugins/search/utils.js +43 -0
  187. package/src/plugins/search/view.js +64 -202
  188. package/src/plugins/tts/AbstractTTSEngine.js +71 -40
  189. package/src/plugins/tts/FestivalTTSEngine.js +13 -14
  190. package/src/plugins/tts/PageChunk.js +15 -21
  191. package/src/plugins/tts/PageChunkIterator.js +8 -12
  192. package/src/plugins/tts/WebTTSEngine.js +87 -71
  193. package/src/plugins/tts/plugin.tts.js +96 -127
  194. package/src/plugins/tts/utils.js +15 -25
  195. package/src/plugins/url/UrlPlugin.js +191 -0
  196. package/src/plugins/{plugin.url.js → url/plugin.url.js} +45 -16
  197. package/src/util/browserSniffing.js +22 -0
  198. package/src/util/docCookies.js +21 -2
  199. package/tests/e2e/README.md +37 -0
  200. package/tests/e2e/autoplay.test.js +2 -2
  201. package/tests/e2e/base.test.js +8 -16
  202. package/tests/e2e/helpers/base.js +53 -48
  203. package/tests/e2e/helpers/debug.js +1 -1
  204. package/tests/e2e/helpers/params.js +17 -0
  205. package/tests/e2e/helpers/rightToLeft.js +8 -14
  206. package/tests/e2e/helpers/search.js +73 -0
  207. package/tests/e2e/models/Navigation.js +20 -37
  208. package/tests/e2e/rightToLeft.test.js +4 -5
  209. package/tests/e2e/viewmode.test.js +40 -33
  210. package/tests/jest/BookNavigator/book-navigator.test.js +661 -0
  211. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  212. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  213. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  214. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  215. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  216. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  217. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  218. package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +109 -60
  219. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  220. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +80 -0
  221. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  222. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  223. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  224. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  225. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  226. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  227. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  228. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  229. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  230. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  231. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +10 -10
  232. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
  233. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  234. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  235. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  236. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  237. package/tests/jest/BookReader/utils/SelectionObserver.test.js +57 -0
  238. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  239. package/tests/jest/BookReader/utils.test.js +229 -0
  240. package/tests/jest/BookReader.keyboard.test.js +190 -0
  241. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  242. package/tests/{BookReader.test.js → jest/BookReader.test.js} +26 -37
  243. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  244. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
  245. package/tests/jest/plugins/plugin.chapters.test.js +195 -0
  246. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  247. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  248. package/tests/jest/plugins/plugin.text_selection.test.js +317 -0
  249. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  250. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +26 -47
  251. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +39 -6
  252. package/tests/jest/plugins/search/utils.js +25 -0
  253. package/tests/jest/plugins/search/utils.test.js +29 -0
  254. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +29 -9
  255. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  256. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  257. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  258. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  259. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  260. package/tests/jest/plugins/url/UrlPlugin.test.js +198 -0
  261. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +53 -14
  262. package/tests/jest/setup.js +3 -0
  263. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  264. package/tests/jest/util/docCookies.test.js +24 -0
  265. package/tests/{util → jest/util}/strings.test.js +1 -1
  266. package/tests/{utils.js → jest/utils.js} +38 -0
  267. package/webpack.config.js +12 -6
  268. package/.babelrc +0 -12
  269. package/.dependabot/config.yml +0 -6
  270. package/.testcaferc.json +0 -5
  271. package/BookReader/bookreader-component-bundle.js +0 -14312
  272. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  273. package/BookReader/bookreader-component-bundle.js.map +0 -1
  274. package/BookReader/icons/sort-ascending.svg +0 -1
  275. package/BookReader/icons/sort-descending.svg +0 -1
  276. package/BookReader/jquery-1.10.1.js +0 -108
  277. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  278. package/BookReader/plugins/plugin.menu_toggle.js +0 -369
  279. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  280. package/BookReader/plugins/plugin.mobile_nav.js +0 -335
  281. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  282. package/BookReaderDemo/IIIFBookReader.js +0 -207
  283. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  284. package/BookReaderDemo/demo-iiif.js +0 -26
  285. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  286. package/karma.conf.js +0 -23
  287. package/src/BookNavigator/BookModel.js +0 -14
  288. package/src/BookNavigator/BookNavigator.js +0 -452
  289. package/src/BookNavigator/assets/book-loader.js +0 -27
  290. package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
  291. package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
  292. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  293. package/src/BookNavigator/search/a-search-result.js +0 -55
  294. package/src/BookNavigator/volumes/volumes-provider.js +0 -76
  295. package/src/BookNavigator/volumes/volumes.js +0 -161
  296. package/src/BookReader/DebugConsole.js +0 -54
  297. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  298. package/src/ItemNavigator/ItemNavigator.js +0 -372
  299. package/src/ItemNavigator/providers/sharing.js +0 -29
  300. package/src/assets/icons/sort-ascending.svg +0 -1
  301. package/src/assets/icons/sort-descending.svg +0 -1
  302. package/src/css/_MobileNav.scss +0 -194
  303. package/src/dragscrollable-br.js +0 -261
  304. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  305. package/src/plugins/plugin.mobile_nav.js +0 -287
  306. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  307. package/tests/BookReader/DebugConsole.test.js +0 -25
  308. package/tests/BookReader/Mode1Up.test.js +0 -164
  309. package/tests/BookReader/Mode2Up.test.js +0 -247
  310. package/tests/BookReader/utils.test.js +0 -109
  311. package/tests/e2e/helpers/desktopSearch.js +0 -72
  312. package/tests/e2e/helpers/mobileSearch.js +0 -85
  313. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  314. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  315. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  316. package/tests/karma/BookNavigator/volumes.test.js +0 -101
  317. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  318. package/tests/plugins/plugin.chapters.test.js +0 -130
  319. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  320. package/tests/plugins/plugin.text_selection.test.js +0 -203
  321. package/tests/util/docCookies.test.js +0 -15
@@ -53,14 +53,14 @@ export function runBaseTests (br) {
53
53
  test('nav menu displays properly', async t => {
54
54
  const { nav } = br;
55
55
 
56
- await t.expect(nav.desktop.goLeft.visible).ok();
57
- await t.expect(nav.desktop.goRight.visible).ok();
58
- await t.expect(nav.desktop.mode1Up.visible).ok();
59
- await t.expect(nav.desktop.mode2Up.visible).ok();
60
- await t.expect(nav.desktop.modeThumb.visible).ok();
61
- await t.expect(nav.desktop.zoomIn.visible).ok();
62
- await t.expect(nav.desktop.zoomOut.visible).ok();
63
- await t.expect(nav.desktop.fullScreen.visible).ok();
56
+ await t.expect(nav.goLeft.visible).ok();
57
+ await t.expect(nav.goRight.visible).ok();
58
+ await t.expect(nav.mode1Up.visible).ok();
59
+ await t.expect(nav.mode2Up.visible).ok();
60
+ await t.expect(nav.modeThumb.visible).ok();
61
+ await t.expect(nav.zoomIn.visible).ok();
62
+ await t.expect(nav.zoomOut.visible).ok();
63
+ await t.expect(nav.fullScreen.visible).ok();
64
64
  });
65
65
 
66
66
  test("Canonical URL has no initial parameters", async t => {
@@ -87,7 +87,7 @@ export function runBaseTests (br) {
87
87
  const initialUrl = await getUrl();
88
88
 
89
89
  // Set Cookie by page navigation, wait for cookie
90
- await t.click(nav.desktop.goNext);
90
+ await t.click(nav.goNext);
91
91
  await t.wait(PAGE_FLIP_WAIT_TIME);
92
92
 
93
93
  // reload canonical URL, wait for URL change
@@ -96,7 +96,7 @@ export function runBaseTests (br) {
96
96
 
97
97
  if (await usesResume()) {
98
98
  await t.expect(isPageInUrl()).eql(true, initialUrl);
99
- await t.expect(isModeInUrl('2up')).eql(true, initialUrl)
99
+ await t.expect(isModeInUrl('2up')).eql(true, initialUrl);
100
100
  } else {
101
101
  // No plugin, no br-resume cookie
102
102
  await t.expect(getUrl()).notContains('#page/');
@@ -109,9 +109,9 @@ export function runBaseTests (br) {
109
109
  const { nav, BRcontainer} = br;
110
110
 
111
111
  // Go to next page, so we can go previous if at front cover
112
- await t.click(nav.desktop.goNext);
112
+ await t.click(nav.goNext);
113
113
  await t.wait(PAGE_FLIP_WAIT_TIME);
114
- await t.click(nav.desktop.goNext);
114
+ await t.click(nav.goNext);
115
115
  await t.wait(PAGE_FLIP_WAIT_TIME);
116
116
 
117
117
  const onLoadBrState = BRcontainer.child(0);
@@ -119,7 +119,7 @@ export function runBaseTests (br) {
119
119
  const origImg1Src = await initialImages.nth(0).getAttribute('src');
120
120
  const origImg2Src = await initialImages.nth(-1).getAttribute('src');
121
121
 
122
- await t.click(nav.desktop.goPrev);
122
+ await t.click(nav.goPrev);
123
123
  await t.wait(PAGE_FLIP_WAIT_TIME);
124
124
 
125
125
  const nextBrState = Selector('.BRcontainer').child(0);
@@ -138,13 +138,13 @@ export function runBaseTests (br) {
138
138
 
139
139
  // we aren't showing the same image in the new pages
140
140
  await t.expect(prevImg1Src).notEql(prevImg2Src);
141
- })
141
+ });
142
142
 
143
143
  test('2up mode - Clicking `Next page` changes the page', async t => {
144
144
  // Note: this will fail on a R to L book if at front cover
145
145
  const { nav, BRcontainer} = br;
146
146
  // Flip away from cover
147
- await t.click(nav.desktop.goNext);
147
+ await t.click(nav.goNext);
148
148
  await t.wait(PAGE_FLIP_WAIT_TIME);
149
149
 
150
150
  const onLoadBrState = BRcontainer.child(0);
@@ -152,7 +152,7 @@ export function runBaseTests (br) {
152
152
  const origImg1Src = await initialImages.nth(0).getAttribute('src');
153
153
  const origImg2Src = await initialImages.nth(-1).getAttribute('src');
154
154
 
155
- await t.click(nav.desktop.goNext);
155
+ await t.click(nav.goNext);
156
156
  await t.wait(PAGE_FLIP_WAIT_TIME);
157
157
 
158
158
  const nextBrState = Selector('.BRcontainer').child(0);
@@ -168,75 +168,80 @@ export function runBaseTests (br) {
168
168
 
169
169
  // we aren't showing the same image in the new pages
170
170
  await t.expect(nextImg1Src).notEql(nextImg2Src);
171
- })
171
+ });
172
172
 
173
173
  test('Clicking `page flip buttons` updates location', async t => {
174
174
  const { nav } = br;
175
175
  // Page navigation creates params
176
- await t.click(nav.desktop.goNext);
176
+ await t.click(nav.goNext);
177
177
  await t.expect(isPageInUrl()).eql(true);
178
178
  await t.expect(isModeInUrl('2up')).eql(true);
179
179
 
180
- await t.click(nav.desktop.goPrev);
180
+ await t.click(nav.goPrev);
181
181
  await t.expect(isPageInUrl()).eql(true);
182
182
  await t.expect(isModeInUrl('2up')).eql(true);
183
183
  });
184
184
 
185
- test('Clicking `2 page view` brings up 2 pages at a time', async t => {
185
+ test('Clicking `2 page view` brings up cur page + caching', async t => {
186
186
  const { nav } = br;
187
- await t.click(nav.desktop.mode2Up);
188
- await t.expect(Selector('.BRpagecontainer').count).eql(2);
187
+ await t.click(nav.mode2Up);
188
+ await t.expect(Selector('.BRpagecontainer.BRpage-visible').count).eql(1);
189
+ await t.expect(Selector('.BRpagecontainer').count).eql(3);
189
190
  });
190
191
 
191
192
  test('Clicking `1 page view` brings up 1 at a time', async t => {
192
193
  const { nav } = br;
193
- await t.click(nav.desktop.mode1Up);
194
+ await t.click(nav.mode1Up);
195
+
196
+ // Flip away from cover
197
+ await t.click(nav.goNext);
198
+ await t.wait(PAGE_FLIP_WAIT_TIME);
199
+
194
200
  // we usually pre-fetch the page in question & the 2 after it
195
201
  await t.expect(Selector('.BRpagecontainer').count).gte(3);
196
202
  });
197
203
 
198
204
  test('Clicking `thumbnail view` brings up all of the page thumbnails', async t => {
199
205
  const { nav } = br;
200
- await t.click(nav.desktop.modeThumb);
206
+ await t.click(nav.modeThumb);
201
207
  await t.expect(Selector('.BRpagecontainer').count).gte(3);
202
208
  });
203
209
 
204
210
  test('Clicking `zoom out` makes book smaller', async t => {
205
- const { nav, BRcontainer } = br;
206
- const book = BRcontainer.child(0);
211
+ const { nav } = br;
212
+ const page = Selector('.BRpagecontainer.BRpage-visible');
207
213
 
208
214
  await t.expect(br.BRcontainer.visible).ok();
209
- await t.expect(book.visible).ok();
210
- await t.expect(nav.desktop.zoomOut.visible).ok();
215
+ await t.expect(page.visible).ok();
216
+ await t.expect(nav.zoomOut.visible).ok();
211
217
 
212
- const initialBookHeight = await book.getBoundingClientRectProperty('height');
213
- const initialBookWidth = await book.getBoundingClientRectProperty('width');
218
+ const initialBookHeight = await page.getBoundingClientRectProperty('height');
219
+ const initialBookWidth = await page.getBoundingClientRectProperty('width');
214
220
 
215
- await t.click(nav.desktop.zoomOut);
221
+ await t.click(nav.zoomOut);
216
222
 
217
- const zoomOutBookHeight = await book.getBoundingClientRectProperty('height');
218
- const zoomOutBookWidth = await book.getBoundingClientRectProperty('width');
223
+ const zoomOutBookHeight = await page.getBoundingClientRectProperty('height');
224
+ const zoomOutBookWidth = await page.getBoundingClientRectProperty('width');
219
225
 
220
- await t.expect(zoomOutBookHeight).lte(initialBookHeight);
221
- await t.expect(zoomOutBookWidth).lte(initialBookWidth);
226
+ await t.expect(zoomOutBookHeight).lt(initialBookHeight);
227
+ await t.expect(zoomOutBookWidth).lt(initialBookWidth);
222
228
  });
223
229
 
224
230
  test('Clicking `zoom in` makes book larger', async t => {
225
- const { nav, BRcontainer } = br;
226
-
227
- const book = await BRcontainer.child(0);
231
+ const { nav } = br;
232
+ const page = Selector('.BRpagecontainer.BRpage-visible');
228
233
 
229
- await t.expect(BRcontainer.visible).ok();
230
- await t.expect(book.visible).ok();
231
- await t.expect(nav.desktop.zoomIn.visible).ok();
234
+ await t.expect(br.BRcontainer.visible).ok();
235
+ await t.expect(page.visible).ok();
236
+ await t.expect(nav.zoomIn.visible).ok();
232
237
 
233
- const initialBookHeight = await book.getBoundingClientRectProperty('height');
234
- const initialBookWidth = await book.getBoundingClientRectProperty('width');
238
+ const initialBookHeight = await page.getBoundingClientRectProperty('height');
239
+ const initialBookWidth = await page.getBoundingClientRectProperty('width');
235
240
 
236
- await t.click(nav.desktop.zoomIn);
241
+ await t.click(nav.zoomIn);
237
242
 
238
- const zoomInBookHeight = await book.getBoundingClientRectProperty('height');
239
- const zoomIntBookWidth = await book.getBoundingClientRectProperty('width');
243
+ const zoomInBookHeight = await page.getBoundingClientRectProperty('height');
244
+ const zoomIntBookWidth = await page.getBoundingClientRectProperty('width');
240
245
 
241
246
  await t.expect(zoomInBookHeight).gt(initialBookHeight);
242
247
  await t.expect(zoomIntBookWidth).gt(initialBookWidth);
@@ -248,10 +253,10 @@ export function runBaseTests (br) {
248
253
 
249
254
  // initial in-page
250
255
  await t.expect(BRcontainer.getBoundingClientRectProperty('width')).lte(windowWidth);
251
- await t.click(nav.desktop.fullScreen);
256
+ await t.click(nav.fullScreen);
252
257
  // full screen
253
258
  await t.expect(BRcontainer.getBoundingClientRectProperty('width')).eql(windowWidth);
254
- await t.click(nav.desktop.fullScreen);
259
+ await t.click(nav.fullScreen);
255
260
  // in-page
256
261
  await t.expect(BRcontainer.getBoundingClientRectProperty('width')).lte(windowWidth);
257
262
  });
@@ -10,4 +10,4 @@
10
10
  */
11
11
  export default async (t) => {
12
12
  await t.debug().setNativeDialogHandler(() => true);
13
- }
13
+ };
@@ -0,0 +1,17 @@
1
+ // @ts-check
2
+ class TestParams {
3
+ baseUrl = process.env.BASE_URL?.replace(/\/+$/, '') ?? 'http://127.0.0.1:8000'
4
+ ocaids = process.env.OCAIDS?.split(',') ?? null;
5
+ /** Whether the url we're testing is a prod (or near prod) IA url, or a demos url */
6
+ isIA = new URL(this.baseUrl).hostname.endsWith('archive.org');
7
+
8
+ /** @param {string} ocaid */
9
+ getArchiveUrl(ocaid) {
10
+ return this.isIA ? `${this.baseUrl}/details/${ocaid}`
11
+ // Otherwise it's a demo page
12
+ : `${this.baseUrl}/BookReaderDemo/demo-internetarchive.html?ocaid=${ocaid}`;
13
+ }
14
+ }
15
+
16
+ const params = new TestParams();
17
+ export default params;
@@ -4,26 +4,20 @@ const getPageUrl = ClientFunction(() => window.location.href);
4
4
  export function runRightToLeftTests (br) {
5
5
  test('Right to Left - correct initialization in two-page view', async t => {
6
6
  const { nav, BRcontainer} = br;
7
- await t.click(nav.desktop.mode2Up);
7
+ await t.click(nav.mode2Up);
8
8
 
9
- //checking right leaf edge has 0 width
10
- await t.expect(BRcontainer.find('.BRleafEdgeR').getStyleProperty('width')).eql('0px');
11
-
12
- //checking empty page before the cover is more to the left than the first page
13
- const rightEmptyPage = BRcontainer.find('.BRpagecontainer.BRemptypage');
14
- const leftPage = BRcontainer.find('.BRpagecontainer.pagediv0');
15
- const leftPageLDistance = leftPage.getBoundingClientRectProperty('left');
16
- const rightPageLDistance = rightEmptyPage.getBoundingClientRectProperty('left');
17
- await t.expect(rightPageLDistance).gt(await leftPageLDistance);
9
+ //checking right leaf edge is not in tree
10
+ await t.expect(BRcontainer.find('.br-mode-2up__leafs--left').count).eql(1);
11
+ await t.expect(BRcontainer.find('.br-mode-2up__leafs--right').count).eql(0);
18
12
 
19
13
  //checks slider is in correct position
20
- await t.expect(nav.desktop.sliderRange.getStyleProperty('width')).eql('0px');
14
+ await t.expect(nav.sliderRange.getStyleProperty('width')).eql('0px');
21
15
  });
22
16
 
23
17
  test('Right to Left - assuring flipping left goes to next page', async t => {
24
18
  const { nav } = br;
25
- await t.click(nav.desktop.mode2Up);
26
- await t.click(nav.desktop.goLeft);
27
- await t.expect(getPageUrl()).match(/page\/n2/);
19
+ await t.click(nav.mode2Up);
20
+ await t.click(nav.goLeft);
21
+ await t.expect(getPageUrl()).match(/page\/n1/);
28
22
  });
29
23
  }
@@ -0,0 +1,73 @@
1
+ import { ClientFunction, RequestMock } from 'testcafe';
2
+ import { SEARCH_INSIDE_URL_RE , mockResponseFound, mockResponseNotFound,
3
+ TEST_TEXT_FOUND, TEST_TEXT_NOT_FOUND, PAGE_FIRST_RESULT, SEARCH_MATCHES_LENGTH } from './mockSearch';
4
+
5
+
6
+ export function runSearchTests(br) {
7
+ //building mock response for successful and unsuccessful search
8
+ const mockFound = RequestMock()
9
+ .onRequestTo(SEARCH_INSIDE_URL_RE )
10
+ .respond(mockResponseFound, 202);
11
+
12
+ const mockNotFound = RequestMock()
13
+ .onRequestTo(SEARCH_INSIDE_URL_RE )
14
+ .respond(mockResponseNotFound, 202);
15
+
16
+
17
+ test
18
+ .requestHooks(mockFound)('Search - successful search', async t => {
19
+ const nav = br.nav;
20
+
21
+ //assuring that the search bar is enabled
22
+ await t.expect(nav.searchIcon.visible).ok();
23
+ await t.click(nav.searchIcon);
24
+
25
+ //testing search for a word found in the book
26
+ await t.selectText(nav.searchBox).pressKey('delete');
27
+ // FIXME: Why is it only typing every other letter?!?!
28
+ await t.typeText(nav.searchBox, TEST_TEXT_FOUND.split('').join('_'));
29
+ await t.pressKey('enter');
30
+
31
+ await t.expect(nav.searchPin.exists).ok();
32
+ await t.expect(nav.searchPin.child('.BRquery').child('main').exists).ok();
33
+ await t.expect(nav.searchPin.child('.BRquery').child('main').innerText).contains(TEST_TEXT_FOUND);
34
+ await t.expect(nav.searchNavigation.exists).ok();
35
+ await t.expect(nav.searchNavigation.find('[data-id="resultsCount"]').exists).ok();
36
+ await t.expect(nav.searchNavigation.find('[data-id="resultsCount"]').innerText).contains(SEARCH_MATCHES_LENGTH);
37
+
38
+ //checking url
39
+ const getPageUrl = ClientFunction(() => window.location.href.toString());
40
+ await t.expect(getPageUrl()).contains(TEST_TEXT_FOUND);
41
+
42
+ //checks clicking on first search pin opens correct page
43
+ await t.click(nav.searchPin);
44
+ await t.expect(getPageUrl()).contains(PAGE_FIRST_RESULT);
45
+
46
+ //checks highlight on result page is visible
47
+ const highlight = br.shell.find(".searchHiliteLayer rect");
48
+ await t.expect(highlight.visible).ok();
49
+
50
+ });
51
+
52
+
53
+ test
54
+ .requestHooks(mockNotFound)('Search - unsuccessful search', async t => {
55
+ const nav = br.nav;
56
+
57
+ //assuring that the search bar is enabled
58
+ await t.expect(nav.searchIcon.visible).ok();
59
+ await t.click(nav.searchIcon);
60
+
61
+ //testing search for a word not found in the book
62
+ await t.selectText(nav.searchBox).pressKey('delete');
63
+ // FIXME: Why is it only typing every other letter?!?!
64
+ await t.typeText(nav.searchBox, TEST_TEXT_NOT_FOUND.split('').join('_'));
65
+ await t.pressKey('enter');
66
+ await t.expect(nav.searchPin.child('.BRquery').child('main').withText(TEST_TEXT_NOT_FOUND).exists).notOk();
67
+
68
+ const getPageUrl = ClientFunction(() => window.location.href.toString());
69
+ await t.expect(getPageUrl()).contains(TEST_TEXT_NOT_FOUND);
70
+ });
71
+
72
+
73
+ }
@@ -5,52 +5,35 @@ export default class Navigation {
5
5
  constructor() {
6
6
  this.topNavShell = new Selector('.BRtoolbar');
7
7
  this.bottomNavShell = new Selector('.BRfooter');
8
- this.mobileMenu = new Selector('.BRmobileMenu');
9
- this.desktop = new DesktopNav(this.bottomNavShell, this.topNavShell);
10
- this.mobile = new MobileNav(this.mobileMenu, this.topNavShell);
11
- }
12
- }
8
+ this.itemNav = Selector('ia-bookreader').shadowRoot().find('iaux-item-navigator').shadowRoot();
13
9
 
14
- /**
15
- * DesktopNav Model
16
- * @class
17
- * @classdesc defines DesktopNav base elements
18
- */
19
- class DesktopNav {
20
- constructor(bottomToolbar, topToolbar) {
21
10
  // flipping
22
- this.goLeft = bottomToolbar.find('.BRicon.book_left');
23
- this.goRight = bottomToolbar.find('.BRicon.book_right');
24
- this.goNext = bottomToolbar.find('.BRicon.book_flip_next');
25
- this.goPrev = bottomToolbar.find('.BRicon.book_flip_prev');
11
+ this.goLeft = this.bottomNavShell.find('.BRicon.book_left');
12
+ this.goRight = this.bottomNavShell.find('.BRicon.book_right');
13
+ this.goNext = this.bottomNavShell.find('.BRicon.book_flip_next');
14
+ this.goPrev = this.bottomNavShell.find('.BRicon.book_flip_prev');
26
15
 
27
16
  // mode switching
28
- this.mode1Up = bottomToolbar.find('.BRicon.onepg');
29
- this.mode2Up = bottomToolbar.find('.BRicon.twopg');
30
- this.modeThumb = bottomToolbar.find('.BRicon.thumb');
31
- this.viewmode = bottomToolbar.find('.BRicon.viewmode');
17
+ this.mode1Up = this.bottomNavShell.find('.BRicon.onepg');
18
+ this.mode2Up = this.bottomNavShell.find('.BRicon.twopg');
19
+ this.modeThumb = this.bottomNavShell.find('.BRicon.thumb');
20
+ this.viewmode = this.bottomNavShell.find('.BRicon.viewmode');
32
21
 
33
22
  // zoom
34
- this.zoomIn = bottomToolbar.find('.BRicon.zoom_in');
35
- this.zoomOut = bottomToolbar.find('.BRicon.zoom_out');
23
+ this.zoomIn = this.bottomNavShell.find('.BRicon.zoom_in');
24
+ this.zoomOut = this.bottomNavShell.find('.BRicon.zoom_out');
36
25
 
37
26
  // search
38
- this.searchBox = topToolbar.find('.BRbooksearch.desktop');
39
- this.searchPin = bottomToolbar.find('.BRsearch');
40
- this.searchNavigation = bottomToolbar.find('.BRsearch-navigation');
27
+ this.searchIcon = this.itemNav.find('button.shortcut.search');
28
+ this.searchBox = this.itemNav
29
+ .find('ia-menu-slider').shadowRoot()
30
+ .find('ia-book-search-results').shadowRoot()
31
+ .find('input[name=query]');
32
+ this.searchPin = this.bottomNavShell.find('.BRsearch');
33
+ this.searchNavigation = this.bottomNavShell.find('.BRsearch-navigation');
41
34
 
42
35
  // other
43
- this.fullScreen = bottomToolbar.find('.BRicon.full');
44
- this.sliderRange = bottomToolbar.find('.ui-slider-range');
45
- }
46
- }
47
-
48
- class MobileNav {
49
- constructor(mobileMenu, topToolbar) {
50
- this.hamburgerButton = topToolbar.find('.BRmobileHamburger');
51
- this.menuSearchButton = mobileMenu.find('.BRmobileMenu__search');
52
- this.searchBox = mobileMenu.find('#BRsearch_tray');
53
- this.searchResults = mobileMenu.find('[data-id="results"]');
54
- this.searchResultText = this.searchResults.child(0).find('p');
36
+ this.fullScreen = this.bottomNavShell.find('.BRicon.full');
37
+ this.sliderRange = this.bottomNavShell.find('.ui-slider-range');
55
38
  }
56
39
  }
@@ -1,16 +1,15 @@
1
1
  import { runBaseTests } from './helpers/base';
2
2
  import { runRightToLeftTests } from './helpers/rightToLeft';
3
+ import params from './helpers/params';
3
4
 
4
5
  import BookReader from './models/BookReader';
5
6
 
6
- const { BASE_URL } = process.env;
7
- const DEMO_PATH = 'demo-internetarchive.html?ocaid=';
8
- const OCAIDS = [
7
+ const ocaids = params.ocaids || [
9
8
  'gendaitankashu00meijuoft', // Right to Left book
10
9
  ];
11
10
 
12
- OCAIDS.forEach(ocaid => {
13
- const url = `${BASE_URL}${DEMO_PATH}${ocaid}`;
11
+ ocaids.forEach(ocaid => {
12
+ const url = `${params.getArchiveUrl(ocaid)}`;
14
13
 
15
14
  fixture `Base Tests for right to left book: ${ocaid}`.page `${url}`;
16
15
  runBaseTests(new BookReader({ pageProgression: 'rl' }));
@@ -1,37 +1,44 @@
1
1
  import { Selector } from 'testcafe';
2
2
  import BookReader from './models/BookReader';
3
+ import params from './helpers/params';
3
4
 
4
- const { BASE_URL } = process.env;
5
-
6
- fixture `Viewmode carousel`.page `${BASE_URL}viewmode-cycle.html`;
7
-
8
- test('Clicking `view mode` cycles through view modes', async t => {
9
- const { nav } = (new BookReader());
10
-
11
- // viewmode button only appear on mobile devices
12
- await t.resizeWindow(400, 800);
13
- // Flip forward one
14
- await t.pressKey('right');
15
-
16
- // 2up to thumb
17
- await t.click(nav.desktop.viewmode);
18
- const thumbnailContainer = Selector('.BRmodeThumb');
19
- await t.expect(thumbnailContainer.visible).ok();
20
- const thumbImages = thumbnailContainer.find('.BRpageview img');
21
- await t.expect(thumbImages.count).gt(0);
22
-
23
- // thumb to 1up
24
- await t.click(nav.desktop.viewmode);
25
- const onePageViewContainer = Selector('.BRpageview');
26
- await t.expect(onePageViewContainer.visible).ok();
27
- const onePageImages = onePageViewContainer.find('.BRmode1up .BRpagecontainer');
28
- // we usually pre-fetch the page in question & 1 before/after it
29
- await t.expect(onePageImages.count).gte(3);
30
-
31
- // 1up to 2up
32
- await t.click(nav.desktop.viewmode);
33
- const twoPageContainer = Selector('.BRtwopageview');
34
- await t.expect(twoPageContainer.visible).ok();
35
- const twoPageImages = twoPageContainer.find('img.BRpageimage');
36
- await t.expect(twoPageImages.count).gte(2);
5
+ const ocaids = params.ocaids || ['goody'];
6
+
7
+ ocaids.forEach(ocaid => {
8
+ const url = params.getArchiveUrl(ocaid);
9
+
10
+ fixture `Viewmode carousel`.page `${url}`;
11
+
12
+ test('Clicking `view mode` cycles through view modes', async t => {
13
+ const { nav } = (new BookReader());
14
+
15
+ // viewmode button only appear on mobile devices
16
+ await t.resizeWindow(400, 800);
17
+ // Flip forward one
18
+ await t.pressKey('right');
19
+ await t.pressKey('right');
20
+ await t.pressKey('right');
21
+
22
+ // 1up to 2up
23
+ await t.click(nav.viewmode);
24
+ const twoPageContainer = Selector('.BRmode2up');
25
+ await t.expect(twoPageContainer.visible).ok();
26
+ const twoPageImages = twoPageContainer.find('img.BRpageimage');
27
+ await t.expect(twoPageImages.count).gte(2);
28
+
29
+ // 2up to thumb
30
+ await t.click(nav.viewmode);
31
+ const thumbnailContainer = Selector('.BRmodeThumb');
32
+ await t.expect(thumbnailContainer.visible).ok();
33
+ const thumbImages = thumbnailContainer.find('.BRpageview img');
34
+ await t.expect(thumbImages.count).gt(0);
35
+
36
+ // thumb to 1up
37
+ await t.click(nav.viewmode);
38
+ const onePageViewContainer = Selector('br-mode-1up');
39
+ await t.expect(onePageViewContainer.visible).ok();
40
+ const onePageImages = onePageViewContainer.find('.BRmode1up .BRpagecontainer');
41
+ // we usually pre-fetch the page in question & 1 before/after it
42
+ await t.expect(onePageImages.count).gte(2);
43
+ });
37
44
  });