@internetarchive/bookreader 5.0.0-7 → 5.0.0-70-a1
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 +17 -15
- package/.github/workflows/node.js.yml +73 -10
- package/.github/workflows/npm-publish.yml +6 -20
- package/.testcaferc.js +10 -0
- package/BookReader/BookReader.css +396 -1129
- package/BookReader/BookReader.js +1 -1
- package/BookReader/BookReader.js.LICENSE.txt +20 -20
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/ia-bookreader-bundle.js +1788 -0
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +19 -0
- package/BookReader/ia-bookreader-bundle.js.map +1 -0
- package/BookReader/icons/1up.svg +1 -1
- package/BookReader/icons/2up.svg +1 -1
- package/BookReader/icons/advance.svg +1 -1
- package/BookReader/icons/chevron-right.svg +1 -1
- package/BookReader/icons/close-circle-dark.svg +1 -1
- package/BookReader/icons/close-circle.svg +1 -1
- package/BookReader/icons/fullscreen.svg +1 -1
- package/BookReader/icons/fullscreen_exit.svg +1 -1
- package/BookReader/icons/hamburger.svg +1 -1
- package/BookReader/icons/left-arrow.svg +1 -1
- package/BookReader/icons/magnify-minus.svg +1 -1
- package/BookReader/icons/magnify-plus.svg +1 -1
- package/BookReader/icons/magnify.svg +1 -1
- package/BookReader/icons/pause.svg +1 -1
- package/BookReader/icons/play.svg +1 -1
- package/BookReader/icons/playback-speed.svg +1 -1
- package/BookReader/icons/read-aloud.svg +1 -1
- package/BookReader/icons/review.svg +1 -1
- package/BookReader/icons/thumbnails.svg +1 -1
- package/BookReader/icons/voice.svg +1 -0
- package/BookReader/icons/volume-full.svg +1 -1
- package/BookReader/images/BRicons.svg +3 -3
- package/BookReader/images/books_graphic.svg +1 -1
- package/BookReader/images/icon_book.svg +1 -1
- package/BookReader/images/icon_bookmark.svg +1 -1
- package/BookReader/images/icon_gear.svg +1 -1
- package/BookReader/images/icon_hamburger.svg +1 -1
- package/BookReader/images/icon_home.svg +1 -1
- package/BookReader/images/icon_info.svg +1 -1
- package/BookReader/images/icon_one_page.svg +1 -1
- package/BookReader/images/icon_pause.svg +1 -1
- package/BookReader/images/icon_play.svg +1 -1
- package/BookReader/images/icon_playback-rate.svg +1 -1
- package/BookReader/images/icon_search_button.svg +1 -1
- package/BookReader/images/icon_share.svg +1 -1
- package/BookReader/images/icon_skip-ahead.svg +1 -1
- package/BookReader/images/icon_skip-back.svg +1 -1
- package/BookReader/images/icon_speaker.svg +1 -1
- package/BookReader/images/icon_speaker_open.svg +1 -1
- package/BookReader/images/icon_thumbnails.svg +1 -1
- package/BookReader/images/icon_toc.svg +1 -1
- package/BookReader/images/icon_two_pages.svg +1 -1
- package/BookReader/images/marker_chap-off.svg +1 -1
- package/BookReader/images/marker_chap-on.svg +1 -1
- package/BookReader/images/marker_srch-on.svg +1 -1
- package/BookReader/jquery-3.js +2 -0
- package/BookReader/jquery-3.js.LICENSE.txt +24 -0
- package/BookReader/plugins/plugin.archive_analytics.js +1 -1
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +1 -1
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +25 -1
- package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.iframe.js +1 -1
- package/BookReader/plugins/plugin.iframe.js.map +1 -1
- package/BookReader/plugins/plugin.resume.js +1 -1
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +2 -1
- package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +2 -1
- package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.tts.js +1 -1
- package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +1 -1
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
- package/BookReader/webcomponents-bundle.js +3 -0
- package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
- package/BookReader/webcomponents-bundle.js.map +1 -0
- package/BookReaderDemo/BookReaderDemo.css +16 -19
- package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
- package/BookReaderDemo/BookReaderJSAutoplay.js +4 -1
- package/BookReaderDemo/BookReaderJSSimple.js +1 -0
- package/BookReaderDemo/IADemoBr.js +147 -0
- package/BookReaderDemo/demo-advanced.html +2 -2
- package/BookReaderDemo/demo-autoplay.html +2 -3
- package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
- package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
- package/BookReaderDemo/demo-fullscreen.html +2 -4
- package/BookReaderDemo/demo-iiif.html +2 -1
- package/BookReaderDemo/demo-iiif.js +0 -1
- package/BookReaderDemo/demo-internetarchive.html +213 -17
- package/BookReaderDemo/demo-multiple.html +2 -1
- package/BookReaderDemo/demo-preview-pages.html +2 -1
- package/BookReaderDemo/demo-simple.html +2 -1
- package/BookReaderDemo/demo-vendor-fullscreen.html +2 -4
- package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
- package/BookReaderDemo/immersion-1up.html +2 -2
- package/BookReaderDemo/immersion-mode.html +2 -4
- package/BookReaderDemo/toggle_controls.html +3 -2
- package/BookReaderDemo/view_mode.html +2 -1
- package/BookReaderDemo/viewmode-cycle.html +2 -3
- package/CHANGELOG.md +279 -0
- package/README.md +14 -1
- package/babel.config.js +20 -0
- package/codecov.yml +6 -0
- package/index.html +4 -1
- package/jsconfig.json +19 -0
- package/netlify.toml +9 -0
- package/package.json +69 -60
- package/renovate.json +52 -0
- package/scripts/preversion.js +4 -1
- package/src/BookNavigator/assets/bookmark-colors.js +1 -1
- package/src/BookNavigator/assets/button-base.js +4 -2
- package/src/BookNavigator/assets/ia-logo.js +17 -0
- package/src/BookNavigator/assets/icon_checkmark.js +1 -1
- package/src/BookNavigator/assets/icon_close.js +1 -1
- package/src/BookNavigator/book-navigator.js +586 -0
- package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
- package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
- package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
- package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
- package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
- package/src/BookNavigator/delete-modal-actions.js +1 -1
- package/src/BookNavigator/downloads/downloads-provider.js +36 -21
- package/src/BookNavigator/downloads/downloads.js +41 -25
- package/src/BookNavigator/search/search-provider.js +49 -27
- package/src/BookNavigator/search/search-results.js +23 -9
- package/src/BookNavigator/sharing.js +27 -0
- package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
- package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
- package/src/BookNavigator/volumes/volumes-provider.js +95 -0
- package/src/BookReader/BookModel.js +64 -34
- package/src/BookReader/DragScrollable.js +233 -0
- package/src/BookReader/Mode1Up.js +56 -351
- package/src/BookReader/Mode1UpLit.js +388 -0
- package/src/BookReader/Mode2Up.js +73 -1318
- package/src/BookReader/Mode2UpLit.js +776 -0
- package/src/BookReader/ModeCoordinateSpace.js +29 -0
- package/src/BookReader/ModeSmoothZoom.js +312 -0
- package/src/BookReader/ModeThumb.js +18 -12
- package/src/BookReader/Navbar/Navbar.js +12 -38
- package/src/BookReader/PageContainer.js +81 -6
- package/src/BookReader/ReduceSet.js +1 -1
- package/src/BookReader/Toolbar/Toolbar.js +10 -37
- package/src/BookReader/events.js +2 -3
- package/src/BookReader/options.js +24 -2
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/ScrollClassAdder.js +31 -0
- package/src/BookReader/utils/SelectionObserver.js +43 -0
- package/src/BookReader/utils.js +118 -13
- package/src/BookReader.js +423 -1056
- package/src/assets/icons/magnify-minus.svg +3 -7
- package/src/assets/icons/magnify-plus.svg +3 -7
- package/src/assets/icons/voice.svg +1 -0
- package/src/css/BookReader.scss +1 -5
- package/src/css/_BRBookmarks.scss +1 -1
- package/src/css/_BRComponent.scss +1 -1
- package/src/css/_BRmain.scss +16 -0
- package/src/css/_BRnav.scss +11 -38
- package/src/css/_BRpages.scss +149 -40
- package/src/css/_BRsearch.scss +67 -21
- package/src/css/_TextSelection.scss +87 -27
- package/src/css/_colorbox.scss +2 -2
- package/src/css/_controls.scss +20 -7
- package/src/css/_icons.scss +1 -1
- package/src/ia-bookreader/ia-bookreader.js +224 -0
- package/src/plugins/plugin.archive_analytics.js +3 -3
- package/src/plugins/plugin.autoplay.js +5 -11
- package/src/plugins/plugin.chapters.js +211 -186
- package/src/plugins/plugin.resume.js +3 -3
- package/src/plugins/plugin.text_selection.js +464 -134
- package/src/plugins/plugin.vendor-fullscreen.js +4 -4
- package/src/plugins/search/plugin.search.js +142 -125
- package/src/plugins/search/utils.js +43 -0
- package/src/plugins/search/view.js +33 -58
- package/src/plugins/tts/AbstractTTSEngine.js +46 -37
- package/src/plugins/tts/FestivalTTSEngine.js +13 -14
- package/src/plugins/tts/PageChunk.js +15 -21
- package/src/plugins/tts/PageChunkIterator.js +8 -12
- package/src/plugins/tts/WebTTSEngine.js +87 -71
- package/src/plugins/tts/plugin.tts.js +95 -126
- package/src/plugins/tts/utils.js +0 -25
- package/src/plugins/url/UrlPlugin.js +193 -0
- package/src/plugins/{plugin.url.js → url/plugin.url.js} +45 -16
- package/src/util/browserSniffing.js +22 -0
- package/src/util/docCookies.js +21 -2
- package/tests/e2e/README.md +37 -0
- package/tests/e2e/autoplay.test.js +2 -2
- package/tests/e2e/base.test.js +8 -16
- package/tests/e2e/helpers/base.js +53 -48
- package/tests/e2e/helpers/debug.js +1 -1
- package/tests/e2e/helpers/params.js +17 -0
- package/tests/e2e/helpers/rightToLeft.js +8 -14
- package/tests/e2e/helpers/search.js +73 -0
- package/tests/e2e/models/Navigation.js +20 -37
- package/tests/e2e/rightToLeft.test.js +4 -5
- package/tests/e2e/viewmode.test.js +40 -33
- package/tests/jest/BookNavigator/book-navigator.test.js +658 -0
- package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
- package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
- package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
- package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
- package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
- package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
- package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
- package/tests/{karma → jest}/BookNavigator/search/search-results.test.js +109 -60
- package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
- package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
- package/tests/jest/BookNavigator/volumes/volumes-provider.test.js +80 -0
- package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
- package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
- package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
- package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
- package/tests/jest/BookReader/Mode2Up.test.js +98 -0
- package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
- package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
- package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
- package/tests/jest/BookReader/ModeThumb.test.js +71 -0
- package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +10 -10
- package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
- package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
- package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
- package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
- package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
- package/tests/jest/BookReader/utils/SelectionObserver.test.js +43 -0
- package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
- package/tests/jest/BookReader/utils.test.js +229 -0
- package/tests/jest/BookReader.keyboard.test.js +190 -0
- package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
- package/tests/{BookReader.test.js → jest/BookReader.test.js} +26 -37
- package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
- package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
- package/tests/jest/plugins/plugin.chapters.test.js +145 -0
- package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
- package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
- package/tests/jest/plugins/plugin.text_selection.test.js +317 -0
- package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
- package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +25 -47
- package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +39 -6
- package/tests/jest/plugins/search/utils.js +25 -0
- package/tests/jest/plugins/search/utils.test.js +29 -0
- package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +9 -9
- package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
- package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
- package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
- package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
- package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
- package/tests/jest/plugins/url/UrlPlugin.test.js +190 -0
- package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +53 -14
- package/tests/jest/setup.js +3 -0
- package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
- package/tests/jest/util/docCookies.test.js +24 -0
- package/tests/{util → jest/util}/strings.test.js +1 -1
- package/tests/{utils.js → jest/utils.js} +38 -0
- package/webpack.config.js +11 -6
- package/.babelrc +0 -12
- package/.dependabot/config.yml +0 -6
- package/.testcaferc.json +0 -5
- package/BookReader/bookreader-component-bundle.js +0 -1450
- package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
- package/BookReader/bookreader-component-bundle.js.map +0 -1
- package/BookReader/jquery-1.10.1.js +0 -2
- package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
- package/BookReader/plugins/plugin.menu_toggle.js +0 -2
- package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
- package/BookReader/plugins/plugin.mobile_nav.js +0 -2
- package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
- package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
- package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
- package/karma.conf.js +0 -23
- package/src/BookNavigator/BookModel.js +0 -14
- package/src/BookNavigator/BookNavigator.js +0 -446
- package/src/BookNavigator/assets/book-loader.js +0 -27
- package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
- package/src/BookNavigator/search/a-search-result.js +0 -55
- package/src/BookReader/DebugConsole.js +0 -54
- package/src/BookReaderComponent/BookReaderComponent.js +0 -112
- package/src/ItemNavigator/ItemNavigator.js +0 -376
- package/src/ItemNavigator/providers/sharing.js +0 -29
- package/src/css/_MobileNav.scss +0 -194
- package/src/dragscrollable-br.js +0 -261
- package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
- package/src/plugins/plugin.mobile_nav.js +0 -287
- package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
- package/tests/BookReader/DebugConsole.test.js +0 -25
- package/tests/BookReader/Mode1Up.test.js +0 -164
- package/tests/BookReader/Mode2Up.test.js +0 -247
- package/tests/BookReader/utils.test.js +0 -109
- package/tests/e2e/helpers/desktopSearch.js +0 -72
- package/tests/e2e/helpers/mobileSearch.js +0 -85
- package/tests/e2e/ia-production/ia-prod-base.js +0 -17
- package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
- package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
- package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
- package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
- package/tests/plugins/plugin.chapters.test.js +0 -130
- package/tests/plugins/plugin.mobile_nav.test.js +0 -66
- package/tests/plugins/plugin.text_selection.test.js +0 -203
- package/tests/util/docCookies.test.js +0 -15
@@ -28,3 +28,25 @@ export function isFirefox(userAgent = navigator.userAgent) {
|
|
28
28
|
export function isSafari(userAgent = navigator.userAgent) {
|
29
29
|
return /safari/i.test(userAgent) && !/chrome|chromium/i.test(userAgent);
|
30
30
|
}
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Checks whether the current browser is iOS (and hence iOS webkit)
|
34
|
+
* @return {boolean}
|
35
|
+
*/
|
36
|
+
export function isIOS() {
|
37
|
+
// We can't just check the userAgent because as of iOS 13,
|
38
|
+
// the userAgent is the same as desktop Safari because
|
39
|
+
// they wanted iPad's to be served the same version of websites
|
40
|
+
// as desktops.
|
41
|
+
return 'ongesturestart' in window && navigator.maxTouchPoints > 0;
|
42
|
+
}
|
43
|
+
|
44
|
+
/**
|
45
|
+
* Checks whether the current browser is Samsung Internet
|
46
|
+
* https://stackoverflow.com/a/40684162/2317712
|
47
|
+
* @param {string} [userAgent]
|
48
|
+
* @return {boolean}
|
49
|
+
*/
|
50
|
+
export function isSamsungInternet(userAgent = navigator.userAgent) {
|
51
|
+
return /SamsungBrowser/i.test(userAgent);
|
52
|
+
}
|
package/src/util/docCookies.js
CHANGED
@@ -9,6 +9,22 @@
|
|
9
9
|
* http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
10
10
|
*/
|
11
11
|
|
12
|
+
/**
|
13
|
+
* Check to see if the browser has cookies enabled.
|
14
|
+
* Accessing document.cookies errors if eg iframe with sandbox enabled.
|
15
|
+
* @returns {boolean}
|
16
|
+
*/
|
17
|
+
export function areCookiesBlocked(doc = document) {
|
18
|
+
try {
|
19
|
+
doc.cookie;
|
20
|
+
return false;
|
21
|
+
} catch (e) {
|
22
|
+
return true;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
const COOKIES_BLOCKED = areCookiesBlocked();
|
27
|
+
|
12
28
|
/**
|
13
29
|
* Get specific key's value stored in cookie
|
14
30
|
*
|
@@ -17,7 +33,7 @@
|
|
17
33
|
* @returns {string|null}
|
18
34
|
*/
|
19
35
|
export function getItem(sKey) {
|
20
|
-
if (!sKey) return null;
|
36
|
+
if (COOKIES_BLOCKED || !sKey) return null;
|
21
37
|
|
22
38
|
return decodeURIComponent(
|
23
39
|
// eslint-disable-next-line no-useless-escape
|
@@ -34,9 +50,11 @@ export function getItem(sKey) {
|
|
34
50
|
* @param {string} [sDomain] domain name
|
35
51
|
* @param {boolean} [bSecure]
|
36
52
|
*
|
37
|
-
* @returns {
|
53
|
+
* @returns {boolean}
|
38
54
|
*/
|
39
55
|
export function setItem(sKey, sValue, vEnd, sPath, sDomain, bSecure) {
|
56
|
+
if (COOKIES_BLOCKED) return false;
|
57
|
+
|
40
58
|
document.cookie = encodeURIComponent(sKey) + '=' + encodeURIComponent(sValue)
|
41
59
|
+ (vEnd ? `; expires=${vEnd.toUTCString()}` : '')
|
42
60
|
+ (sDomain ? `; domain=${sDomain}` : '')
|
@@ -56,6 +74,7 @@ export function setItem(sKey, sValue, vEnd, sPath, sDomain, bSecure) {
|
|
56
74
|
* @returns {boolean}
|
57
75
|
*/
|
58
76
|
export function removeItem(sKey, sPath, sDomain) {
|
77
|
+
if (COOKIES_BLOCKED) return false;
|
59
78
|
// eslint-disable-next-line
|
60
79
|
if (!hasItem(sKey)) return false;
|
61
80
|
|
package/tests/e2e/README.md
CHANGED
@@ -48,6 +48,43 @@ To run a particular fixture, add the path to the file at the end of your argumen
|
|
48
48
|
|
49
49
|
`npm run test:e2e chrome tests/e2e/example.test.js`
|
50
50
|
|
51
|
+
### Testing netlify or archive.org
|
52
|
+
|
53
|
+
```sh
|
54
|
+
BASE_URL='https://lucid-poitras-9a1249.netlify.app' npx testcafe
|
55
|
+
BASE_URL='https://archive.org' npx testcafe
|
56
|
+
```
|
57
|
+
|
58
|
+
### Testing any OCAID
|
59
|
+
|
60
|
+
For OCAIDs you should pick the specific test file to run, since things like autoplay tests won't work. The main tests are in `base.test.js`.
|
61
|
+
|
62
|
+
```sh
|
63
|
+
OCAIDS='goody,goodytwoshoes00newyiala' npx testcafe tests/e2e/base.test.js
|
64
|
+
OCAIDS='goody,goodytwoshoes00newyiala' BASE_URL='https://archive.org' npx testcafe tests/e2e/base.test.js
|
65
|
+
|
66
|
+
# right to left book; note this also runs the base tests
|
67
|
+
OCAIDS='gendaitankashu00meijuoft' BASE_URL='https://archive.org' npx testcafe tests/e2e/rightToLeft.test.js
|
68
|
+
```
|
69
|
+
|
70
|
+
### Running tests with browserstack
|
71
|
+
|
72
|
+
Note these can only test a public url, so you either need to create a draft PR and use the netlify link, or use ngrok to publish your dev server's port.
|
73
|
+
|
74
|
+
Note: Windows users, there is a bug that prevents spaces in the browser field when using `npx`, so you'll need to have `testcafe` globally installed, and run it without `npx`. (See https://github.com/DevExpress/testcafe/issues/6600 ). Or, you can add browserstack browsers the `.testcaferc.js` file.
|
75
|
+
|
76
|
+
```sh
|
77
|
+
# Set auth; find yours at https://www.browserstack.com/accounts/settings
|
78
|
+
export BROWSERSTACK_USERNAME="YOUR_USERNAME"
|
79
|
+
export BROWSERSTACK_ACCESS_KEY="YOUR_ACCESS_KEY"
|
80
|
+
|
81
|
+
BASE_URL='https://archive.org' OCAIDS='goody,goodytwoshoes00newyiala' npx testcafe 'browserstack:iPad Pro 12.9 2018@15' tests/e2e/base.test.js
|
82
|
+
```
|
83
|
+
|
84
|
+
See a list of available browsers with `npx testcafe -b browserstack`. Note there are some browsers which appear to not work for some reason (eg `browserstack:iPad Mini 4@9.3`).
|
85
|
+
|
86
|
+
Read more about other options/etc at the browserstack docs: https://www.browserstack.com/docs/automate/selenium/getting-started/nodejs/testcafe .
|
87
|
+
|
51
88
|
## Pending (skip) tests
|
52
89
|
|
53
90
|
You can skip any tests by calling the method `.skip` on the test object rather
|
@@ -1,11 +1,11 @@
|
|
1
1
|
import { ClientFunction } from 'testcafe';
|
2
|
+
import params from './helpers/params';
|
2
3
|
|
3
|
-
const { BASE_URL } = process.env;
|
4
4
|
const getLocationHref = ClientFunction(() => window.location.href.toString());
|
5
5
|
const FLIP_SPEED = 1000;
|
6
6
|
const FIRST_PAGE_DELAY = 2000;
|
7
7
|
|
8
|
-
fixture `Autoplay plugin`.page `${
|
8
|
+
fixture `Autoplay plugin`.page `${params.baseUrl}/BookReaderDemo/demo-autoplay.html`;
|
9
9
|
|
10
10
|
test('page auto-advances after allotted flip speed and delay', async t => {
|
11
11
|
await t.wait(2 * FLIP_SPEED + FIRST_PAGE_DELAY);
|
package/tests/e2e/base.test.js
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
import { runBaseTests } from './helpers/base';
|
2
2
|
import BookReader from './models/BookReader';
|
3
|
-
import {
|
4
|
-
|
3
|
+
import { runSearchTests } from './helpers/search';
|
4
|
+
import params from './helpers/params';
|
5
5
|
|
6
|
-
|
7
|
-
const { BASE_URL } = process.env;
|
8
|
-
const OCAIDS = [
|
6
|
+
const ocaids = params.ocaids || [
|
9
7
|
'theworksofplato01platiala',
|
10
8
|
// Removed because failing test 'Canonical URL with cookie shows paramters'
|
11
9
|
// in tests/e2e/helpers/base.js
|
@@ -15,21 +13,15 @@ const OCAIDS = [
|
|
15
13
|
// /BookReaderDemo/demo-ia-olivertwist.html/page/n13/mode/2up
|
16
14
|
// 'demo-ia-olivertwist.html',
|
17
15
|
];
|
18
|
-
const DEMO_PATH = 'demo-internetarchive.html?ocaid='
|
19
16
|
|
20
|
-
|
21
|
-
const url =
|
17
|
+
ocaids.forEach(ocaid => {
|
18
|
+
const url = params.getArchiveUrl(ocaid);
|
22
19
|
|
23
20
|
fixture `Base Tests for: ${ocaid}`.page `${url}`;
|
24
21
|
runBaseTests(new BookReader());
|
25
22
|
|
26
|
-
fixture `Desktop Search Tests for: ${ocaid}`
|
27
|
-
.page `${url}`
|
28
|
-
runDesktopSearchTests(new BookReader());
|
29
|
-
|
30
|
-
// fixture `Mobile Search Tests for: ${ocaid}`
|
31
|
-
// .page `${url}`
|
32
|
-
// runMobileSearchTests(new BookReader());
|
33
|
-
|
34
23
|
|
24
|
+
fixture `Search Tests for: ${ocaid}`
|
25
|
+
.page `${url}`;
|
26
|
+
runSearchTests(new BookReader());
|
35
27
|
});
|
@@ -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.
|
57
|
-
await t.expect(nav.
|
58
|
-
await t.expect(nav.
|
59
|
-
await t.expect(nav.
|
60
|
-
await t.expect(nav.
|
61
|
-
await t.expect(nav.
|
62
|
-
await t.expect(nav.
|
63
|
-
await t.expect(nav.
|
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.
|
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.
|
112
|
+
await t.click(nav.goNext);
|
113
113
|
await t.wait(PAGE_FLIP_WAIT_TIME);
|
114
|
-
await t.click(nav.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|
185
|
+
test('Clicking `2 page view` brings up cur page + caching', async t => {
|
186
186
|
const { nav } = br;
|
187
|
-
await t.click(nav.
|
188
|
-
await t.expect(Selector('.BRpagecontainer').count).eql(
|
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.
|
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.
|
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
|
206
|
-
const
|
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(
|
210
|
-
await t.expect(nav.
|
215
|
+
await t.expect(page.visible).ok();
|
216
|
+
await t.expect(nav.zoomOut.visible).ok();
|
211
217
|
|
212
|
-
const initialBookHeight = await
|
213
|
-
const initialBookWidth = await
|
218
|
+
const initialBookHeight = await page.getBoundingClientRectProperty('height');
|
219
|
+
const initialBookWidth = await page.getBoundingClientRectProperty('width');
|
214
220
|
|
215
|
-
await t.click(nav.
|
221
|
+
await t.click(nav.zoomOut);
|
216
222
|
|
217
|
-
const zoomOutBookHeight = await
|
218
|
-
const zoomOutBookWidth = await
|
223
|
+
const zoomOutBookHeight = await page.getBoundingClientRectProperty('height');
|
224
|
+
const zoomOutBookWidth = await page.getBoundingClientRectProperty('width');
|
219
225
|
|
220
|
-
await t.expect(zoomOutBookHeight).
|
221
|
-
await t.expect(zoomOutBookWidth).
|
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
|
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(
|
231
|
-
await t.expect(nav.
|
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
|
234
|
-
const initialBookWidth = await
|
238
|
+
const initialBookHeight = await page.getBoundingClientRectProperty('height');
|
239
|
+
const initialBookWidth = await page.getBoundingClientRectProperty('width');
|
235
240
|
|
236
|
-
await t.click(nav.
|
241
|
+
await t.click(nav.zoomIn);
|
237
242
|
|
238
|
-
const zoomInBookHeight = await
|
239
|
-
const zoomIntBookWidth = await
|
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.
|
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.
|
259
|
+
await t.click(nav.fullScreen);
|
255
260
|
// in-page
|
256
261
|
await t.expect(BRcontainer.getBoundingClientRectProperty('width')).lte(windowWidth);
|
257
262
|
});
|
@@ -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.
|
7
|
+
await t.click(nav.mode2Up);
|
8
8
|
|
9
|
-
//checking right leaf edge
|
10
|
-
await t.expect(BRcontainer.find('.
|
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.
|
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.
|
26
|
-
await t.click(nav.
|
27
|
-
await t.expect(getPageUrl()).match(/page\/
|
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.
|
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 =
|
23
|
-
this.goRight =
|
24
|
-
this.goNext =
|
25
|
-
this.goPrev =
|
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 =
|
29
|
-
this.mode2Up =
|
30
|
-
this.modeThumb =
|
31
|
-
this.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 =
|
35
|
-
this.zoomOut =
|
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.
|
39
|
-
this.
|
40
|
-
|
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 =
|
44
|
-
this.sliderRange =
|
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
|
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
|
-
|
13
|
-
const url = `${
|
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' }));
|