Dbrant has uploaded a new change for review.
https://gerrit.wikimedia.org/r/257884
Change subject: Prevent crash due to non-lead-section index mismatch.
......................................................................
Prevent crash due to non-lead-section index mismatch.
1) This fixes an actual possible condition where this crash occurs:
- A saved page is loaded, and the LoadSavedPageTask takes an abnormally
long time
- The user presses Back, with the previous page having *more* sections
than the saved page
- The LoadSavedPageTask completes in the middle of the WebView being
populated with the previous page, replacing the current Page object with
a Page that has fewer sections than the current sequence chain expects.
2) This also explicitly patches up the crash, by verifying that the index
is within the size of the current page sections.
Bug: T112519
Change-Id: Ifd168f7babc246a465762c98bc651ce716a0a4b1
---
M app/src/main/java/org/wikipedia/page/JsonPageLoadStrategy.java
M app/src/main/java/org/wikipedia/savedpages/LoadSavedPageTask.java
2 files changed, 15 insertions(+), 5 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/84/257884/1
diff --git a/app/src/main/java/org/wikipedia/page/JsonPageLoadStrategy.java
b/app/src/main/java/org/wikipedia/page/JsonPageLoadStrategy.java
index ac9b1eb..19f2e73 100644
--- a/app/src/main/java/org/wikipedia/page/JsonPageLoadStrategy.java
+++ b/app/src/main/java/org/wikipedia/page/JsonPageLoadStrategy.java
@@ -445,12 +445,10 @@
}
public void loadSavedPage(final ErrorCallback errorCallback) {
- new LoadSavedPageTask(model.getTitle()) {
+ new LoadSavedPageTask(model.getTitle(), sequenceNumber.get()) {
@Override
public void onFinish(Page result) {
- // have we been unwittingly detached from our Activity?
- if (!fragment.isAdded()) {
- Log.d("PageFragment", "Detached from activity, so stopping
update.");
+ if (!fragment.isAdded() ||
!sequenceNumber.inSync(getSequence())) {
return;
}
@@ -650,7 +648,9 @@
activity.updateProgressBar(true, false,
PageActivity.PROGRESS_BAR_MAX_VALUE / model.getPage()
.getSections().size() * index);
-
+ if (index >= model.getPage().getSections().size()) {
+ return;
+ }
try {
final Page page = model.getPage();
JSONObject wrapper = new JSONObject();
diff --git a/app/src/main/java/org/wikipedia/savedpages/LoadSavedPageTask.java
b/app/src/main/java/org/wikipedia/savedpages/LoadSavedPageTask.java
index 3320349..489d260 100644
--- a/app/src/main/java/org/wikipedia/savedpages/LoadSavedPageTask.java
+++ b/app/src/main/java/org/wikipedia/savedpages/LoadSavedPageTask.java
@@ -6,10 +6,16 @@
public class LoadSavedPageTask extends SaneAsyncTask<Page> {
private final PageTitle title;
+ private final int sequence;
public LoadSavedPageTask(PageTitle title) {
+ this(title, 0);
+ }
+
+ public LoadSavedPageTask(PageTitle title, int sequence) {
super(SINGLE_THREAD);
this.title = title;
+ this.sequence = sequence;
}
@Override
@@ -17,4 +23,8 @@
SavedPage savedPage = new SavedPage(title);
return savedPage.readFromFileSystem();
}
+
+ public int getSequence() {
+ return sequence;
+ }
}
--
To view, visit https://gerrit.wikimedia.org/r/257884
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifd168f7babc246a465762c98bc651ce716a0a4b1
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits