Ensure that matches are not scrolled into after the findbar has been closed (PR 10100 follow-up)
Despite all highlighted matches being removed in response to the 'findbarclose' event, there's a risk that a match could still be scrolled into view *after* the findbar has been closed[1]. Hence we need to ensure that long running searches, particularily those happening in large and/or slow loading documents[2], are ignored as well. --- [1] The match is hidden, as expected, but the document could still scroll unexpectedly. [2] Large documents loaded with `disableAutoFetch = true` and `disableStream = true` set are particularily susceptible to this issue.
This commit is contained in:
parent
27b21f2558
commit
64d75c32bf
@ -112,10 +112,10 @@ class PDFFindController {
|
||||
this._updateUIState(FindState.PENDING);
|
||||
|
||||
this._firstPageCapability.promise.then(() => {
|
||||
// If the document was closed before searching began, or if the search
|
||||
// operation was relevant for a previously opened document, do nothing.
|
||||
if (!this._pdfDocument ||
|
||||
(pdfDocument && this._pdfDocument !== pdfDocument)) {
|
||||
// If the document was closed before searching began, or if the search
|
||||
// operation was relevant for a previously opened document, do nothing.
|
||||
return;
|
||||
}
|
||||
this._extractText();
|
||||
@ -150,6 +150,7 @@ class PDFFindController {
|
||||
this._offset = { // Where the find algorithm currently is in the document.
|
||||
pageIdx: null,
|
||||
matchIdx: null,
|
||||
wrapped: false,
|
||||
};
|
||||
this._extractTextPromises = [];
|
||||
this._pageContents = []; // Stores the text for each page.
|
||||
@ -409,6 +410,7 @@ class PDFFindController {
|
||||
this._selected.pageIdx = this._selected.matchIdx = -1;
|
||||
this._offset.pageIdx = currentPageIndex;
|
||||
this._offset.matchIdx = null;
|
||||
this._offset.wrapped = false;
|
||||
this._resumePageIdx = null;
|
||||
this._pageMatches.length = 0;
|
||||
this._pageMatchesLength = null;
|
||||
@ -552,17 +554,27 @@ class PDFFindController {
|
||||
// matches (from the UI) is async too such that the 'updatetextlayermatches'
|
||||
// events will always be dispatched in the expected order.
|
||||
this._firstPageCapability.promise.then(() => {
|
||||
// Only update the UI if the document is open, and is the current one.
|
||||
if (!this._pdfDocument ||
|
||||
(pdfDocument && this._pdfDocument !== pdfDocument)) {
|
||||
// Only update the UI if the document is open, and is the current one.
|
||||
return;
|
||||
}
|
||||
// Ensure that a pending, not yet started, search operation is aborted.
|
||||
if (this._findTimeout) {
|
||||
clearTimeout(this._findTimeout);
|
||||
this._findTimeout = null;
|
||||
// Avoid the UI being in a pending state if the findbar is re-opened.
|
||||
this._updateUIState(FindState.FOUND);
|
||||
}
|
||||
// Abort any long running searches, to avoid a match being scrolled into
|
||||
// view *after* the findbar has been closed. In this case `this._offset`
|
||||
// will most likely differ from `this._selected`, hence we also ensure
|
||||
// that any new search operation will always start with a clean slate.
|
||||
if (this._resumePageIdx) {
|
||||
this._resumePageIdx = null;
|
||||
this._dirtyMatch = true;
|
||||
}
|
||||
// Avoid the UI being in a pending state when the findbar is re-opened.
|
||||
this._updateUIState(FindState.FOUND);
|
||||
|
||||
this._highlightMatches = false;
|
||||
this._updateAllPages(); // Wipe out any previously highlighted matches.
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user