Closed Bug 538366 Opened 16 years ago Closed 10 months ago

smoothscrolling in arrowscrollbox doesn't check if element is already scrolling, which causes backward scroll

Categories

(Core :: General, defect)

defect

Tracking

()

RESOLVED INVALID

People

(Reporter: amirjanyan, Unassigned)

Details

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 (.NET CLR 3.5.30729) Build Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 (.NET CLR 3.5.30729) when scrolling slowly arrowscrollbox moves element as expected but if, new DOMMouseScroll event hapens when _isScrolling!=0 element is moved in oposite direction Reproducible: Always Steps to Reproduce: make a big enough element in arrowscrollbox e g text longer than arrowscrollbox's width scroll fast Actual Results: if you scroll for more than one tick element goe's a little bit in desired direction and then come's back Expected Results: slow scrolling moves element goe'sto the end changing original <method name="ensureElementIsVisible"> <parameter name="element"/> <parameter name="aSmoothScroll"/> <body><![CDATA[ var vertical = this.orient == "vertical"; var rect = this.scrollClientRect; var containerStart = vertical ? rect.top : rect.left; var containerEnd = vertical ? rect.bottom : rect.right; rect = element.getBoundingClientRect(); var elementStart = vertical ? rect.top : rect.left; var elementEnd = vertical ? rect.bottom : rect.right; var amountToScroll; if (elementStart < containerStart) { amountToScroll = elementStart - containerStart; } else if (containerEnd < elementEnd) { amountToScroll = elementEnd - containerEnd; } else if (this._isScrolling) { // decelerate if a currently-visible element is selected during the scroll const STOP_DISTANCE = 15; if (this._isScrolling == -1 && elementStart - STOP_DISTANCE < containerStart) amountToScroll = elementStart - containerStart; else if (this._isScrolling == 1 && containerEnd - STOP_DISTANCE < elementEnd) amountToScroll = elementEnd - containerEnd; else amountToScroll = this._isScrolling * STOP_DISTANCE; } else { return; } this._stopSmoothScroll(); if (aSmoothScroll != false && this.smoothScroll) { this._scrollTarget = element; this._smoothScrollByPixels(amountToScroll); } else { this.scrollByPixels(amountToScroll); } ]]></body> </method> to following one helps to solve problem <method name="ensureElementIsVisible"> <parameter name="element"/> <parameter name="aSmoothScroll"/> <body><![CDATA[ var vertical = this.orient == "vertical"; var rect = this.scrollClientRect; var containerStart = vertical ? rect.top : rect.left; var containerEnd = vertical ? rect.bottom : rect.right; rect = element.getBoundingClientRect(); var elementStart = vertical ? rect.top : rect.left; var elementEnd = vertical ? rect.bottom : rect.right; var amountToScroll; this.dump("rty uuu y "+elementStart +" "+ containerStart+" "+containerEnd +" "+elementEnd); switch(this._isScrolling){ case 0: if (elementStart < containerStart) { amountToScroll = elementStart - containerStart; } else if (containerEnd < elementEnd) { amountToScroll = elementEnd - containerEnd; } else { amountToScroll=0; } break; case -1: if (elementStart < containerStart) amountToScroll = elementStart - containerStart; break; case 1: if ( containerEnd < elementEnd) amountToScroll = elementEnd - containerEnd; break; } this.dump("this._isScrolling "+this._isScrolling+" "+amountToScroll); this._stopSmoothScroll(); if (aSmoothScroll != false && this.smoothScroll) { this._scrollTarget = element; this._smoothScrollByPixels(amountToScroll); } else { this.scrollByPixels(amountToScroll); } ]]></body> </method>
Severity: normal → S3

No activity for a while and probably fixed/not needed anymore. Closing.

Status: UNCONFIRMED → RESOLVED
Closed: 10 months ago
Resolution: --- → INVALID
You need to log in before you can comment on or make changes to this bug.