From b8ad68af2591d56ec37fc082ad1af425ad4eb66d Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Tue, 3 Nov 2015 14:20:34 -0600 Subject: [PATCH] Non/less flashing text layer during selection. --- web/text_layer_builder.css | 18 ++++++++++++++ web/text_layer_builder.js | 49 +++++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/web/text_layer_builder.css b/web/text_layer_builder.css index f5a55df10..dd62aa6ae 100644 --- a/web/text_layer_builder.css +++ b/web/text_layer_builder.css @@ -61,3 +61,21 @@ .textLayer ::selection { background: rgb(0,0,255); } .textLayer ::-moz-selection { background: rgb(0,0,255); } + +.textLayer .endOfContent { + display: block; + position: absolute; + left: 0px; + top: 100%; + right: 0px; + bottom: 0px; + z-index: -1; + cursor: default; + -webkit-user-select: none; + -ms-user-select: none; + -moz-user-select: none; +} + +.textLayer .endOfContent.active { + top: 0px; +} diff --git a/web/text_layer_builder.js b/web/text_layer_builder.js index afb843005..1986e7c3d 100644 --- a/web/text_layer_builder.js +++ b/web/text_layer_builder.js @@ -51,12 +51,17 @@ var TextLayerBuilder = (function TextLayerBuilderClosure() { this.viewport = options.viewport; this.textDivs = []; this.findController = options.findController || null; + this._bindMouse(); } TextLayerBuilder.prototype = { _finishRendering: function TextLayerBuilder_finishRendering() { this.renderingDone = true; + var endOfContent = document.createElement('div'); + endOfContent.className = 'endOfContent'; + this.textLayerDiv.appendChild(endOfContent); + var event = document.createEvent('CustomEvent'); event.initCustomEvent('textlayerrendered', true, true, { pageNumber: this.pageNumber @@ -392,7 +397,49 @@ var TextLayerBuilder = (function TextLayerBuilderClosure() { this.matches = this.convertMatches(this.findController === null ? [] : (this.findController.pageMatches[this.pageIdx] || [])); this.renderMatches(this.matches); - } + }, + + /** + * Fixes text selection: adds additional div where mouse was clicked. + * This reduces flickering of the content if mouse slowly dragged down/up. + * @private + */ + _bindMouse: function TextLayerBuilder_bindMouse() { + var div = this.textLayerDiv; + div.addEventListener('mousedown', function (e) { + var end = div.querySelector('.endOfContent'); + if (!end) { + return; + } +//#if !(MOZCENTRAL || FIREFOX) + // On non-Firefox browsers, the selection will feel better if the height + // of the endOfContent div will be adjusted to start at mouse click + // location -- this will avoid flickering when selections moves up. + // However it does not work when selection started on empty space. + var adjustTop = e.target !== div; +//#if GENERIC + adjustTop = adjustTop && window.getComputedStyle(end). + getPropertyValue('-moz-user-select') !== 'none'; +//#endif + if (adjustTop) { + var divBounds = div.getBoundingClientRect(); + var r = Math.max(0, (e.pageY - divBounds.top) / divBounds.height); + end.style.top = (r * 100).toFixed(2) + '%'; + } +//#endif + end.classList.add('active'); + }); + div.addEventListener('mouseup', function (e) { + var end = div.querySelector('.endOfContent'); + if (!end) { + return; + } +//#if !(MOZCENTRAL || FIREFOX) + end.style.top = ''; +//#endif + end.classList.remove('active'); + }); + }, }; return TextLayerBuilder; })();