Merge pull request #10100 from Snuffleupagus/findbarclose

Clear all find highlights when the findbar is closed (issue 7468)
This commit is contained in:
Tim van der Meij 2018-09-30 15:35:00 +02:00 committed by GitHub
commit d0620ec894
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 79 additions and 11 deletions

View File

@ -169,20 +169,27 @@ class MozL10n {
'findhighlightallchange',
'findcasesensitivitychange',
'findentirewordchange',
'findbarclose',
];
let handleEvent = function(evt) {
let handleEvent = function({ type, detail, }) {
if (!PDFViewerApplication.initialized) {
return;
}
if (type === 'findbarclose') {
PDFViewerApplication.eventBus.dispatch('findbarclose', {
source: window,
});
return;
}
PDFViewerApplication.eventBus.dispatch('find', {
source: window,
type: evt.type.substring('find'.length),
query: evt.detail.query,
type: type.substring('find'.length),
query: detail.query,
phraseSearch: true,
caseSensitive: !!evt.detail.caseSensitive,
entireWord: !!evt.detail.entireWord,
highlightAll: !!evt.detail.highlightAll,
findPrevious: !!evt.detail.findPrevious,
caseSensitive: !!detail.caseSensitive,
entireWord: !!detail.entireWord,
highlightAll: !!detail.highlightAll,
findPrevious: !!detail.findPrevious,
});
};

View File

@ -216,7 +216,8 @@ class PDFFindBar {
this.opened = false;
this.toggleButton.classList.remove('toggled');
this.bar.classList.add('hidden');
this.findController.active = false;
this.eventBus.dispatch('findbarclose', { source: this, });
}
toggle() {

View File

@ -53,11 +53,24 @@ class PDFFindController {
this.reset();
eventBus.on('findbarclose', () => {
this._highlightMatches = false;
eventBus.dispatch('updatetextlayermatches', {
source: this,
pageIndex: -1,
});
});
// Compile the regular expression for text normalization once.
const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join('');
this._normalizationRegex = new RegExp(`[${replace}]`, 'g');
}
get highlightMatches() {
return this._highlightMatches;
}
get pageMatches() {
return this._pageMatches;
}
@ -75,7 +88,7 @@ class PDFFindController {
}
reset() {
this.active = false; // If active, find results will be highlighted.
this._highlightMatches = false;
this._pageMatches = [];
this._pageMatchesLength = null;
this._state = null;
@ -353,7 +366,7 @@ class PDFFindController {
const currentPageIndex = this._pdfViewer.currentPageNumber - 1;
const numPages = this._pdfViewer.pagesCount;
this.active = true;
this._highlightMatches = true;
if (this._dirtyMatch) {
// Need to recalculate the matches, reset everything.

View File

@ -260,6 +260,8 @@ class PDFPageView {
}
cancelRendering(keepAnnotations = false) {
const renderingState = this.renderingState;
if (this.paintTask) {
this.paintTask.cancel();
this.paintTask = null;
@ -275,6 +277,14 @@ class PDFPageView {
this.annotationLayer.cancel();
this.annotationLayer = null;
}
if (renderingState !== RenderingStates.INITIAL) {
this.eventBus.dispatch('pagecancelled', {
source: this,
pageNumber: this.id,
renderingState,
});
}
}
cssTransform(target, redrawAnnotations = false) {

View File

@ -56,6 +56,9 @@ class TextLayerBuilder {
this.textLayerRenderTask = null;
this.enhanceTextSelection = enhanceTextSelection;
this._boundEvents = Object.create(null);
this._bindEvents();
this._bindMouse();
}
@ -314,7 +317,7 @@ class TextLayerBuilder {
clearedUntilDivIdx = match.end.divIdx + 1;
}
if (this.findController === null || !this.findController.active) {
if (!this.findController || !this.findController.highlightMatches) {
return;
}
@ -331,6 +334,40 @@ class TextLayerBuilder {
this.renderMatches(this.matches);
}
/**
* @private
*/
_bindEvents() {
const { eventBus, _boundEvents, } = this;
_boundEvents.pageCancelled = (evt) => {
if (evt.pageNumber !== this.pageNumber) {
return;
}
if (this.textLayerRenderTask) {
console.error('TextLayerBuilder._bindEvents: `this.cancel()` should ' +
'have been called when the page was reset, or rendering cancelled.');
return;
}
// Ensure that all event listeners are cleaned up when the page is reset,
// since re-rendering will create new `TextLayerBuilder` instances and the
// number of (stale) event listeners would otherwise grow without bound.
for (const name in _boundEvents) {
eventBus.off(name.toLowerCase(), _boundEvents[name]);
delete _boundEvents[name];
}
};
_boundEvents.updateTextLayerMatches = (evt) => {
if (evt.pageIndex !== -1) {
return;
}
this.updateMatches();
};
eventBus.on('pagecancelled', _boundEvents.pageCancelled);
eventBus.on('updatetextlayermatches', _boundEvents.updateTextLayerMatches);
}
/**
* Improves text selection by adding an additional div where the mouse was
* clicked. This reduces flickering of the content if the mouse is slowly