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)
Core
General
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>
Updated•3 years ago
|
Severity: normal → S3
Comment 1•10 months ago
|
||
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.
Description
•