diff --git a/navigator-html-injectables/package.json b/navigator-html-injectables/package.json
index 385c8df1..a2296056 100644
--- a/navigator-html-injectables/package.json
+++ b/navigator-html-injectables/package.json
@@ -1,6 +1,6 @@
{
"name": "@readium/navigator-html-injectables",
- "version": "2.0.0-beta.4",
+ "version": "2.0.0-beta.5",
"type": "module",
"description": "An embeddable solution for connecting frames of HTML publications with a Readium Navigator",
"author": "readium",
diff --git a/navigator-html-injectables/src/modules/snapper/ColumnSnapper.ts b/navigator-html-injectables/src/modules/snapper/ColumnSnapper.ts
index 8f464ea7..0f245290 100644
--- a/navigator-html-injectables/src/modules/snapper/ColumnSnapper.ts
+++ b/navigator-html-injectables/src/modules/snapper/ColumnSnapper.ts
@@ -39,6 +39,8 @@ export class ColumnSnapper extends Snapper {
}
reportProgress() {
+ // Contrary to ScrollTop, Android slightly adds to scrollX
+ // So we do not need to round it up
const scrollX = this.wnd.scrollX;
const scrollWidth = this.cachedScrollWidth;
const progress = Math.max(0, Math.min(1, scrollX / scrollWidth));
diff --git a/navigator-html-injectables/src/modules/snapper/ScrollSnapper.ts b/navigator-html-injectables/src/modules/snapper/ScrollSnapper.ts
index c6f5daff..20cfb6ae 100644
--- a/navigator-html-injectables/src/modules/snapper/ScrollSnapper.ts
+++ b/navigator-html-injectables/src/modules/snapper/ScrollSnapper.ts
@@ -20,10 +20,15 @@ export class ScrollSnapper extends Snapper {
}
private reportProgress() {
- const scrollTop = this.doc().scrollTop;
+ // We have to round up the scroll position because
+ // Android may never reach 100% of the scroll height
+ // due to the way it rounds scrollTop…
+ const scrollTop = Math.ceil(this.doc().scrollTop);
const scrollHeight = this.doc().scrollHeight;
+ const viewportHeight = this.wnd.innerHeight;
const progress = Math.max(0, Math.min(1, scrollTop / scrollHeight));
- const viewportEnd = Math.max(0, Math.min(1, (scrollTop + this.wnd.innerHeight) / scrollHeight));
+ const viewportEnd = Math.max(0, Math.min(1, (scrollTop + viewportHeight) / scrollHeight));
+
this.comms.send("progress", {
start: progress,
end: viewportEnd
@@ -78,8 +83,13 @@ export class ScrollSnapper extends Snapper {
// Only the content at the start of the document,
// whose height is the viewport height, will be rendered.
const currentScroll = this.doc().scrollTop;
- this.doc().scrollTop = currentScroll + 1;
+ if (currentScroll > 1) {
+ this.doc().scrollTop = currentScroll - 1;
+ } else {
+ this.doc().scrollTop = currentScroll + 1;
+ }
this.doc().scrollTop = currentScroll;
+
});
comms.register("go_progression", ScrollSnapper.moduleName, (data, ack) => {
diff --git a/navigator/package.json b/navigator/package.json
index 0fdf05bc..86888ae2 100644
--- a/navigator/package.json
+++ b/navigator/package.json
@@ -1,6 +1,6 @@
{
"name": "@readium/navigator",
- "version": "2.0.0-beta.11",
+ "version": "2.0.0-beta.12",
"type": "module",
"description": "Next generation SDK for publications in Web Apps",
"author": "readium",