@internetarchive/bookreader 5.0.0-18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +58 -0
- package/.gitattributes +2 -0
- package/.github/ISSUE_TEMPLATE/bug.md +32 -0
- package/.github/ISSUE_TEMPLATE/feature-request.md +30 -0
- package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +15 -0
- package/.github/dependabot.yml +8 -0
- package/.github/workflows/node.js.yml +37 -0
- package/.github/workflows/npm-publish.yml +47 -0
- package/.testcaferc.json +5 -0
- package/BookReader/BookReader.css +2983 -0
- package/BookReader/BookReader.js +3 -0
- package/BookReader/BookReader.js.LICENSE.txt +117 -0
- package/BookReader/BookReader.js.map +1 -0
- package/BookReader/bookreader-component-bundle.js +1436 -0
- package/BookReader/bookreader-component-bundle.js.LICENSE.txt +27 -0
- package/BookReader/bookreader-component-bundle.js.map +1 -0
- package/BookReader/icons/1up.svg +1 -0
- package/BookReader/icons/2up.svg +1 -0
- package/BookReader/icons/advance.svg +3 -0
- package/BookReader/icons/chevron-right.svg +1 -0
- package/BookReader/icons/close-circle-dark.svg +1 -0
- package/BookReader/icons/close-circle.svg +1 -0
- package/BookReader/icons/fullscreen.svg +1 -0
- package/BookReader/icons/fullscreen_exit.svg +1 -0
- package/BookReader/icons/hamburger.svg +1 -0
- package/BookReader/icons/left-arrow.svg +1 -0
- package/BookReader/icons/magnify-minus.svg +1 -0
- package/BookReader/icons/magnify-plus.svg +1 -0
- package/BookReader/icons/magnify.svg +1 -0
- package/BookReader/icons/pause.svg +1 -0
- package/BookReader/icons/play.svg +1 -0
- package/BookReader/icons/playback-speed.svg +1 -0
- package/BookReader/icons/read-aloud.svg +1 -0
- package/BookReader/icons/review.svg +3 -0
- package/BookReader/icons/thumbnails.svg +1 -0
- package/BookReader/icons/volume-full.svg +1 -0
- package/BookReader/images/BRicons.png +0 -0
- package/BookReader/images/BRicons.svg +5 -0
- package/BookReader/images/BRicons_ia.png +0 -0
- package/BookReader/images/back_pages.png +0 -0
- package/BookReader/images/book_bottom_icon.png +0 -0
- package/BookReader/images/book_down_icon.png +0 -0
- package/BookReader/images/book_left_icon.png +0 -0
- package/BookReader/images/book_leftmost_icon.png +0 -0
- package/BookReader/images/book_right_icon.png +0 -0
- package/BookReader/images/book_rightmost_icon.png +0 -0
- package/BookReader/images/book_top_icon.png +0 -0
- package/BookReader/images/book_up_icon.png +0 -0
- package/BookReader/images/books_graphic.svg +1 -0
- package/BookReader/images/booksplit.png +0 -0
- package/BookReader/images/control_pause_icon.png +0 -0
- package/BookReader/images/control_play_icon.png +0 -0
- package/BookReader/images/embed_icon.png +0 -0
- package/BookReader/images/icon-home-ia.png +0 -0
- package/BookReader/images/icon_OL-logo-xs.png +0 -0
- package/BookReader/images/icon_alert-xs.png +0 -0
- package/BookReader/images/icon_book.svg +1 -0
- package/BookReader/images/icon_bookmark.svg +1 -0
- package/BookReader/images/icon_close-pop.png +0 -0
- package/BookReader/images/icon_download.png +0 -0
- package/BookReader/images/icon_gear.svg +1 -0
- package/BookReader/images/icon_hamburger.svg +1 -0
- package/BookReader/images/icon_home.png +0 -0
- package/BookReader/images/icon_home.svg +1 -0
- package/BookReader/images/icon_home_ia.png +0 -0
- package/BookReader/images/icon_indicator.png +0 -0
- package/BookReader/images/icon_info.svg +1 -0
- package/BookReader/images/icon_one_page.svg +1 -0
- package/BookReader/images/icon_pause.svg +1 -0
- package/BookReader/images/icon_play.svg +1 -0
- package/BookReader/images/icon_playback-rate.svg +1 -0
- package/BookReader/images/icon_return.png +0 -0
- package/BookReader/images/icon_search_button.svg +1 -0
- package/BookReader/images/icon_share.svg +1 -0
- package/BookReader/images/icon_skip-ahead.svg +1 -0
- package/BookReader/images/icon_skip-back.svg +2 -0
- package/BookReader/images/icon_speaker.svg +1 -0
- package/BookReader/images/icon_speaker_open.svg +1 -0
- package/BookReader/images/icon_thumbnails.svg +1 -0
- package/BookReader/images/icon_toc.svg +1 -0
- package/BookReader/images/icon_two_pages.svg +1 -0
- package/BookReader/images/icon_zoomer.png +0 -0
- package/BookReader/images/loading.gif +0 -0
- package/BookReader/images/logo_icon.png +0 -0
- package/BookReader/images/marker_chap-off.png +0 -0
- package/BookReader/images/marker_chap-off.svg +1 -0
- package/BookReader/images/marker_chap-off_ia.png +0 -0
- package/BookReader/images/marker_chap-on.png +0 -0
- package/BookReader/images/marker_chap-on.svg +1 -0
- package/BookReader/images/marker_srch-on.svg +1 -0
- package/BookReader/images/marker_srchchap-off.png +0 -0
- package/BookReader/images/marker_srchchap-on.png +0 -0
- package/BookReader/images/nav_control-dn.png +0 -0
- package/BookReader/images/nav_control-dn_ia.png +0 -0
- package/BookReader/images/nav_control-up.png +0 -0
- package/BookReader/images/nav_control-up_ia.png +0 -0
- package/BookReader/images/nav_control.png +0 -0
- package/BookReader/images/one_page_mode_icon.png +0 -0
- package/BookReader/images/paper-badge.png +0 -0
- package/BookReader/images/print_icon.png +0 -0
- package/BookReader/images/progressbar.gif +0 -0
- package/BookReader/images/right_edges.png +0 -0
- package/BookReader/images/slider.png +0 -0
- package/BookReader/images/slider_ia.png +0 -0
- package/BookReader/images/thumbnail_mode_icon.png +0 -0
- package/BookReader/images/transparent.png +0 -0
- package/BookReader/images/two_page_mode_icon.png +0 -0
- package/BookReader/images/zoom_in_icon.png +0 -0
- package/BookReader/images/zoom_out_icon.png +0 -0
- package/BookReader/jquery-1.10.1.js +2 -0
- package/BookReader/jquery-1.10.1.js.LICENSE.txt +24 -0
- package/BookReader/plugins/plugin.archive_analytics.js +2 -0
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -0
- package/BookReader/plugins/plugin.autoplay.js +2 -0
- package/BookReader/plugins/plugin.autoplay.js.map +1 -0
- package/BookReader/plugins/plugin.chapters.js +2 -0
- package/BookReader/plugins/plugin.chapters.js.map +1 -0
- package/BookReader/plugins/plugin.iframe.js +2 -0
- package/BookReader/plugins/plugin.iframe.js.map +1 -0
- package/BookReader/plugins/plugin.mobile_nav.js +2 -0
- package/BookReader/plugins/plugin.mobile_nav.js.map +1 -0
- package/BookReader/plugins/plugin.resume.js +2 -0
- package/BookReader/plugins/plugin.resume.js.map +1 -0
- package/BookReader/plugins/plugin.search.js +2 -0
- package/BookReader/plugins/plugin.search.js.map +1 -0
- package/BookReader/plugins/plugin.text_selection.js +2 -0
- package/BookReader/plugins/plugin.text_selection.js.map +1 -0
- package/BookReader/plugins/plugin.tts.js +3 -0
- package/BookReader/plugins/plugin.tts.js.LICENSE.txt +27 -0
- package/BookReader/plugins/plugin.tts.js.map +1 -0
- package/BookReader/plugins/plugin.url.js +2 -0
- package/BookReader/plugins/plugin.url.js.map +1 -0
- package/BookReader/plugins/plugin.vendor-fullscreen.js +2 -0
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -0
- package/BookReaderDemo/BookReaderDemo.css +41 -0
- package/BookReaderDemo/BookReaderJSAdvanced.js +115 -0
- package/BookReaderDemo/BookReaderJSAutoplay.js +56 -0
- package/BookReaderDemo/BookReaderJSSimple.js +55 -0
- package/BookReaderDemo/IIIFBookReader.js +207 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +1 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +1 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +1 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +1 -0
- package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
- package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
- package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
- package/BookReaderDemo/bookreader-template-bundle.js +7178 -0
- package/BookReaderDemo/demo-advanced.html +32 -0
- package/BookReaderDemo/demo-autoplay.html +38 -0
- package/BookReaderDemo/demo-embed-iframe-src.html +84 -0
- package/BookReaderDemo/demo-embed.html +26 -0
- package/BookReaderDemo/demo-fullscreen-mobile.html +36 -0
- package/BookReaderDemo/demo-fullscreen.html +33 -0
- package/BookReaderDemo/demo-iiif.html +34 -0
- package/BookReaderDemo/demo-iiif.js +26 -0
- package/BookReaderDemo/demo-internetarchive.html +74 -0
- package/BookReaderDemo/demo-multiple.html +43 -0
- package/BookReaderDemo/demo-preview-pages.html +1092 -0
- package/BookReaderDemo/demo-simple.html +34 -0
- package/BookReaderDemo/demo-vendor-fullscreen.html +36 -0
- package/BookReaderDemo/immersion-1up.html +64 -0
- package/BookReaderDemo/immersion-mode.html +35 -0
- package/BookReaderDemo/toggle_controls.html +53 -0
- package/BookReaderDemo/view_mode.html +39 -0
- package/BookReaderDemo/viewmode-cycle.html +41 -0
- package/CHANGELOG.md +540 -0
- package/CONTRIBUTING.md +7 -0
- package/LICENSE +661 -0
- package/README.md +205 -0
- package/babel.config.js +18 -0
- package/codecov.yml +17 -0
- package/index.html +31 -0
- package/jsconfig.json +14 -0
- package/karma.conf.js +23 -0
- package/package.json +129 -0
- package/screenshot.png +0 -0
- package/scripts/postversion.js +10 -0
- package/scripts/preversion.js +14 -0
- package/scripts/version.js +26 -0
- package/src/BookNavigator/BookModel.js +14 -0
- package/src/BookNavigator/BookNavigator.js +468 -0
- package/src/BookNavigator/assets/book-loader.js +27 -0
- package/src/BookNavigator/assets/bookmark-colors.js +15 -0
- package/src/BookNavigator/assets/button-base.js +61 -0
- package/src/BookNavigator/assets/icon_checkmark.js +6 -0
- package/src/BookNavigator/assets/icon_close.js +3 -0
- package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
- package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
- package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
- package/src/BookNavigator/assets/icon_volumes.js +11 -0
- package/src/BookNavigator/bookmarks/bookmark-button.js +64 -0
- package/src/BookNavigator/bookmarks/bookmark-edit.js +215 -0
- package/src/BookNavigator/bookmarks/bookmarks-list.js +285 -0
- package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +28 -0
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +53 -0
- package/src/BookNavigator/bookmarks/ia-bookmarks.js +500 -0
- package/src/BookNavigator/br-fullscreen-mgr.js +83 -0
- package/src/BookNavigator/delete-modal-actions.js +49 -0
- package/src/BookNavigator/downloads/downloads-provider.js +76 -0
- package/src/BookNavigator/downloads/downloads.js +138 -0
- package/src/BookNavigator/search/a-search-result.js +55 -0
- package/src/BookNavigator/search/search-provider.js +180 -0
- package/src/BookNavigator/search/search-results.js +360 -0
- package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +93 -0
- package/src/BookNavigator/visual-adjustments/visual-adjustments.js +280 -0
- package/src/BookNavigator/volumes/volumes-provider.js +83 -0
- package/src/BookNavigator/volumes/volumes.js +178 -0
- package/src/BookReader/BookModel.js +518 -0
- package/src/BookReader/DebugConsole.js +54 -0
- package/src/BookReader/ImageCache.js +116 -0
- package/src/BookReader/Mode1Up.js +90 -0
- package/src/BookReader/Mode1UpLit.js +434 -0
- package/src/BookReader/Mode2Up.js +1372 -0
- package/src/BookReader/ModeSmoothZoom.js +177 -0
- package/src/BookReader/ModeThumb.js +336 -0
- package/src/BookReader/Navbar/Navbar.js +339 -0
- package/src/BookReader/PageContainer.js +120 -0
- package/src/BookReader/ReduceSet.js +26 -0
- package/src/BookReader/Toolbar/Toolbar.js +384 -0
- package/src/BookReader/events.js +20 -0
- package/src/BookReader/options.js +320 -0
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/classes.js +36 -0
- package/src/BookReader/utils.js +240 -0
- package/src/BookReader.js +2546 -0
- package/src/BookReaderComponent/BookReaderComponent.js +112 -0
- package/src/ItemNavigator/ItemNavigator.js +376 -0
- package/src/ItemNavigator/providers/sharing.js +33 -0
- package/src/assets/icons/1up.svg +12 -0
- package/src/assets/icons/2up.svg +15 -0
- package/src/assets/icons/advance.svg +26 -0
- package/src/assets/icons/chevron-right.svg +1 -0
- package/src/assets/icons/close-circle-dark.svg +1 -0
- package/src/assets/icons/close-circle.svg +1 -0
- package/src/assets/icons/fullscreen.svg +17 -0
- package/src/assets/icons/fullscreen_exit.svg +17 -0
- package/src/assets/icons/hamburger.svg +15 -0
- package/src/assets/icons/left-arrow.svg +12 -0
- package/src/assets/icons/magnify-minus.svg +16 -0
- package/src/assets/icons/magnify-plus.svg +17 -0
- package/src/assets/icons/magnify.svg +15 -0
- package/src/assets/icons/pause.svg +23 -0
- package/src/assets/icons/play.svg +22 -0
- package/src/assets/icons/playback-speed.svg +34 -0
- package/src/assets/icons/read-aloud.svg +22 -0
- package/src/assets/icons/review.svg +22 -0
- package/src/assets/icons/thumbnails.svg +17 -0
- package/src/assets/icons/volume-full.svg +22 -0
- package/src/assets/images/BRicons.png +0 -0
- package/src/assets/images/BRicons.svg +94 -0
- package/src/assets/images/BRicons_ia.png +0 -0
- package/src/assets/images/back_pages.png +0 -0
- package/src/assets/images/book_bottom_icon.png +0 -0
- package/src/assets/images/book_down_icon.png +0 -0
- package/src/assets/images/book_left_icon.png +0 -0
- package/src/assets/images/book_leftmost_icon.png +0 -0
- package/src/assets/images/book_right_icon.png +0 -0
- package/src/assets/images/book_rightmost_icon.png +0 -0
- package/src/assets/images/book_top_icon.png +0 -0
- package/src/assets/images/book_up_icon.png +0 -0
- package/src/assets/images/books_graphic.svg +177 -0
- package/src/assets/images/booksplit.png +0 -0
- package/src/assets/images/control_pause_icon.png +0 -0
- package/src/assets/images/control_play_icon.png +0 -0
- package/src/assets/images/embed_icon.png +0 -0
- package/src/assets/images/icon-home-ia.png +0 -0
- package/src/assets/images/icon_OL-logo-xs.png +0 -0
- package/src/assets/images/icon_alert-xs.png +0 -0
- package/src/assets/images/icon_book.svg +12 -0
- package/src/assets/images/icon_bookmark.svg +12 -0
- package/src/assets/images/icon_close-pop.png +0 -0
- package/src/assets/images/icon_download.png +0 -0
- package/src/assets/images/icon_gear.svg +14 -0
- package/src/assets/images/icon_hamburger.svg +20 -0
- package/src/assets/images/icon_home.png +0 -0
- package/src/assets/images/icon_home.svg +21 -0
- package/src/assets/images/icon_home_ia.png +0 -0
- package/src/assets/images/icon_indicator.png +0 -0
- package/src/assets/images/icon_info.svg +11 -0
- package/src/assets/images/icon_one_page.svg +8 -0
- package/src/assets/images/icon_pause.svg +1 -0
- package/src/assets/images/icon_play.svg +1 -0
- package/src/assets/images/icon_playback-rate.svg +15 -0
- package/src/assets/images/icon_return.png +0 -0
- package/src/assets/images/icon_search_button.svg +8 -0
- package/src/assets/images/icon_share.svg +9 -0
- package/src/assets/images/icon_skip-ahead.svg +6 -0
- package/src/assets/images/icon_skip-back.svg +13 -0
- package/src/assets/images/icon_speaker.svg +18 -0
- package/src/assets/images/icon_speaker_open.svg +10 -0
- package/src/assets/images/icon_thumbnails.svg +12 -0
- package/src/assets/images/icon_toc.svg +5 -0
- package/src/assets/images/icon_two_pages.svg +9 -0
- package/src/assets/images/icon_zoomer.png +0 -0
- package/src/assets/images/loading.gif +0 -0
- package/src/assets/images/logo_icon.png +0 -0
- package/src/assets/images/marker_chap-off.png +0 -0
- package/src/assets/images/marker_chap-off.svg +11 -0
- package/src/assets/images/marker_chap-off_ia.png +0 -0
- package/src/assets/images/marker_chap-on.png +0 -0
- package/src/assets/images/marker_chap-on.svg +11 -0
- package/src/assets/images/marker_srch-on.svg +11 -0
- package/src/assets/images/marker_srchchap-off.png +0 -0
- package/src/assets/images/marker_srchchap-on.png +0 -0
- package/src/assets/images/nav_control-dn.png +0 -0
- package/src/assets/images/nav_control-dn_ia.png +0 -0
- package/src/assets/images/nav_control-up.png +0 -0
- package/src/assets/images/nav_control-up_ia.png +0 -0
- package/src/assets/images/nav_control.png +0 -0
- package/src/assets/images/one_page_mode_icon.png +0 -0
- package/src/assets/images/paper-badge.png +0 -0
- package/src/assets/images/print_icon.png +0 -0
- package/src/assets/images/progressbar.gif +0 -0
- package/src/assets/images/right_edges.png +0 -0
- package/src/assets/images/slider.png +0 -0
- package/src/assets/images/slider_ia.png +0 -0
- package/src/assets/images/thumbnail_mode_icon.png +0 -0
- package/src/assets/images/transparent.png +0 -0
- package/src/assets/images/two_page_mode_icon.png +0 -0
- package/src/assets/images/zoom_in_icon.png +0 -0
- package/src/assets/images/zoom_out_icon.png +0 -0
- package/src/css/BookReader.scss +89 -0
- package/src/css/_BRBookmarks.scss +29 -0
- package/src/css/_BRComponent.scss +13 -0
- package/src/css/_BRfloat.scss +197 -0
- package/src/css/_BRicon.scss +48 -0
- package/src/css/_BRmain.scss +251 -0
- package/src/css/_BRnav.scss +382 -0
- package/src/css/_BRpages.scss +139 -0
- package/src/css/_BRsearch.scss +226 -0
- package/src/css/_BRtoolbar.scss +84 -0
- package/src/css/_BRvendor.scss +5 -0
- package/src/css/_MobileNav.scss +194 -0
- package/src/css/_TextSelection.scss +32 -0
- package/src/css/_colorbox.scss +52 -0
- package/src/css/_controls.scss +244 -0
- package/src/css/_icons.scss +121 -0
- package/src/dragscrollable-br.js +261 -0
- package/src/jquery-wrapper.js +4 -0
- package/src/plugins/plugin.archive_analytics.js +86 -0
- package/src/plugins/plugin.autoplay.js +129 -0
- package/src/plugins/plugin.chapters.js +251 -0
- package/src/plugins/plugin.iframe.js +48 -0
- package/src/plugins/plugin.mobile_nav.js +287 -0
- package/src/plugins/plugin.resume.js +68 -0
- package/src/plugins/plugin.text_selection.js +291 -0
- package/src/plugins/plugin.url.js +198 -0
- package/src/plugins/plugin.vendor-fullscreen.js +247 -0
- package/src/plugins/search/plugin.search.js +439 -0
- package/src/plugins/search/view.js +440 -0
- package/src/plugins/tts/AbstractTTSEngine.js +242 -0
- package/src/plugins/tts/FestivalTTSEngine.js +169 -0
- package/src/plugins/tts/PageChunk.js +107 -0
- package/src/plugins/tts/PageChunkIterator.js +163 -0
- package/src/plugins/tts/WebTTSEngine.js +352 -0
- package/src/plugins/tts/plugin.tts.js +335 -0
- package/src/plugins/tts/tooltip_dict.js +15 -0
- package/src/plugins/tts/utils.js +91 -0
- package/src/util/browserSniffing.js +30 -0
- package/src/util/debouncer.js +26 -0
- package/src/util/docCookies.js +67 -0
- package/src/util/strings.js +34 -0
- package/tests/BookReader/BookModel.test.js +312 -0
- package/tests/BookReader/BookReaderPublicFunctions.test.js +164 -0
- package/tests/BookReader/DebugConsole.test.js +25 -0
- package/tests/BookReader/ImageCache.test.js +150 -0
- package/tests/BookReader/Mode1UpLit.test.js +87 -0
- package/tests/BookReader/Mode2Up.test.js +245 -0
- package/tests/BookReader/ModeSmoothZoom.test.js +149 -0
- package/tests/BookReader/Navbar/Navbar.test.js +169 -0
- package/tests/BookReader/PageContainer.test.js +187 -0
- package/tests/BookReader/ReduceSet.test.js +38 -0
- package/tests/BookReader/Toolbar/Toolbar.test.js +26 -0
- package/tests/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
- package/tests/BookReader/utils/classes.test.js +88 -0
- package/tests/BookReader/utils.test.js +136 -0
- package/tests/BookReader.options.test.js +39 -0
- package/tests/BookReader.test.js +301 -0
- package/tests/e2e/README.md +75 -0
- package/tests/e2e/autoplay.test.js +13 -0
- package/tests/e2e/base.test.js +35 -0
- package/tests/e2e/helpers/base.js +263 -0
- package/tests/e2e/helpers/debug.js +13 -0
- package/tests/e2e/helpers/desktopSearch.js +72 -0
- package/tests/e2e/helpers/mobileSearch.js +85 -0
- package/tests/e2e/helpers/mockSearch.js +93 -0
- package/tests/e2e/helpers/rightToLeft.js +29 -0
- package/tests/e2e/ia-production/ia-prod-base.js +17 -0
- package/tests/e2e/models/BookReader.js +11 -0
- package/tests/e2e/models/Navigation.js +56 -0
- package/tests/e2e/rightToLeft.test.js +20 -0
- package/tests/e2e/viewmode.test.js +37 -0
- package/tests/karma/BookNavigator/book-navigator.test.js +180 -0
- package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +133 -0
- package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +222 -0
- package/tests/karma/BookNavigator/downloads/downloads-provider.test.js +64 -0
- package/tests/karma/BookNavigator/downloads/downloads.test.js +54 -0
- package/tests/karma/BookNavigator/search/search-provider.test.js +23 -0
- package/tests/karma/BookNavigator/search/search-results.test.js +240 -0
- package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +40 -0
- package/tests/karma/BookNavigator/visual-adjustments.test.js +201 -0
- package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +160 -0
- package/tests/karma/BookNavigator/volumes/volumes.test.js +98 -0
- package/tests/plugins/plugin.archive_analytics.test.js +23 -0
- package/tests/plugins/plugin.autoplay.test.js +52 -0
- package/tests/plugins/plugin.chapters.test.js +130 -0
- package/tests/plugins/plugin.iframe.test.js +42 -0
- package/tests/plugins/plugin.mobile_nav.test.js +66 -0
- package/tests/plugins/plugin.resume.test.js +98 -0
- package/tests/plugins/plugin.text_selection.test.js +193 -0
- package/tests/plugins/plugin.url.test.js +129 -0
- package/tests/plugins/plugin.vendor-fullscreen.test.js +65 -0
- package/tests/plugins/search/plugin.search.test.js +173 -0
- package/tests/plugins/search/plugin.search.view.test.js +106 -0
- package/tests/plugins/tts/AbstractTTSEngine.test.js +153 -0
- package/tests/plugins/tts/FestivalTTSEngine.test.js +59 -0
- package/tests/plugins/tts/PageChunk.test.js +57 -0
- package/tests/plugins/tts/PageChunkIterator.test.js +179 -0
- package/tests/plugins/tts/WebTTSEngine.test.js +126 -0
- package/tests/plugins/tts/utils.test.js +133 -0
- package/tests/util/browserSniffing.test.js +56 -0
- package/tests/util/docCookies.test.js +15 -0
- package/tests/util/strings.test.js +63 -0
- package/tests/utils.js +80 -0
- package/webpack.config.js +85 -0
@@ -0,0 +1,193 @@
|
|
1
|
+
import sinon from 'sinon';
|
2
|
+
|
3
|
+
import '../../src/BookReader.js';
|
4
|
+
import { BookreaderWithTextSelection, TextSelectionPlugin, Cache } from '../../src/plugins/plugin.text_selection.js';
|
5
|
+
|
6
|
+
|
7
|
+
/** @type {BookReader} */
|
8
|
+
|
9
|
+
// djvu.xml book infos copied from https://ia803103.us.archive.org/14/items/goodytwoshoes00newyiala/goodytwoshoes00newyiala_djvu.xml
|
10
|
+
const FAKE_XML_1WORD = `<OBJECT data="file://localhost//tmp/derive/goodytwoshoes00newyiala//goodytwoshoes00newyiala.djvu" height="3192" type="image/x.djvu" usemap="goodytwoshoes00newyiala_0001.djvu" width="2454">
|
11
|
+
<PARAGRAPH><LINE><WORD coords="1216,2768,1256,2640">test</WORD></LINE></PARAGRAPH>
|
12
|
+
</OBJECT>`;
|
13
|
+
const FAKE_XML_MULT_WORDS = `<OBJECT data="file://localhost//tmp/derive/goodytwoshoes00newyiala//goodytwoshoes00newyiala.djvu" height="3192" type="image/x.djvu" usemap="goodytwoshoes00newyiala_0001.djvu" width="2454">
|
14
|
+
<PARAGRAPH><LINE><WORD coords="1216,2768,1256,2640">test1</WORD>
|
15
|
+
<WORD coords="1400,2768,1500,2640">test2</WORD>
|
16
|
+
<WORD coords="1600,2768,1700,2640">test3</WORD></LINE></PARAGRAPH></OBJECT>`;
|
17
|
+
const FAKE_XML_5COORDS = `<OBJECT data="file://localhost//tmp/derive/goodytwoshoes00newyiala//goodytwoshoes00newyiala.djvu" height="3192" type="image/x.djvu" usemap="goodytwoshoes00newyiala_0001.djvu" width="2454">
|
18
|
+
<PARAGRAPH><LINE><WORD coords="1216,2768,1256,2640,2690">test</WORD></LINE></PARAGRAPH></OBJECT>`;
|
19
|
+
const FAKE_XML_EMPTY = '';
|
20
|
+
|
21
|
+
describe("Generic tests", () => {
|
22
|
+
let br;
|
23
|
+
beforeEach(() => {
|
24
|
+
document.body.innerHTML = '<div id="BookReader">';
|
25
|
+
br = new BookreaderWithTextSelection({
|
26
|
+
data: [
|
27
|
+
[
|
28
|
+
{ width: 800, height: 1200,
|
29
|
+
uri: '//archive.org/download/BookReader/img/page001.jpg' },
|
30
|
+
],
|
31
|
+
[
|
32
|
+
{ width: 800, height: 1200,
|
33
|
+
uri: '//archive.org/download/BookReader/img/page002.jpg' },
|
34
|
+
{ width: 800, height: 1200,
|
35
|
+
uri: '//archive.org/download/BookReader/img/page003.jpg' },
|
36
|
+
],
|
37
|
+
[
|
38
|
+
{ width: 800, height: 1200,
|
39
|
+
uri: '//archive.org/download/BookReader/img/page004.jpg' },
|
40
|
+
{ width: 800, height: 1200,
|
41
|
+
uri: '//archive.org/download/BookReader/img/page005.jpg' },
|
42
|
+
]
|
43
|
+
],
|
44
|
+
});
|
45
|
+
br.init();
|
46
|
+
});
|
47
|
+
|
48
|
+
test("_createPageContainer overridden function still creates a BRpagecontainer element", () => {
|
49
|
+
const spy = sinon.spy(br.textSelectionPlugin, 'createTextLayer');
|
50
|
+
sinon.stub(br.textSelectionPlugin, "getPageText")
|
51
|
+
.returns($(new DOMParser().parseFromString(FAKE_XML_1WORD, "text/xml")));
|
52
|
+
const container = br._createPageContainer(1, {});
|
53
|
+
expect(container).toBeTruthy();
|
54
|
+
expect(spy.callCount).toBe(1);
|
55
|
+
});
|
56
|
+
|
57
|
+
// test loading first object from sample data
|
58
|
+
test("_createPageContainer handles index 0", () => {
|
59
|
+
const spy = sinon.spy(br.textSelectionPlugin, 'createTextLayer');
|
60
|
+
br._createPageContainer(0, {});
|
61
|
+
expect(spy.callCount).toBe(1);
|
62
|
+
});
|
63
|
+
|
64
|
+
// test loading last object from sample data
|
65
|
+
test("_createPageContainer handles index -1", () => {
|
66
|
+
const spy = sinon.spy(br.textSelectionPlugin, 'createTextLayer');
|
67
|
+
br._createPageContainer(-1, {});
|
68
|
+
expect(spy.callCount).toBe(0);
|
69
|
+
});
|
70
|
+
|
71
|
+
test("createTextLayer will render the last page and create text layer properly", async () => {
|
72
|
+
const $container = br.refs.$brContainer;
|
73
|
+
sinon.stub(br.textSelectionPlugin, "getPageText")
|
74
|
+
.returns($(new DOMParser().parseFromString(FAKE_XML_1WORD, "text/xml")));
|
75
|
+
const pageIndex = br.data.length - 1;
|
76
|
+
await br.textSelectionPlugin.createTextLayer({ $container, page: { index: pageIndex, width: 100, height: 100 }});
|
77
|
+
expect($container.find(".textSelectionSVG").length).toBe(1);
|
78
|
+
expect($container.find(".BRparagElement").length).toBe(1);
|
79
|
+
});
|
80
|
+
|
81
|
+
test("createTextLayer will not create text layer if there are too many words", async () => {
|
82
|
+
const $container = br.refs.$brContainer;
|
83
|
+
const xml = FAKE_XML_1WORD.replace(/<WORD.*<\/WORD>/, FAKE_XML_1WORD.match(/<WORD.*<\/WORD>/)[0].repeat(3000));
|
84
|
+
sinon.stub(br.textSelectionPlugin, "getPageText")
|
85
|
+
.returns($(new DOMParser().parseFromString(xml, "text/xml")));
|
86
|
+
await br.textSelectionPlugin.createTextLayer({ $container, page: { index: 0, width: 100, height: 100 }});
|
87
|
+
expect($container.find(".textSelectionSVG").length).toBe(0);
|
88
|
+
expect($container.find(".BRparagElement").length).toBe(0);
|
89
|
+
expect($container.find(".BRwordElement").length).toBe(0);
|
90
|
+
});
|
91
|
+
|
92
|
+
test("createTextLayer creates an svg layer with paragraph with 1 word element", async () => {
|
93
|
+
const $container = br.refs.$brContainer;
|
94
|
+
sinon.stub(br.textSelectionPlugin, "getPageText")
|
95
|
+
.returns($(new DOMParser().parseFromString(FAKE_XML_1WORD, "text/xml")));
|
96
|
+
await br.textSelectionPlugin.createTextLayer({ $container, page: { index: 1, width: 100, height: 100 }});
|
97
|
+
expect($container.find(".textSelectionSVG").length).toBe(1);
|
98
|
+
expect($container.find(".BRparagElement").length).toBe(1);
|
99
|
+
expect($container.find(".BRwordElement").length).toBe(1);
|
100
|
+
expect($container.find(".BRwordElement").text()).toBe("test");
|
101
|
+
});
|
102
|
+
|
103
|
+
test("createTextLayer creates an svg layer with paragraph with multiple word elements", async () => {
|
104
|
+
const $container = br.refs.$brContainer;
|
105
|
+
sinon.stub(br.textSelectionPlugin, "getPageText")
|
106
|
+
.returns($(new DOMParser().parseFromString(FAKE_XML_MULT_WORDS, "text/xml")));
|
107
|
+
await br.textSelectionPlugin.createTextLayer({ $container, page: { index: 2, width: 100, height: 100 }});
|
108
|
+
expect($container.find(".textSelectionSVG").length).toBe(1);
|
109
|
+
expect($container.find(".BRparagElement").length).toBe(1);
|
110
|
+
expect($container.find(".BRwordElement").length).toBe(5);
|
111
|
+
expect($container.find(".BRwordElement").last()).not.toBe(" ");
|
112
|
+
});
|
113
|
+
|
114
|
+
test("createTextLayer creates an svg layer with paragraph with word with 5 params coordinates", async () => {
|
115
|
+
const $container = br.refs.$brContainer;
|
116
|
+
sinon.stub(br.textSelectionPlugin, "getPageText")
|
117
|
+
.returns($(new DOMParser().parseFromString(FAKE_XML_5COORDS, "text/xml")));
|
118
|
+
await br.textSelectionPlugin.createTextLayer({ $container, page: { index: 3, width: 100, height: 100 }});
|
119
|
+
expect($container.find(".textSelectionSVG").length).toBe(1);
|
120
|
+
expect($container.find(".BRparagElement").length).toBe(1);
|
121
|
+
expect($container.find(".BRwordElement").length).toBe(1);
|
122
|
+
});
|
123
|
+
|
124
|
+
test("createTextLayer can handle empty xml", async () => {
|
125
|
+
const $container = br.refs.$brContainer;
|
126
|
+
sinon.stub(br.textSelectionPlugin, "getPageText")
|
127
|
+
.returns($(new DOMParser().parseFromString(FAKE_XML_EMPTY, "text/xml")));
|
128
|
+
await br.textSelectionPlugin.createTextLayer({ $container, page: { index: 4, width: 100, height: 100 }});
|
129
|
+
expect($container.find(".textSelectionSVG").length).toBe(1);
|
130
|
+
expect($container.find(".BRparagElement").length).toBe(0);
|
131
|
+
expect($container.find(".BRwordElement").length).toBe(0);
|
132
|
+
});
|
133
|
+
|
134
|
+
const LONG_PRESS_DURATION = 500;
|
135
|
+
test("calling stopPageFlip does not allow long click to flip the page", () => {
|
136
|
+
const $container = br.refs.$brContainer;
|
137
|
+
br.textSelectionPlugin.stopPageFlip($container);
|
138
|
+
const currIndex = br.currentIndex();
|
139
|
+
$container.find("BRwordElement").mousedown();
|
140
|
+
// Waits for long press
|
141
|
+
setTimeout(() => {
|
142
|
+
$container.find("BRwordElement").mousedown();
|
143
|
+
// Waits for flipping animation
|
144
|
+
setTimeout(() => {
|
145
|
+
expect(br.currentIndex()).toBe(currIndex);
|
146
|
+
}, 2000);
|
147
|
+
}, LONG_PRESS_DURATION);
|
148
|
+
});
|
149
|
+
});
|
150
|
+
|
151
|
+
describe("textSelectionPlugin constructor", () => {
|
152
|
+
test("textSelectionPlugin constructor with firefox browser", () => {
|
153
|
+
const tsp = new TextSelectionPlugin({}, {}, true);
|
154
|
+
expect(tsp.djvuPagesPromise).toBe(null);
|
155
|
+
expect(tsp.svgParagraphElement).toBe("g");
|
156
|
+
expect(tsp.svgWordElement).toBe("text");
|
157
|
+
});
|
158
|
+
|
159
|
+
test("textSelectionPlugin constructor not on firefox browser", () => {
|
160
|
+
const tsp = new TextSelectionPlugin({}, {}, false);
|
161
|
+
expect(tsp.djvuPagesPromise).toBe(null);
|
162
|
+
expect(tsp.svgParagraphElement).toBe("text");
|
163
|
+
expect(tsp.svgWordElement).toBe("tspan");
|
164
|
+
});
|
165
|
+
});
|
166
|
+
|
167
|
+
describe("Cache", () => {
|
168
|
+
test('Adding works', () => {
|
169
|
+
const c = new Cache(10);
|
170
|
+
c.add(35);
|
171
|
+
expect(c.entries).toEqual([35]);
|
172
|
+
});
|
173
|
+
|
174
|
+
test('Size does not grow beyond limit', () => {
|
175
|
+
const c = new Cache(2);
|
176
|
+
c.add(35);
|
177
|
+
c.add(32);
|
178
|
+
c.add(12);
|
179
|
+
c.add(11);
|
180
|
+
c.add(112);
|
181
|
+
expect(c.entries).toHaveLength(2);
|
182
|
+
});
|
183
|
+
|
184
|
+
test('Oldest evicted first', () => {
|
185
|
+
const c = new Cache(2);
|
186
|
+
c.add(35);
|
187
|
+
c.add(32);
|
188
|
+
c.add(12);
|
189
|
+
c.add(12);
|
190
|
+
c.add(10);
|
191
|
+
expect(c.entries).toEqual([12, 10]);
|
192
|
+
});
|
193
|
+
});
|
@@ -0,0 +1,129 @@
|
|
1
|
+
|
2
|
+
import BookReader from '../../src/BookReader.js';
|
3
|
+
import '../../src/plugins/plugin.url.js';
|
4
|
+
|
5
|
+
let br;
|
6
|
+
beforeAll(() => {
|
7
|
+
document.body.innerHTML = '<div id="BookReader">';
|
8
|
+
br = new BookReader();
|
9
|
+
});
|
10
|
+
|
11
|
+
afterEach(() => {
|
12
|
+
jest.clearAllMocks();
|
13
|
+
});
|
14
|
+
|
15
|
+
describe('Plugin: URL controller', () => {
|
16
|
+
test('has default option flag', () => {
|
17
|
+
expect(BookReader.defaultOptions.enableUrlPlugin).toEqual(true);
|
18
|
+
});
|
19
|
+
|
20
|
+
test('adds url specific fields to BR', () => {
|
21
|
+
const { defaultOptions } = BookReader;
|
22
|
+
expect(defaultOptions).toHaveProperty('urlTrackIndex0');
|
23
|
+
expect(defaultOptions).toHaveProperty('urlTrackedParams');
|
24
|
+
expect(defaultOptions).toHaveProperty('urlHistoryBasePath');
|
25
|
+
expect(defaultOptions).toHaveProperty('urlMode');
|
26
|
+
expect(defaultOptions).toHaveProperty('updateWindowTitle');
|
27
|
+
expect(defaultOptions).toHaveProperty('defaults');
|
28
|
+
expect(defaultOptions).toHaveProperty('bookId');
|
29
|
+
});
|
30
|
+
|
31
|
+
test('has a whitelist of params that it tracks', () => {
|
32
|
+
['page', 'search', 'mode', 'region', 'highlight'];
|
33
|
+
const { defaultOptions: { urlTrackedParams } } = BookReader;
|
34
|
+
expect(Array.isArray(urlTrackedParams)).toEqual(true);
|
35
|
+
expect(urlTrackedParams.find(param => param === 'page')).toBeTruthy();
|
36
|
+
expect(urlTrackedParams.find(param => param === 'search')).toBeTruthy();
|
37
|
+
expect(urlTrackedParams.find(param => param === 'mode')).toBeTruthy();
|
38
|
+
expect(urlTrackedParams.find(param => param === 'region')).toBeTruthy();
|
39
|
+
expect(urlTrackedParams.find(param => param === 'highlight')).toBeTruthy();
|
40
|
+
});
|
41
|
+
|
42
|
+
test('initializes polling for url changes if using hash', () => {
|
43
|
+
BookReader.prototype.urlStartLocationPolling = jest.fn();
|
44
|
+
br.init();
|
45
|
+
|
46
|
+
expect(br.urlStartLocationPolling).toHaveBeenCalled();
|
47
|
+
});
|
48
|
+
|
49
|
+
test('updates URL when index changes', () => {
|
50
|
+
window.history.replaceState = jest.fn();
|
51
|
+
BookReader.prototype.currentIndex = jest.fn(() => 1);
|
52
|
+
BookReader.prototype.urlReadFragment = jest.fn(() => '/page/2/mode/1up');
|
53
|
+
BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
|
54
|
+
index: 88,
|
55
|
+
mode: 1,
|
56
|
+
search: ''
|
57
|
+
}));
|
58
|
+
br.options.urlMode = 'history';
|
59
|
+
br.init();
|
60
|
+
br.urlUpdateFragment();
|
61
|
+
|
62
|
+
expect(window.history.replaceState).toHaveBeenCalled();
|
63
|
+
});
|
64
|
+
|
65
|
+
test('updates URL when mode changes', () => {
|
66
|
+
window.history.replaceState = jest.fn();
|
67
|
+
BookReader.prototype.currentIndex = jest.fn(() => 1);
|
68
|
+
BookReader.prototype.urlReadFragment = jest.fn(() => '/page/2/mode/1up');
|
69
|
+
BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
|
70
|
+
index: 2,
|
71
|
+
mode: 2,
|
72
|
+
search: ''
|
73
|
+
}));
|
74
|
+
br.options.urlMode = 'history';
|
75
|
+
br.init();
|
76
|
+
br.urlUpdateFragment();
|
77
|
+
|
78
|
+
expect(window.history.replaceState).toHaveBeenCalled();
|
79
|
+
});
|
80
|
+
|
81
|
+
test('updates URL when search changes', () => {
|
82
|
+
window.history.replaceState = jest.fn();
|
83
|
+
BookReader.prototype.currentIndex = jest.fn(() => 1);
|
84
|
+
BookReader.prototype.urlReadFragment = jest.fn(() => '');
|
85
|
+
BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
|
86
|
+
index: 1,
|
87
|
+
mode: 2,
|
88
|
+
search: 'foo'
|
89
|
+
}));
|
90
|
+
BookReader.prototype.search = jest.fn();
|
91
|
+
br.options.urlMode = 'history';
|
92
|
+
br.init();
|
93
|
+
br.urlUpdateFragment();
|
94
|
+
|
95
|
+
expect(window.history.replaceState).toHaveBeenCalled();
|
96
|
+
});
|
97
|
+
|
98
|
+
test('does not update URL when search in query string', () => {
|
99
|
+
window.history.replaceState = jest.fn();
|
100
|
+
BookReader.prototype.currentIndex = jest.fn(() => 1);
|
101
|
+
BookReader.prototype.urlReadFragment = jest.fn(() => 'mode/2up');
|
102
|
+
BookReader.prototype.getLocationSearch = jest.fn(() => '?q=foo');
|
103
|
+
BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
|
104
|
+
index: 1,
|
105
|
+
mode: 2,
|
106
|
+
search: 'foo'
|
107
|
+
}));
|
108
|
+
BookReader.prototype.search = jest.fn();
|
109
|
+
br.options.initialSearchTerm = 'foo';
|
110
|
+
br.options.urlMode = 'history';
|
111
|
+
br.init();
|
112
|
+
br.urlUpdateFragment();
|
113
|
+
|
114
|
+
expect(window.history.replaceState).toHaveBeenCalledTimes(0);
|
115
|
+
});
|
116
|
+
|
117
|
+
test('only q= param is selected from url query params', () => {
|
118
|
+
const INTIAL_URL = "http://127.0.0.1:8080/BookReaderDemo/demo-internetarchive.html?ocaid=adventuresofoli00dick&q=foo";
|
119
|
+
const result = br.urlParamsFiltersOnlySearch(INTIAL_URL);
|
120
|
+
expect(result).toBe("?q=foo");
|
121
|
+
});
|
122
|
+
|
123
|
+
test('only q= param is selected from url query params with special character', () => {
|
124
|
+
const INTIAL_URL = "http://127.0.0.1:8080/BookReaderDemo/demo-internetarchive.html?ocaid=adventuresofoli00dick&q=foo%24%24";
|
125
|
+
const result = br.urlParamsFiltersOnlySearch(INTIAL_URL);
|
126
|
+
expect(result).toBe("?q=foo%24%24");
|
127
|
+
});
|
128
|
+
});
|
129
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
|
2
|
+
import BookReader from '../../src/BookReader.js';
|
3
|
+
import * as util from '../../src/plugins/plugin.vendor-fullscreen.js';
|
4
|
+
|
5
|
+
let br;
|
6
|
+
beforeEach(() => {
|
7
|
+
document.body.innerHTML = '<div id="BookReader">';
|
8
|
+
br = new BookReader();
|
9
|
+
br.init();
|
10
|
+
});
|
11
|
+
|
12
|
+
afterEach(() => {
|
13
|
+
jest.clearAllMocks();
|
14
|
+
});
|
15
|
+
|
16
|
+
describe('Plugin: Vendor-fullscreen', () => {
|
17
|
+
test('has option flag', () => {
|
18
|
+
expect(BookReader.defaultOptions.enableVendorFullscreenPlugin).toEqual(true);
|
19
|
+
});
|
20
|
+
|
21
|
+
test('enterFullWindow will run when enter in Fullscreen mode', () => {
|
22
|
+
const enterFullWindow = br.enterFullWindow;
|
23
|
+
br.updateBrClasses = jest.fn();
|
24
|
+
br.resize = jest.fn();
|
25
|
+
br.init();
|
26
|
+
br.enterFullWindow();
|
27
|
+
|
28
|
+
expect(enterFullWindow).toBeTruthy();
|
29
|
+
|
30
|
+
// br.isVendorFullscreenActive set to `true` when enterFullWindow Called
|
31
|
+
expect(br.isVendorFullscreenActive).toEqual(true);
|
32
|
+
|
33
|
+
// br.updateBrClasses trigger when enterFullWindow called
|
34
|
+
expect(br.updateBrClasses).toHaveBeenCalledTimes(2);
|
35
|
+
|
36
|
+
// br.resize trigger when enterFullWindow called
|
37
|
+
expect(br.resize).toHaveBeenCalledTimes(1);
|
38
|
+
});
|
39
|
+
|
40
|
+
test('exitFullWindow will run when exit Fullscreen mode', () => {
|
41
|
+
const exitFullWindow = br.exitFullWindow;
|
42
|
+
br.updateBrClasses = jest.fn();
|
43
|
+
br.init();
|
44
|
+
br.exitFullWindow();
|
45
|
+
|
46
|
+
expect(exitFullWindow).toBeTruthy();
|
47
|
+
|
48
|
+
// br.isFullscreenActive set to `false` when exitFullWindow Called
|
49
|
+
expect(br.isFullscreenActive).toEqual(false);
|
50
|
+
|
51
|
+
// br.updateBrClasses trigger when exitFullWindow called
|
52
|
+
expect(br.updateBrClasses).toHaveBeenCalledTimes(2);
|
53
|
+
});
|
54
|
+
|
55
|
+
test('isFullscreen returns true when fullscreen activated', () => {
|
56
|
+
br.init();
|
57
|
+
br.isVendorFullscreenActive = true;
|
58
|
+
expect(br.isFullscreen).toBeTruthy();
|
59
|
+
});
|
60
|
+
|
61
|
+
test('util: isFullscreenActive', () => {
|
62
|
+
document.fullscreenElement = true;
|
63
|
+
expect(util.isFullscreenActive).toBeTruthy();
|
64
|
+
});
|
65
|
+
});
|
@@ -0,0 +1,173 @@
|
|
1
|
+
|
2
|
+
import BookReader from '../../../src/BookReader.js';
|
3
|
+
import '../../../src/plugins/plugin.mobile_nav.js';
|
4
|
+
import '../../../src/plugins/search/plugin.search.js';
|
5
|
+
|
6
|
+
jest.mock('../../../src/plugins/search/view.js');
|
7
|
+
|
8
|
+
let br;
|
9
|
+
const namespace = 'BookReader:';
|
10
|
+
const triggeredEvents = () => {
|
11
|
+
return $.fn.trigger.mock.calls.map((params) => {
|
12
|
+
if (typeof params[0] === 'string') { return params[0]; }
|
13
|
+
return params[0].type;
|
14
|
+
});
|
15
|
+
};
|
16
|
+
|
17
|
+
beforeEach(() => {
|
18
|
+
$.ajax = jest.fn().mockImplementation(() => {
|
19
|
+
// return from:
|
20
|
+
// `https://ia800304.us.archive.org/fulltext/inside.php?item_id=adventuresofoli00dick&doc=adventuresofoli00dick&path=/30/items/adventuresofoli00dick&q=child&callback=<serialized jQ CB>`
|
21
|
+
return Promise.resolve({
|
22
|
+
ia: "adventuresofoli00dick",
|
23
|
+
q: "child",
|
24
|
+
indexed: true,
|
25
|
+
page_count: 644,
|
26
|
+
body_length: 666,
|
27
|
+
leaf0_missing: false,
|
28
|
+
matches: [{
|
29
|
+
text: 'For a long; time after it was ushered into this world of sorrow and trouble, by the parish surgeon, it remained a matter of considerable doubt wliether the {{{child}}} Avould survi^ e to bear any name at all; in which case it is somewhat more than probable that these memoirs would never have appeared; or, if they had, that being comprised within a couple of pages, they would have possessed the inestimable meiit of being the most concise and faithful specimen of biography, extant in the literature of any age or country.',
|
30
|
+
par: [{
|
31
|
+
boxes: [{r: 1221, b: 2121, t: 2075, page: 37, l: 1107}],
|
32
|
+
b: 2535,
|
33
|
+
t: 1942,
|
34
|
+
page_width: 1790,
|
35
|
+
r: 1598,
|
36
|
+
l: 50,
|
37
|
+
page_height: 2940,
|
38
|
+
page: 37
|
39
|
+
}]
|
40
|
+
}]
|
41
|
+
});
|
42
|
+
});
|
43
|
+
|
44
|
+
$.fn.trigger = jest.fn();
|
45
|
+
document.body.innerHTML = '<div id="BookReader">';
|
46
|
+
br = new BookReader();
|
47
|
+
br.initToolbar = jest.fn();
|
48
|
+
br.showProgressPopup = jest.fn();
|
49
|
+
br.searchXHR = jest.fn();
|
50
|
+
});
|
51
|
+
|
52
|
+
afterEach(() => {
|
53
|
+
jest.clearAllMocks();
|
54
|
+
});
|
55
|
+
|
56
|
+
describe('Plugin: Search', () => {
|
57
|
+
test('has option flag', () => {
|
58
|
+
expect(BookReader.defaultOptions.enableSearch).toEqual(true);
|
59
|
+
});
|
60
|
+
|
61
|
+
test('has added BR property: server', () => {
|
62
|
+
expect(br).toHaveProperty('server');
|
63
|
+
expect(br.server).toBeTruthy();
|
64
|
+
});
|
65
|
+
|
66
|
+
test('has added BR property: bookId', () => {
|
67
|
+
expect(br).toHaveProperty('bookId');
|
68
|
+
expect(br.bookId).toBeFalsy();
|
69
|
+
});
|
70
|
+
|
71
|
+
test('has added BR property: subPrefix', () => {
|
72
|
+
expect(br).toHaveProperty('subPrefix');
|
73
|
+
expect(br.subPrefix).toBeFalsy();
|
74
|
+
});
|
75
|
+
|
76
|
+
test('has added BR property: bookPath', () => {
|
77
|
+
expect(br).toHaveProperty('bookPath');
|
78
|
+
expect(br.bookPath).toBeFalsy();
|
79
|
+
});
|
80
|
+
|
81
|
+
test('has added BR property: searchInsideUrl', () => {
|
82
|
+
expect(br).toHaveProperty('searchInsideUrl');
|
83
|
+
expect(br.searchInsideUrl).toBeTruthy();
|
84
|
+
});
|
85
|
+
|
86
|
+
test('has added BR property: initialSearchTerm', () => {
|
87
|
+
expect(br.options).toHaveProperty('initialSearchTerm');
|
88
|
+
expect(br.options.initialSearchTerm).toBeFalsy();
|
89
|
+
});
|
90
|
+
|
91
|
+
test('On init, it loads the toolbar', () => {
|
92
|
+
br.init();
|
93
|
+
expect(br.initToolbar).toHaveBeenCalled();
|
94
|
+
});
|
95
|
+
|
96
|
+
test('On init, it will run a search if given `options.initialSearchTerm`', () => {
|
97
|
+
br.search = jest.fn();
|
98
|
+
br.options.initialSearchTerm = 'foo';
|
99
|
+
br.init();
|
100
|
+
|
101
|
+
expect(br.search).toHaveBeenCalled();
|
102
|
+
expect(br.search.mock.calls[0][1])
|
103
|
+
.toHaveProperty('goToFirstResult', true);
|
104
|
+
expect(br.search.mock.calls[0][1])
|
105
|
+
.toHaveProperty('suppressFragmentChange', false);
|
106
|
+
});
|
107
|
+
|
108
|
+
test('calling `search` fires ajax call`', () => {
|
109
|
+
br.init();
|
110
|
+
br.search('foo');
|
111
|
+
expect($.ajax).toHaveBeenCalled();
|
112
|
+
});
|
113
|
+
|
114
|
+
test('SearchStarted event fires when search method called', () => {
|
115
|
+
br.init();
|
116
|
+
br.search('foo');
|
117
|
+
expect(triggeredEvents()).toContain(`${namespace}SearchStarted`);
|
118
|
+
});
|
119
|
+
|
120
|
+
test('SearchStarted event fires and should go to first result', () => {
|
121
|
+
br.init();
|
122
|
+
br.search('foo', { goToFirstResult: true});
|
123
|
+
expect(br.options.goToFirstResult).toBeTruthy();
|
124
|
+
});
|
125
|
+
|
126
|
+
test('SearchCallback event fires when AJAX search returns results', () => {
|
127
|
+
br.init();
|
128
|
+
const dfd = br.search('foo');
|
129
|
+
return dfd.then(() => {
|
130
|
+
expect(triggeredEvents()).toContain(`${namespace}SearchCallback`);
|
131
|
+
});
|
132
|
+
});
|
133
|
+
|
134
|
+
test('SearchCallbackError event fires when AJAX search returns error', () => {
|
135
|
+
$.ajax = jest.fn().mockImplementation(() => {
|
136
|
+
return Promise.resolve({
|
137
|
+
error: true,
|
138
|
+
});
|
139
|
+
});
|
140
|
+
br.init();
|
141
|
+
const dfd = br.search('foo');
|
142
|
+
return dfd.then(() => {
|
143
|
+
expect(triggeredEvents()).toContain(`${namespace}SearchCallbackError`);
|
144
|
+
});
|
145
|
+
});
|
146
|
+
|
147
|
+
test('SearchCallbackNotIndexed event fires when AJAX search returns false indexed value', () => {
|
148
|
+
$.ajax = jest.fn().mockImplementation(() => {
|
149
|
+
return Promise.resolve({
|
150
|
+
matches: [],
|
151
|
+
indexed: false,
|
152
|
+
});
|
153
|
+
});
|
154
|
+
br.init();
|
155
|
+
const dfd = br.search('foo');
|
156
|
+
return dfd.then(() => {
|
157
|
+
expect(triggeredEvents()).toContain(`${namespace}SearchCallbackBookNotIndexed`);
|
158
|
+
});
|
159
|
+
});
|
160
|
+
|
161
|
+
test('SearchCallbackEmpty event fires when AJAX search returns no matches', () => {
|
162
|
+
$.ajax = jest.fn().mockImplementation(() => {
|
163
|
+
return Promise.resolve({
|
164
|
+
matches: [],
|
165
|
+
});
|
166
|
+
});
|
167
|
+
br.init();
|
168
|
+
const dfd = br.search('foo');
|
169
|
+
return dfd.then(() => {
|
170
|
+
expect(triggeredEvents()).toContain(`${namespace}SearchCallbackEmpty`);
|
171
|
+
});
|
172
|
+
});
|
173
|
+
});
|
@@ -0,0 +1,106 @@
|
|
1
|
+
|
2
|
+
import BookReader from '../../../src/BookReader.js';
|
3
|
+
import '../../../src/plugins/plugin.mobile_nav.js';
|
4
|
+
import '../../../src/plugins/search/plugin.search.js';
|
5
|
+
import '../../../src/plugins/search/view.js';
|
6
|
+
|
7
|
+
let br;
|
8
|
+
const namespace = 'BookReader:';
|
9
|
+
const results = {
|
10
|
+
ia: "adventuresofoli00dick",
|
11
|
+
q: "child",
|
12
|
+
indexed: true,
|
13
|
+
page_count: 644,
|
14
|
+
body_length: 666,
|
15
|
+
leaf0_missing: false,
|
16
|
+
matches: [{
|
17
|
+
text: 'For a long; time after it was ushered into this world of sorrow and trouble, by the parish surgeon, it remained a matter of considerable doubt wliether the {{{child}}} Avould survi^ e to bear any name at all; in which case it is somewhat more than probable that these memoirs would never have appeared; or, if they had, that being comprised within a couple of pages, they would have possessed the inestimable meiit of being the most concise and faithful specimen of biography, extant in the literature of any age or country.',
|
18
|
+
par: [{
|
19
|
+
boxes: [{r: 1221, b: 2121, t: 2075, page: 37, l: 1107}],
|
20
|
+
b: 2535,
|
21
|
+
t: 1942,
|
22
|
+
page_width: 1790,
|
23
|
+
r: 1598,
|
24
|
+
l: 50,
|
25
|
+
page_height: 2940,
|
26
|
+
page: 37
|
27
|
+
}]
|
28
|
+
}]
|
29
|
+
};
|
30
|
+
beforeEach(() => {
|
31
|
+
$.ajax = jest.fn().mockImplementation(() => {
|
32
|
+
// return from:
|
33
|
+
// `https://ia800304.us.archive.org/fulltext/inside.php?item_id=adventuresofoli00dick&doc=adventuresofoli00dick&path=/30/items/adventuresofoli00dick&q=child&callback=<serialized jQ CB>`
|
34
|
+
return Promise.resolve(results);
|
35
|
+
});
|
36
|
+
|
37
|
+
$.fn.trigger = jest.fn();
|
38
|
+
document.body.innerHTML = '<div id="BookReader">';
|
39
|
+
br = new BookReader();
|
40
|
+
br.initToolbar = jest.fn();
|
41
|
+
br.showProgressPopup = jest.fn();
|
42
|
+
});
|
43
|
+
|
44
|
+
afterEach(() => {
|
45
|
+
jest.clearAllMocks();
|
46
|
+
});
|
47
|
+
|
48
|
+
describe('View: Plugin: Search', () => {
|
49
|
+
test('When search runs, the view gets created.', () => {
|
50
|
+
br.search = jest.fn();
|
51
|
+
br.options.initialSearchTerm = 'foo';
|
52
|
+
br.init();
|
53
|
+
|
54
|
+
expect(br.searchView).toBeDefined();
|
55
|
+
expect(br.searchView.handleSearchCallback).toBeDefined();
|
56
|
+
});
|
57
|
+
|
58
|
+
describe("Search results navigation bar", () => {
|
59
|
+
test('Search Results callback creates the results nav', () => {
|
60
|
+
br.init();
|
61
|
+
const event = new CustomEvent(`${namespace}SearchCallback`);
|
62
|
+
const options = { goToFirstResult: false };
|
63
|
+
|
64
|
+
expect(br.searchView.dom.searchNavigation).toBeUndefined();
|
65
|
+
|
66
|
+
br.searchView.handleSearchCallback(event, { results, options});
|
67
|
+
expect(br.searchView.dom.searchNavigation).toBeDefined();
|
68
|
+
});
|
69
|
+
test('has controls', () => {
|
70
|
+
br.init();
|
71
|
+
const event = new CustomEvent(`${namespace}SearchCallback`);
|
72
|
+
const options = { goToFirstResult: false };
|
73
|
+
br.searchView.handleSearchCallback(event, { results, options});
|
74
|
+
|
75
|
+
const searchResultsNav = document.querySelector('.BRsearch-navigation');
|
76
|
+
expect(searchResultsNav).toBeDefined();
|
77
|
+
|
78
|
+
expect(searchResultsNav.querySelectorAll('button').length).toEqual(4);
|
79
|
+
expect(searchResultsNav.querySelector('.clear')).toBeDefined();
|
80
|
+
expect(searchResultsNav.querySelector('.toggle-sidebar')).toBeDefined();
|
81
|
+
expect(searchResultsNav.querySelector('.prev')).toBeDefined();
|
82
|
+
expect(searchResultsNav.querySelector('.next')).toBeDefined();
|
83
|
+
});
|
84
|
+
|
85
|
+
describe('Click events handlers', () => {
|
86
|
+
it('triggers custom event when toggling side menu', () => {
|
87
|
+
br.init();
|
88
|
+
let eventNameTriggered = '';
|
89
|
+
br.trigger = (eventName) => eventNameTriggered = eventName;
|
90
|
+
|
91
|
+
expect(eventNameTriggered).toBeFalsy();
|
92
|
+
br.searchView.toggleSidebar();
|
93
|
+
expect(eventNameTriggered).toEqual('ToggleSearchMenu');
|
94
|
+
});
|
95
|
+
it('triggers custom event when closing navbar', () => {
|
96
|
+
br.init();
|
97
|
+
let eventNameTriggered = '';
|
98
|
+
br.trigger = (eventName) => eventNameTriggered = eventName;
|
99
|
+
|
100
|
+
expect(eventNameTriggered).toBeFalsy();
|
101
|
+
br.searchView.clearSearchFieldAndResults();
|
102
|
+
expect(eventNameTriggered).toEqual('SearchResultsCleared');
|
103
|
+
});
|
104
|
+
});
|
105
|
+
});
|
106
|
+
});
|