@internetarchive/bookreader 5.0.0-9-multiple-files → 5.0.0-90
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 +21 -19
- package/.github/workflows/node.js.yml +81 -7
- package/.github/workflows/npm-publish.yml +6 -20
- package/.testcaferc.js +10 -0
- package/BookReader/BookReader.css +505 -1442
- package/BookReader/BookReader.js +2 -21564
- package/BookReader/BookReader.js.LICENSE.txt +20 -20
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/ia-bookreader-bundle.js +1782 -0
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
- package/BookReader/ia-bookreader-bundle.js.map +1 -0
- package/BookReader/icons/1up.svg +1 -12
- package/BookReader/icons/2up.svg +1 -15
- package/BookReader/icons/advance.svg +3 -26
- package/BookReader/icons/chevron-right.svg +1 -1
- package/BookReader/icons/close-circle-dark.svg +1 -0
- package/BookReader/icons/close-circle.svg +1 -1
- package/BookReader/icons/fullscreen.svg +1 -17
- package/BookReader/icons/fullscreen_exit.svg +1 -17
- package/BookReader/icons/hamburger.svg +1 -15
- package/BookReader/icons/left-arrow.svg +1 -12
- package/BookReader/icons/magnify-minus.svg +1 -16
- package/BookReader/icons/magnify-plus.svg +1 -17
- package/BookReader/icons/magnify.svg +1 -15
- package/BookReader/icons/pause.svg +1 -23
- package/BookReader/icons/play.svg +1 -22
- package/BookReader/icons/playback-speed.svg +1 -34
- package/BookReader/icons/read-aloud.svg +1 -22
- package/BookReader/icons/review.svg +3 -22
- package/BookReader/icons/thumbnails.svg +1 -17
- package/BookReader/icons/voice.svg +1 -0
- package/BookReader/icons/volume-full.svg +1 -22
- package/BookReader/images/BRicons.svg +5 -94
- package/BookReader/images/books_graphic.svg +1 -177
- package/BookReader/images/icon_book.svg +1 -12
- package/BookReader/images/icon_bookmark.svg +1 -12
- package/BookReader/images/icon_gear.svg +1 -14
- package/BookReader/images/icon_hamburger.svg +1 -20
- package/BookReader/images/icon_home.svg +1 -21
- package/BookReader/images/icon_info.svg +1 -11
- package/BookReader/images/icon_one_page.svg +1 -8
- package/BookReader/images/icon_pause.svg +1 -1
- package/BookReader/images/icon_play.svg +1 -1
- package/BookReader/images/icon_playback-rate.svg +1 -15
- package/BookReader/images/icon_search_button.svg +1 -8
- package/BookReader/images/icon_share.svg +1 -9
- package/BookReader/images/icon_skip-ahead.svg +1 -6
- package/BookReader/images/icon_skip-back.svg +2 -13
- package/BookReader/images/icon_speaker.svg +1 -18
- package/BookReader/images/icon_speaker_open.svg +1 -10
- package/BookReader/images/icon_thumbnails.svg +1 -12
- package/BookReader/images/icon_toc.svg +1 -5
- package/BookReader/images/icon_two_pages.svg +1 -9
- package/BookReader/images/marker_chap-off.svg +1 -11
- package/BookReader/images/marker_chap-on.svg +1 -11
- package/BookReader/images/marker_srch-on.svg +1 -11
- package/BookReader/images/unviewable_page.png +0 -0
- package/BookReader/jquery-3.js +2 -0
- package/BookReader/jquery-3.js.LICENSE.txt +24 -0
- package/BookReader/plugins/plugin.archive_analytics.js +1 -172
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +1 -165
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +22 -301
- 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 -74
- package/BookReader/plugins/plugin.iframe.js.map +1 -1
- package/BookReader/plugins/plugin.iiif.js +2 -0
- package/BookReader/plugins/plugin.iiif.js.map +1 -0
- package/BookReader/plugins/plugin.resume.js +1 -368
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +2 -1420
- 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 -1080
- 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 +2 -9193
- 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 -269
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
- 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 +18 -19
- package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
- package/BookReaderDemo/BookReaderJSSimple.js +1 -0
- package/BookReaderDemo/IADemoBr.js +144 -0
- package/BookReaderDemo/demo-advanced.html +2 -2
- 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 +99 -12
- package/BookReaderDemo/demo-internetarchive.html +214 -18
- package/BookReaderDemo/demo-multiple.html +2 -1
- package/BookReaderDemo/demo-preview-pages.html +526 -525
- 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 +595 -33
- package/README.md +14 -1
- package/babel.config.js +20 -0
- package/codecov.yml +6 -0
- package/index.html +5 -2
- package/jsconfig.json +19 -0
- package/netlify.toml +9 -0
- package/package.json +70 -62
- package/renovate.json +52 -0
- package/scripts/preversion.js +0 -1
- package/src/BookNavigator/assets/bookmark-colors.js +1 -1
- package/src/BookNavigator/assets/button-base.js +10 -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 +590 -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 +4 -9
- 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 +29 -25
- package/src/BookNavigator/search/search-provider.js +80 -28
- package/src/BookNavigator/search/search-results.js +29 -26
- package/src/BookNavigator/sharing.js +27 -0
- package/src/BookNavigator/viewable-files.js +95 -0
- package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +13 -12
- package/src/BookNavigator/visual-adjustments/visual-adjustments.js +7 -7
- package/src/BookReader/BookModel.js +76 -41
- package/src/BookReader/DragScrollable.js +233 -0
- package/src/BookReader/ImageCache.js +48 -15
- 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 +777 -0
- package/src/BookReader/ModeCoordinateSpace.js +29 -0
- package/src/BookReader/ModeSmoothZoom.js +312 -0
- package/src/BookReader/ModeThumb.js +19 -13
- package/src/BookReader/Navbar/Navbar.js +70 -54
- package/src/BookReader/PageContainer.js +116 -22
- package/src/BookReader/ReduceSet.js +3 -3
- package/src/BookReader/Toolbar/Toolbar.js +14 -41
- package/src/BookReader/events.js +2 -3
- package/src/BookReader/options.js +73 -15
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/ScrollClassAdder.js +31 -0
- package/src/BookReader/utils/SelectionObserver.js +45 -0
- package/src/BookReader/utils/classes.js +1 -1
- package/src/BookReader/utils.js +128 -13
- package/src/BookReader.js +562 -1078
- package/src/BookReaderPlugin.js +44 -0
- package/src/assets/icons/close-circle-dark.svg +1 -0
- 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/assets/images/unviewable_page.png +0 -0
- package/src/css/BookReader.scss +1 -17
- package/src/css/_BRBookmarks.scss +1 -1
- package/src/css/_BRComponent.scss +1 -1
- package/src/css/_BRicon.scss +8 -2
- package/src/css/_BRmain.scss +33 -27
- package/src/css/_BRnav.scss +12 -42
- package/src/css/_BRpages.scss +170 -42
- package/src/css/_BRsearch.scss +68 -230
- package/src/css/_BRtoolbar.scss +5 -5
- package/src/css/_TextSelection.scss +87 -27
- package/src/css/_colorbox.scss +2 -2
- package/src/css/_controls.scss +24 -7
- package/src/css/_icons.scss +7 -1
- package/src/ia-bookreader/ia-bookreader.js +224 -0
- package/src/plugins/plugin.archive_analytics.js +84 -78
- package/src/plugins/plugin.autoplay.js +99 -104
- package/src/plugins/plugin.chapters.js +237 -191
- package/src/plugins/plugin.iframe.js +1 -1
- package/src/plugins/plugin.iiif.js +141 -0
- package/src/plugins/plugin.resume.js +53 -50
- package/src/plugins/plugin.text_selection.js +503 -175
- package/src/plugins/plugin.vendor-fullscreen.js +7 -7
- package/src/plugins/search/plugin.search.js +183 -121
- package/src/plugins/search/utils.js +43 -0
- package/src/plugins/search/view.js +67 -202
- package/src/plugins/tts/AbstractTTSEngine.js +75 -45
- package/src/plugins/tts/FestivalTTSEngine.js +21 -31
- package/src/plugins/tts/PageChunk.js +16 -23
- package/src/plugins/tts/PageChunkIterator.js +11 -17
- package/src/plugins/tts/WebTTSEngine.js +88 -72
- package/src/plugins/tts/plugin.tts.js +310 -350
- package/src/plugins/tts/utils.js +16 -26
- package/src/plugins/url/UrlPlugin.js +191 -0
- package/src/plugins/{plugin.url.js → url/plugin.url.js} +47 -18
- package/src/util/browserSniffing.js +22 -0
- package/src/util/docCookies.js +21 -2
- package/src/util/strings.js +1 -0
- package/tests/e2e/README.md +37 -0
- package/tests/e2e/autoplay.test.js +9 -6
- package/tests/e2e/base.test.js +8 -16
- package/tests/e2e/helpers/base.js +55 -50
- package/tests/e2e/helpers/debug.js +1 -1
- package/tests/e2e/helpers/mockSearch.js +19 -22
- 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 +661 -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/BookNavigator → jest/BookNavigator/search}/search-results.test.js +109 -60
- package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
- package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +80 -0
- package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -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 +42 -29
- package/tests/jest/BookReader/PageContainer.test.js +238 -0
- package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
- package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +3 -3
- 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 +57 -0
- package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
- package/tests/jest/BookReader/utils.test.js +250 -0
- package/tests/jest/BookReader.keyboard.test.js +190 -0
- package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +10 -2
- package/tests/{BookReader.test.js → jest/BookReader.test.js} +43 -53
- package/tests/jest/plugins/plugin.archive_analytics.test.js +20 -0
- package/tests/jest/plugins/plugin.autoplay.test.js +35 -0
- package/tests/jest/plugins/plugin.chapters.test.js +195 -0
- package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +4 -4
- package/tests/{plugins → jest/plugins}/plugin.resume.test.js +22 -35
- package/tests/jest/plugins/plugin.text_selection.test.js +316 -0
- package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
- package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +26 -47
- package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +42 -9
- 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 +30 -10
- 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 +198 -0
- package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +57 -18
- 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 +16 -10
- package/.babelrc +0 -12
- package/.dependabot/config.yml +0 -6
- package/.testcaferc.json +0 -5
- package/BookReader/bookreader-component-bundle.js +0 -14330
- package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
- package/BookReader/bookreader-component-bundle.js.map +0 -1
- package/BookReader/icons/sort-ascending.svg +0 -1
- package/BookReader/icons/sort-descending.svg +0 -1
- package/BookReader/jquery-1.10.1.js +0 -108
- package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
- package/BookReader/plugins/plugin.menu_toggle.js +0 -369
- package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
- package/BookReader/plugins/plugin.mobile_nav.js +0 -335
- package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
- package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
- package/BookReaderDemo/IIIFBookReader.js +0 -207
- package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
- package/BookReaderDemo/demo-autoplay.html +0 -38
- package/BookReaderDemo/demo-iiif.js +0 -26
- 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 -452
- package/src/BookNavigator/assets/book-loader.js +0 -27
- package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
- package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
- package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
- package/src/BookNavigator/search/a-search-result.js +0 -55
- package/src/BookNavigator/volumes/volumes-provider.js +0 -108
- package/src/BookNavigator/volumes/volumes.js +0 -162
- package/src/BookReader/DebugConsole.js +0 -54
- package/src/BookReaderComponent/BookReaderComponent.js +0 -112
- package/src/ItemNavigator/ItemNavigator.js +0 -372
- package/src/ItemNavigator/providers/sharing.js +0 -29
- package/src/assets/icons/sort-ascending.svg +0 -1
- package/src/assets/icons/sort-descending.svg +0 -1
- 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/PageContainer.test.js +0 -115
- 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/visual-adjustments.test.js +0 -201
- package/tests/karma/BookNavigator/volumes.test.js +0 -133
- package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
- package/tests/plugins/plugin.archive_analytics.test.js +0 -23
- package/tests/plugins/plugin.autoplay.test.js +0 -52
- 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
package/src/plugins/tts/utils.js
CHANGED
@@ -1,21 +1,5 @@
|
|
1
1
|
import langs from 'iso-language-codes/js/data.js';
|
2
2
|
|
3
|
-
/**
|
4
|
-
* Convert a EventTarget style event into a promise
|
5
|
-
* @param {EventTarget} target
|
6
|
-
* @param {string} eventType
|
7
|
-
* @return {Promise<Event>}
|
8
|
-
*/
|
9
|
-
export function promisifyEvent(target, eventType) {
|
10
|
-
return new Promise(res => {
|
11
|
-
const resolver = ev => {
|
12
|
-
target.removeEventListener(eventType, resolver);
|
13
|
-
res(ev);
|
14
|
-
};
|
15
|
-
target.addEventListener(eventType, resolver);
|
16
|
-
});
|
17
|
-
}
|
18
|
-
|
19
3
|
/**
|
20
4
|
* Use regex to approximate word count in a string
|
21
5
|
* @param {string} text
|
@@ -26,15 +10,6 @@ export function approximateWordCount(text) {
|
|
26
10
|
return m ? m.length : 0;
|
27
11
|
}
|
28
12
|
|
29
|
-
/**
|
30
|
-
* Waits the provided number of ms and then resolves with a promise
|
31
|
-
* @param {number} ms
|
32
|
-
* @return {Promise}
|
33
|
-
*/
|
34
|
-
export function sleep(ms) {
|
35
|
-
return new Promise(res => setTimeout(res, ms));
|
36
|
-
}
|
37
|
-
|
38
13
|
/**
|
39
14
|
* Checks whether the current browser is on android
|
40
15
|
* @param {string} [userAgent]
|
@@ -55,7 +30,7 @@ const COLUMN_TO_LANG_INDEX = {
|
|
55
30
|
'Endonym': 1,
|
56
31
|
'ISO 639-1': 2,
|
57
32
|
'ISO 639-2/T': 3,
|
58
|
-
'ISO 639-2/B': 4
|
33
|
+
'ISO 639-2/B': 4,
|
59
34
|
};
|
60
35
|
|
61
36
|
/**
|
@@ -89,3 +64,18 @@ function searchForISO6391(language, columnsToSearch) {
|
|
89
64
|
}
|
90
65
|
return null;
|
91
66
|
}
|
67
|
+
|
68
|
+
/**
|
69
|
+
* Checks whether the current browser supports localStorage or
|
70
|
+
* if the current context has access to it.
|
71
|
+
* @return {boolean}
|
72
|
+
*/
|
73
|
+
export function hasLocalStorage() {
|
74
|
+
try {
|
75
|
+
return !!window.localStorage;
|
76
|
+
} catch (e) {
|
77
|
+
// Will throw in sandboxed iframe
|
78
|
+
// DOMException: Window.localStorage getter: Forbidden in a sandboxed document without the 'allow-same-origin' flag.
|
79
|
+
return false;
|
80
|
+
}
|
81
|
+
}
|
@@ -0,0 +1,191 @@
|
|
1
|
+
export class UrlPlugin {
|
2
|
+
constructor(options = {}) {
|
3
|
+
this.bookReaderOptions = options;
|
4
|
+
|
5
|
+
// the canonical order of elements is important in the path and query string
|
6
|
+
this.urlSchema = [
|
7
|
+
{ name: 'page', position: 'path', default: 'n0' },
|
8
|
+
{ name: 'mode', position: 'path', default: '2up' },
|
9
|
+
{ name: 'search', position: 'path', deprecated_for: 'q' },
|
10
|
+
{ name: 'q', position: 'query_param' },
|
11
|
+
{ name: 'sort', position: 'query_param' },
|
12
|
+
{ name: 'view', position: 'query_param' },
|
13
|
+
{ name: 'admin', position: 'query_param' },
|
14
|
+
];
|
15
|
+
|
16
|
+
this.urlState = {};
|
17
|
+
this.urlMode = this.bookReaderOptions.urlMode || 'hash';
|
18
|
+
this.urlHistoryBasePath = this.bookReaderOptions.urlHistoryBasePath || '/';
|
19
|
+
this.urlLocationPollId = null;
|
20
|
+
this.oldLocationHash = null;
|
21
|
+
this.oldUserHash = null;
|
22
|
+
}
|
23
|
+
|
24
|
+
/**
|
25
|
+
* Parse JSON object URL state to string format
|
26
|
+
* Arrange path names in an order that it is positioned on the urlSchema
|
27
|
+
* @param {Object} urlState
|
28
|
+
* @returns {string}
|
29
|
+
*/
|
30
|
+
urlStateToUrlString(urlState) {
|
31
|
+
const searchParams = new URLSearchParams();
|
32
|
+
const pathParams = {};
|
33
|
+
|
34
|
+
Object.keys(urlState).forEach(key => {
|
35
|
+
let schema = this.urlSchema.find(schema => schema.name === key);
|
36
|
+
if (schema?.deprecated_for) {
|
37
|
+
schema = this.urlSchema.find(schemaKey => schemaKey.name === schema.deprecated_for);
|
38
|
+
}
|
39
|
+
if (schema?.position == 'path') {
|
40
|
+
pathParams[schema?.name] = urlState[key];
|
41
|
+
} else {
|
42
|
+
searchParams.append(schema?.name || key, urlState[key]);
|
43
|
+
}
|
44
|
+
});
|
45
|
+
|
46
|
+
const strPathParams = this.urlSchema
|
47
|
+
.filter(s => s.position == 'path')
|
48
|
+
.map(schema => pathParams[schema.name] ? `${schema.name}/${encodeURIComponent(pathParams[schema.name])}` : '')
|
49
|
+
.join('/');
|
50
|
+
|
51
|
+
// replace consecutive slashes with a single slash + remove trailing slashes
|
52
|
+
const strStrippedTrailingSlash = `${strPathParams.replace(/\/+/g, '/').replace(/\/+$/, '')}`;
|
53
|
+
const concatenatedPath = `${strStrippedTrailingSlash}?${searchParams.toString()}`;
|
54
|
+
return searchParams.toString() ? concatenatedPath : `${strStrippedTrailingSlash}`;
|
55
|
+
}
|
56
|
+
|
57
|
+
/**
|
58
|
+
* Parse string URL and add it in the current urlState
|
59
|
+
* Example:
|
60
|
+
* /page/n7/mode/2up => {page: 'n7', mode: '2up'}
|
61
|
+
* /page/n7/mode/2up/search/hello => {page: 'n7', mode: '2up', q: 'hello'}
|
62
|
+
* @param {string} urlString
|
63
|
+
* @returns {object}
|
64
|
+
*/
|
65
|
+
urlStringToUrlState(urlString) {
|
66
|
+
const urlState = {};
|
67
|
+
|
68
|
+
// Fetch searchParams from given {str}
|
69
|
+
// Note: whole URL path is needed for URL parsing
|
70
|
+
const urlPath = new URL(urlString, 'http://example.com');
|
71
|
+
const urlSearchParamsObj = Object.fromEntries(urlPath.searchParams.entries());
|
72
|
+
const splitUrlMatches = urlPath.pathname.match(/[^\\/]+\/[^\\/]+/g);
|
73
|
+
const urlStrSplitSlashObj = splitUrlMatches ? Object.fromEntries(splitUrlMatches.map(x => x.split('/'))) : {};
|
74
|
+
|
75
|
+
const doesKeyExists = (_object, _key) => {
|
76
|
+
return Object.keys(_object).some(value => value == _key);
|
77
|
+
};
|
78
|
+
|
79
|
+
// Add path objects to urlState
|
80
|
+
this.urlSchema
|
81
|
+
.filter(schema => schema.position == 'path')
|
82
|
+
.forEach(schema => {
|
83
|
+
const hasPropertyKey = doesKeyExists(urlStrSplitSlashObj, schema.name);
|
84
|
+
const hasDeprecatedKey = doesKeyExists(schema, 'deprecated_for') && hasPropertyKey;
|
85
|
+
|
86
|
+
// Not in the URL
|
87
|
+
if (!hasPropertyKey && !hasDeprecatedKey) {
|
88
|
+
return;
|
89
|
+
}
|
90
|
+
|
91
|
+
const urlStateParam = hasDeprecatedKey ? schema.deprecated_for : schema.name;
|
92
|
+
urlState[urlStateParam] = decodeURIComponent(urlStrSplitSlashObj[schema.name]);
|
93
|
+
});
|
94
|
+
|
95
|
+
// Add searchParams to urlState
|
96
|
+
Object.entries(urlSearchParamsObj).forEach(([key, value]) => {
|
97
|
+
urlState[key] = value;
|
98
|
+
});
|
99
|
+
|
100
|
+
return urlState;
|
101
|
+
}
|
102
|
+
|
103
|
+
/**
|
104
|
+
* Add or update key-value to the urlState
|
105
|
+
* @param {string} key
|
106
|
+
* @param {string} val
|
107
|
+
*/
|
108
|
+
setUrlParam(key, value) {
|
109
|
+
this.urlState[key] = value;
|
110
|
+
|
111
|
+
this.pushToAddressBar();
|
112
|
+
}
|
113
|
+
|
114
|
+
/**
|
115
|
+
* Delete key-value to the urlState
|
116
|
+
* @param {string} key
|
117
|
+
*/
|
118
|
+
removeUrlParam(key) {
|
119
|
+
delete this.urlState[key];
|
120
|
+
|
121
|
+
this.pushToAddressBar();
|
122
|
+
}
|
123
|
+
|
124
|
+
/**
|
125
|
+
* Get key-value from the urlState
|
126
|
+
* @param {string} key
|
127
|
+
* @return {string}
|
128
|
+
*/
|
129
|
+
getUrlParam(key) {
|
130
|
+
return this.urlState[key];
|
131
|
+
}
|
132
|
+
|
133
|
+
/**
|
134
|
+
* Push URL params to addressbar
|
135
|
+
*/
|
136
|
+
pushToAddressBar() {
|
137
|
+
const urlStrPath = this.urlStateToUrlString(this.urlState);
|
138
|
+
const concatenatedPath = urlStrPath !== '/' ? urlStrPath : '';
|
139
|
+
if (this.urlMode == 'history') {
|
140
|
+
if (!window.history || !window.history.replaceState) {
|
141
|
+
this.options.urlMode = 'hash';
|
142
|
+
} else {
|
143
|
+
const newUrlPath = `${this.urlHistoryBasePath}${concatenatedPath}`.trim().replace(/(\/+)/g, '/');
|
144
|
+
try {
|
145
|
+
window.history.replaceState({}, null, newUrlPath);
|
146
|
+
} catch (e) {
|
147
|
+
// DOMException on Chrome when in sandboxed iframe
|
148
|
+
this.urlMode = 'hash';
|
149
|
+
}
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
if (this.urlMode == 'hash') {
|
154
|
+
window.location.replace('#' + concatenatedPath);
|
155
|
+
}
|
156
|
+
this.oldLocationHash = urlStrPath;
|
157
|
+
}
|
158
|
+
|
159
|
+
/**
|
160
|
+
* Get the url and check if it has changed
|
161
|
+
* If it was changeed, update the urlState
|
162
|
+
*/
|
163
|
+
listenForHashChanges() {
|
164
|
+
this.oldLocationHash = window.location.hash.substr(1);
|
165
|
+
if (this.urlLocationPollId) {
|
166
|
+
clearInterval(this.urlLocationPollId);
|
167
|
+
this.urlLocationPollId = null;
|
168
|
+
}
|
169
|
+
|
170
|
+
// check if the URL changes
|
171
|
+
const updateHash = () => {
|
172
|
+
const newFragment = window.location.hash.substr(1);
|
173
|
+
const hasFragmentChange = newFragment != this.oldLocationHash;
|
174
|
+
|
175
|
+
if (!hasFragmentChange) { return; }
|
176
|
+
|
177
|
+
this.urlState = this.urlStringToUrlState(newFragment);
|
178
|
+
};
|
179
|
+
this.urlLocationPollId = setInterval(updateHash, 500);
|
180
|
+
}
|
181
|
+
|
182
|
+
/**
|
183
|
+
* Will read either the hash or URL and return the bookreader fragment
|
184
|
+
*/
|
185
|
+
pullFromAddressBar (location = window.location) {
|
186
|
+
const path = this.urlMode === 'history'
|
187
|
+
? (location.pathname.substr(this.urlHistoryBasePath.length) + location.search)
|
188
|
+
: location.hash.substr(1);
|
189
|
+
this.urlState = this.urlStringToUrlState(path);
|
190
|
+
}
|
191
|
+
}
|
@@ -1,4 +1,7 @@
|
|
1
1
|
/* global BookReader */
|
2
|
+
|
3
|
+
import { UrlPlugin } from "./UrlPlugin";
|
4
|
+
|
2
5
|
/**
|
3
6
|
* Plugin for URL management in BookReader
|
4
7
|
* Note read more about the url "fragment" here:
|
@@ -22,7 +25,7 @@ jQuery.extend(BookReader.defaultOptions, {
|
|
22
25
|
urlHistoryBasePath: '/',
|
23
26
|
|
24
27
|
/** Only these params will be reflected onto the URL */
|
25
|
-
urlTrackedParams: ['page', 'search', 'mode', 'region', 'highlight'],
|
28
|
+
urlTrackedParams: ['page', 'search', 'mode', 'region', 'highlight', 'view'],
|
26
29
|
|
27
30
|
/** If true, don't update the URL when `page == n0 (eg "/page/n0")` */
|
28
31
|
urlTrackIndex0: false,
|
@@ -50,7 +53,7 @@ BookReader.prototype.init = (function(super_) {
|
|
50
53
|
this.bind(BookReader.eventNames.PostInit, () => {
|
51
54
|
const { updateWindowTitle, urlMode } = this.options;
|
52
55
|
if (updateWindowTitle) {
|
53
|
-
document.title = this.shortTitle(50);
|
56
|
+
document.title = this.shortTitle(this.bookTitle, 50);
|
54
57
|
}
|
55
58
|
if (urlMode === 'hash') {
|
56
59
|
this.urlStartLocationPolling();
|
@@ -58,7 +61,7 @@ BookReader.prototype.init = (function(super_) {
|
|
58
61
|
});
|
59
62
|
|
60
63
|
this.bind(BookReader.eventNames.fragmentChange,
|
61
|
-
this.urlUpdateFragment.bind(this)
|
64
|
+
this.urlUpdateFragment.bind(this),
|
62
65
|
);
|
63
66
|
}
|
64
67
|
super_.call(this);
|
@@ -86,7 +89,7 @@ BookReader.prototype.urlStartLocationPolling = function() {
|
|
86
89
|
this.oldLocationHash = this.urlReadFragment();
|
87
90
|
|
88
91
|
if (this.locationPollId) {
|
89
|
-
clearInterval(this.
|
92
|
+
clearInterval(this.locationPollId);
|
90
93
|
this.locationPollId = null;
|
91
94
|
}
|
92
95
|
|
@@ -103,14 +106,14 @@ BookReader.prototype.urlStartLocationPolling = function() {
|
|
103
106
|
this.trigger(BookReader.eventNames.stop);
|
104
107
|
if (this.animating) {
|
105
108
|
// Queue change if animating
|
106
|
-
|
109
|
+
this._plugins.autoplay?.stop();
|
107
110
|
this.animationFinishedCallback = updateParams;
|
108
111
|
} else {
|
109
112
|
// update immediately
|
110
113
|
updateParams();
|
111
114
|
}
|
112
115
|
this.oldUserHash = newFragment;
|
113
|
-
}
|
116
|
+
};
|
114
117
|
|
115
118
|
this.locationPollId = setInterval(updateHash, 500);
|
116
119
|
};
|
@@ -121,7 +124,7 @@ BookReader.prototype.urlStartLocationPolling = function() {
|
|
121
124
|
*/
|
122
125
|
BookReader.prototype.urlUpdateFragment = function() {
|
123
126
|
const allParams = this.paramsFromCurrent();
|
124
|
-
const {
|
127
|
+
const { urlTrackIndex0, urlTrackedParams } = this.options;
|
125
128
|
|
126
129
|
if (!urlTrackIndex0
|
127
130
|
&& (typeof(allParams.index) !== 'undefined')
|
@@ -134,32 +137,39 @@ BookReader.prototype.urlUpdateFragment = function() {
|
|
134
137
|
if (paramName in allParams) {
|
135
138
|
validParams[paramName] = allParams[paramName];
|
136
139
|
}
|
137
|
-
return validParams
|
140
|
+
return validParams;
|
138
141
|
}, {});
|
139
142
|
|
140
|
-
const newFragment = this.fragmentFromParams(params, urlMode);
|
143
|
+
const newFragment = this.fragmentFromParams(params, this.options.urlMode);
|
141
144
|
const currFragment = this.urlReadFragment();
|
142
145
|
const currQueryString = this.getLocationSearch();
|
143
|
-
const newQueryString = this.queryStringFromParams(params, currQueryString, urlMode);
|
146
|
+
const newQueryString = this.queryStringFromParams(params, currQueryString, this.options.urlMode);
|
144
147
|
if (currFragment === newFragment && currQueryString === newQueryString) {
|
145
148
|
return;
|
146
149
|
}
|
147
150
|
|
148
|
-
if (urlMode === 'history') {
|
149
|
-
if (window.history
|
151
|
+
if (this.options.urlMode === 'history') {
|
152
|
+
if (!window.history || !window.history.replaceState) {
|
153
|
+
this.options.urlMode = 'hash';
|
154
|
+
} else {
|
150
155
|
const baseWithoutSlash = this.options.urlHistoryBasePath.replace(/\/+$/, '');
|
151
156
|
const newFragmentWithSlash = newFragment === '' ? '' : `/${newFragment}`;
|
152
157
|
|
153
158
|
const newUrlPath = `${baseWithoutSlash}${newFragmentWithSlash}${newQueryString}`;
|
154
|
-
|
155
|
-
|
156
|
-
|
159
|
+
try {
|
160
|
+
window.history.replaceState({}, null, newUrlPath);
|
161
|
+
this.oldLocationHash = newFragment + newQueryString;
|
162
|
+
} catch (e) {
|
163
|
+
// DOMException on Chrome when in sandboxed iframe
|
164
|
+
this.options.urlMode = 'hash';
|
165
|
+
}
|
157
166
|
}
|
158
|
-
}
|
167
|
+
}
|
168
|
+
|
169
|
+
if (this.options.urlMode === 'hash') {
|
159
170
|
const newQueryStringSearch = this.urlParamsFiltersOnlySearch(this.readQueryString());
|
160
171
|
window.location.replace('#' + newFragment + newQueryStringSearch);
|
161
172
|
this.oldLocationHash = newFragment + newQueryStringSearch;
|
162
|
-
|
163
173
|
}
|
164
174
|
};
|
165
175
|
|
@@ -173,7 +183,7 @@ BookReader.prototype.urlUpdateFragment = function() {
|
|
173
183
|
BookReader.prototype.urlParamsFiltersOnlySearch = function(url) {
|
174
184
|
const params = new URLSearchParams(url);
|
175
185
|
return params.has('q') ? `?${new URLSearchParams({ q: params.get('q') })}` : '';
|
176
|
-
}
|
186
|
+
};
|
177
187
|
|
178
188
|
|
179
189
|
/**
|
@@ -196,3 +206,22 @@ BookReader.prototype.urlReadFragment = function() {
|
|
196
206
|
BookReader.prototype.urlReadHashFragment = function() {
|
197
207
|
return window.location.hash.substr(1);
|
198
208
|
};
|
209
|
+
export class BookreaderUrlPlugin extends BookReader {
|
210
|
+
init() {
|
211
|
+
if (this.options.enableUrlPlugin) {
|
212
|
+
this.urlPlugin = new UrlPlugin(this.options);
|
213
|
+
this.bind(BookReader.eventNames.PostInit, () => {
|
214
|
+
const { urlMode } = this.options;
|
215
|
+
|
216
|
+
if (urlMode === 'hash') {
|
217
|
+
this.urlPlugin.listenForHashChanges();
|
218
|
+
}
|
219
|
+
});
|
220
|
+
}
|
221
|
+
|
222
|
+
super.init();
|
223
|
+
}
|
224
|
+
}
|
225
|
+
|
226
|
+
window.BookReader = BookreaderUrlPlugin;
|
227
|
+
export default BookreaderUrlPlugin;
|
@@ -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/src/util/strings.js
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
* @param {StringWithVars|String} template
|
10
10
|
* @param { {[varName: string]: { toString: () => string} } } vars
|
11
11
|
* @param { {[varName: string]: { toString: () => string} } } [overrides]
|
12
|
+
* @returns {StringWithVars|string}
|
12
13
|
*/
|
13
14
|
export function applyVariables(template, vars, overrides = {}, possibleFilters = APPLY_FILTERS) {
|
14
15
|
return template?.replace(/\{\{([^}]*?)\}\}/g, ($0, $1) => {
|
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,13 +1,16 @@
|
|
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
|
-
const FLIP_SPEED =
|
6
|
-
const
|
5
|
+
const FLIP_SPEED = 200;
|
6
|
+
const FLIP_DELAY = 500;
|
7
7
|
|
8
|
-
fixture `Autoplay plugin`.page `${
|
8
|
+
fixture `Autoplay plugin`.page `${params.baseUrl}/BookReaderDemo/demo-internetarchive.html?ocaid=goody&autoflip=1&flipSpeed=${FLIP_SPEED}&flipDelay=${FLIP_DELAY}`;
|
9
9
|
|
10
10
|
test('page auto-advances after allotted flip speed and delay', async t => {
|
11
|
-
|
12
|
-
await t.expect(getLocationHref()).
|
11
|
+
// Flips from cover, to #page/n1 to #page/n3, etc
|
12
|
+
await t.expect(getLocationHref()).notMatch(/page\/n\d+/);
|
13
|
+
await t.wait(2 * (FLIP_SPEED + FLIP_DELAY) + 500);
|
14
|
+
// Don't check for a specific page; initial load time can vary
|
15
|
+
await t.expect(getLocationHref()).match(/page\/n\d+/);
|
13
16
|
});
|
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
|
});
|