Ensure that PDFFindController_reset
actually resets *all* state (issue 7034)
To reduce code duplication, the initialization code now uses the `reset` method. Also, this patch moves `charactersToNormalize` out of `PDFFindController`, since it seemed better suited to be a "constant".
This commit is contained in:
parent
2b813c0ca4
commit
e7d039dbce
@ -26,51 +26,34 @@ var FindStates = {
|
|||||||
var FIND_SCROLL_OFFSET_TOP = -50;
|
var FIND_SCROLL_OFFSET_TOP = -50;
|
||||||
var FIND_SCROLL_OFFSET_LEFT = -400;
|
var FIND_SCROLL_OFFSET_LEFT = -400;
|
||||||
|
|
||||||
|
var CHARACTERS_TO_NORMALIZE = {
|
||||||
|
'\u2018': '\'', // Left single quotation mark
|
||||||
|
'\u2019': '\'', // Right single quotation mark
|
||||||
|
'\u201A': '\'', // Single low-9 quotation mark
|
||||||
|
'\u201B': '\'', // Single high-reversed-9 quotation mark
|
||||||
|
'\u201C': '"', // Left double quotation mark
|
||||||
|
'\u201D': '"', // Right double quotation mark
|
||||||
|
'\u201E': '"', // Double low-9 quotation mark
|
||||||
|
'\u201F': '"', // Double high-reversed-9 quotation mark
|
||||||
|
'\u00BC': '1/4', // Vulgar fraction one quarter
|
||||||
|
'\u00BD': '1/2', // Vulgar fraction one half
|
||||||
|
'\u00BE': '3/4', // Vulgar fraction three quarters
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides "search" or "find" functionality for the PDF.
|
* Provides "search" or "find" functionality for the PDF.
|
||||||
* This object actually performs the search for a given string.
|
* This object actually performs the search for a given string.
|
||||||
*/
|
*/
|
||||||
var PDFFindController = (function PDFFindControllerClosure() {
|
var PDFFindController = (function PDFFindControllerClosure() {
|
||||||
function PDFFindController(options) {
|
function PDFFindController(options) {
|
||||||
this.startedTextExtraction = false;
|
|
||||||
this.extractTextPromises = [];
|
|
||||||
this.pendingFindMatches = Object.create(null);
|
|
||||||
this.active = false; // If active, find results will be highlighted.
|
|
||||||
this.pageContents = []; // Stores the text for each page.
|
|
||||||
this.pageMatches = [];
|
|
||||||
this.matchCount = 0;
|
|
||||||
this.selected = { // Currently selected match.
|
|
||||||
pageIdx: -1,
|
|
||||||
matchIdx: -1
|
|
||||||
};
|
|
||||||
this.offset = { // Where the find algorithm currently is in the document.
|
|
||||||
pageIdx: null,
|
|
||||||
matchIdx: null
|
|
||||||
};
|
|
||||||
this.pagesToSearch = null;
|
|
||||||
this.resumePageIdx = null;
|
|
||||||
this.state = null;
|
|
||||||
this.dirtyMatch = false;
|
|
||||||
this.findTimeout = null;
|
|
||||||
this.pdfViewer = options.pdfViewer || null;
|
this.pdfViewer = options.pdfViewer || null;
|
||||||
this.integratedFind = options.integratedFind || false;
|
this.integratedFind = options.integratedFind || false;
|
||||||
this.charactersToNormalize = {
|
|
||||||
'\u2018': '\'', // Left single quotation mark
|
|
||||||
'\u2019': '\'', // Right single quotation mark
|
|
||||||
'\u201A': '\'', // Single low-9 quotation mark
|
|
||||||
'\u201B': '\'', // Single high-reversed-9 quotation mark
|
|
||||||
'\u201C': '"', // Left double quotation mark
|
|
||||||
'\u201D': '"', // Right double quotation mark
|
|
||||||
'\u201E': '"', // Double low-9 quotation mark
|
|
||||||
'\u201F': '"', // Double high-reversed-9 quotation mark
|
|
||||||
'\u00BC': '1/4', // Vulgar fraction one quarter
|
|
||||||
'\u00BD': '1/2', // Vulgar fraction one half
|
|
||||||
'\u00BE': '3/4', // Vulgar fraction three quarters
|
|
||||||
};
|
|
||||||
this.findBar = options.findBar || null;
|
this.findBar = options.findBar || null;
|
||||||
|
|
||||||
// Compile the regular expression for text normalization once
|
this.reset();
|
||||||
var replace = Object.keys(this.charactersToNormalize).join('');
|
|
||||||
|
// Compile the regular expression for text normalization once.
|
||||||
|
var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join('');
|
||||||
this.normalizationRegex = new RegExp('[' + replace + ']', 'g');
|
this.normalizationRegex = new RegExp('[' + replace + ']', 'g');
|
||||||
|
|
||||||
var events = [
|
var events = [
|
||||||
@ -79,10 +62,6 @@ var PDFFindController = (function PDFFindControllerClosure() {
|
|||||||
'findhighlightallchange',
|
'findhighlightallchange',
|
||||||
'findcasesensitivitychange'
|
'findcasesensitivitychange'
|
||||||
];
|
];
|
||||||
|
|
||||||
this.firstPagePromise = new Promise(function (resolve) {
|
|
||||||
this.resolveFirstPage = resolve;
|
|
||||||
}.bind(this));
|
|
||||||
this.handleEvent = this.handleEvent.bind(this);
|
this.handleEvent = this.handleEvent.bind(this);
|
||||||
|
|
||||||
for (var i = 0, len = events.length; i < len; i++) {
|
for (var i = 0, len = events.length; i < len; i++) {
|
||||||
@ -98,13 +77,33 @@ var PDFFindController = (function PDFFindControllerClosure() {
|
|||||||
reset: function PDFFindController_reset() {
|
reset: function PDFFindController_reset() {
|
||||||
this.startedTextExtraction = false;
|
this.startedTextExtraction = false;
|
||||||
this.extractTextPromises = [];
|
this.extractTextPromises = [];
|
||||||
this.active = false;
|
this.pendingFindMatches = Object.create(null);
|
||||||
|
this.active = false; // If active, find results will be highlighted.
|
||||||
|
this.pageContents = []; // Stores the text for each page.
|
||||||
|
this.pageMatches = [];
|
||||||
|
this.matchCount = 0;
|
||||||
|
this.selected = { // Currently selected match.
|
||||||
|
pageIdx: -1,
|
||||||
|
matchIdx: -1
|
||||||
|
};
|
||||||
|
this.offset = { // Where the find algorithm currently is in the document.
|
||||||
|
pageIdx: null,
|
||||||
|
matchIdx: null
|
||||||
|
};
|
||||||
|
this.pagesToSearch = null;
|
||||||
|
this.resumePageIdx = null;
|
||||||
|
this.state = null;
|
||||||
|
this.dirtyMatch = false;
|
||||||
|
this.findTimeout = null;
|
||||||
|
|
||||||
|
this.firstPagePromise = new Promise(function (resolve) {
|
||||||
|
this.resolveFirstPage = resolve;
|
||||||
|
}.bind(this));
|
||||||
},
|
},
|
||||||
|
|
||||||
normalize: function PDFFindController_normalize(text) {
|
normalize: function PDFFindController_normalize(text) {
|
||||||
var self = this;
|
|
||||||
return text.replace(this.normalizationRegex, function (ch) {
|
return text.replace(this.normalizationRegex, function (ch) {
|
||||||
return self.charactersToNormalize[ch];
|
return CHARACTERS_TO_NORMALIZE[ch];
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -526,6 +526,8 @@ var PDFViewerApplication = {
|
|||||||
this.pdfLinkService.setDocument(null, null);
|
this.pdfLinkService.setDocument(null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.findController.reset();
|
||||||
|
|
||||||
if (typeof PDFBug !== 'undefined') {
|
if (typeof PDFBug !== 'undefined') {
|
||||||
PDFBug.cleanup();
|
PDFBug.cleanup();
|
||||||
}
|
}
|
||||||
@ -804,8 +806,6 @@ var PDFViewerApplication = {
|
|||||||
var self = this;
|
var self = this;
|
||||||
scale = scale || UNKNOWN_SCALE;
|
scale = scale || UNKNOWN_SCALE;
|
||||||
|
|
||||||
this.findController.reset();
|
|
||||||
|
|
||||||
this.pdfDocument = pdfDocument;
|
this.pdfDocument = pdfDocument;
|
||||||
|
|
||||||
this.pdfDocumentProperties.setDocumentAndUrl(pdfDocument, this.url);
|
this.pdfDocumentProperties.setDocumentAndUrl(pdfDocument, this.url);
|
||||||
|
Loading…
Reference in New Issue
Block a user