From 9fc8e1ea25285684ed5e38879b42b418dd2afb6a Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 13 Oct 2015 12:47:07 +0200 Subject: [PATCH] Fix a regression, from PR 5356, that breaks all scrolling in PresentationMode *This regressed in PR 5356.* Rather than just backing out the offending code, this patch restores scrolling in PresentationMode by making the `overflow: hidden;` check optional and letting the callers that need it (e.g. `PDFFindController`) opt-in to use it. --- web/pdf_find_controller.js | 6 ++++-- web/ui_utils.js | 13 ++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/web/pdf_find_controller.js b/web/pdf_find_controller.js index 605434f3f..afb563c7d 100644 --- a/web/pdf_find_controller.js +++ b/web/pdf_find_controller.js @@ -325,10 +325,12 @@ var PDFFindController = (function PDFFindControllerClosure() { pageIndex, index, elements, beginIdx, endIdx) { if (this.selected.matchIdx === index && this.selected.pageIdx === pageIndex) { - scrollIntoView(elements[beginIdx], { + var spot = { top: FIND_SCROLL_OFFSET_TOP, left: FIND_SCROLL_OFFSET_LEFT - }); + }; + scrollIntoView(elements[beginIdx], spot, + /* skipOverflowHiddenElements = */ true); } }, diff --git a/web/ui_utils.js b/web/ui_utils.js index 20d1a1869..d20d55f8a 100644 --- a/web/ui_utils.js +++ b/web/ui_utils.js @@ -113,11 +113,13 @@ function getOutputScale(ctx) { /** * Scrolls specified element into view of its parent. - * element {Object} The element to be visible. - * spot {Object} An object with optional top and left properties, - * specifying the offset from the top left edge. + * @param {Object} element - The element to be visible. + * @param {Object} spot - An object with optional top and left properties, + * specifying the offset from the top left edge. + * @param {boolean} skipOverflowHiddenElements - Ignore elements that have + * the CSS rule `overflow: hidden;` set. The default is false. */ -function scrollIntoView(element, spot) { +function scrollIntoView(element, spot, skipOverflowHiddenElements) { // Assuming offsetParent is available (it's not available when viewer is in // hidden iframe or object). We have to scroll: if the offsetParent is not set // producing the error. See also animationStartedClosure. @@ -126,10 +128,11 @@ function scrollIntoView(element, spot) { console.error('offsetParent is not set -- cannot scroll'); return; } + var checkOverflow = skipOverflowHiddenElements || false; var offsetY = element.offsetTop + element.clientTop; var offsetX = element.offsetLeft + element.clientLeft; while (parent.clientHeight === parent.scrollHeight || - getComputedStyle(parent).overflow === 'hidden') { + (checkOverflow && getComputedStyle(parent).overflow === 'hidden')) { if (parent.dataset._scaleY) { offsetY /= parent.dataset._scaleY; offsetX /= parent.dataset._scaleX;