Skip to content

Commit 5aaca75

Browse files
committed
Clean up scroll events on unmount and test scroll modulation.
This test is a little brittle, I can only get it to work in Chrome.
1 parent ebeae88 commit 5aaca75

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

lib/DraggableCore.es6

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ export default class DraggableCore extends React.Component {
235235
removeEvent(document, eventsFor.touch.move, this.handleDrag);
236236
removeEvent(document, eventsFor.mouse.stop, this.handleDragStop);
237237
removeEvent(document, eventsFor.touch.stop, this.handleDragStop);
238+
removeEvent(document, 'scroll', this.handleScroll);
238239
if (this.props.enableUserSelectHack) removeUserSelectStyles();
239240
}
240241

@@ -370,12 +371,12 @@ export default class DraggableCore extends React.Component {
370371

371372
// Create the usual event, but make the scroll offset our deltas.
372373
let coreEvent = createCoreEvent(this);
373-
coreEvent.deltaX = x - s.scrollX;
374-
coreEvent.deltaY = y - s.scrollY;
374+
coreEvent.position.deltaX = x - s.scrollX;
375+
coreEvent.position.deltaY = y - s.scrollY;
375376

376377
this.setState({
377-
lastX: s.lastX + coreEvent.deltaX,
378-
lastY: s.lastY + coreEvent.deltaY
378+
lastX: s.lastX + coreEvent.position.deltaX,
379+
lastY: s.lastY + coreEvent.position.deltaY
379380
});
380381

381382
this.props.onDrag(e, coreEvent);

specs/draggable.spec.jsx

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ describe('react-draggable', function () {
1818

1919
afterEach(function() {
2020
try {
21-
ReactDOM.findDOMNode(drag);
22-
drag.componentWillUnmount();
21+
React.unmountComponentAtNode(React.findDOMNode(drag).parentNode);
22+
// TestUtils.Simulate.mouseUp(ReactDOM.findDOMNode(drag));
2323
} catch(e) { return; }
2424
});
2525

@@ -325,6 +325,32 @@ describe('react-draggable', function () {
325325
TestUtils.Simulate.mouseUp(ReactDOM.findDOMNode(drag));
326326
expect(drag.state.dragging).toEqual(false);
327327
});
328+
329+
it('should modulate position on scroll', function (done) {
330+
// This test fails in karma under PhantomJS & Firefox, scroll event quirks
331+
var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
332+
if (!is_chrome) return done();
333+
334+
var dragCalled = false;
335+
336+
function onDrag(e, coreEvent) {
337+
expect(coreEvent.deltaY).toEqual(500);
338+
dragCalled = true;
339+
}
340+
drag = TestUtils.renderIntoDocument(<Draggable onDrag={onDrag}><div/></Draggable>);
341+
var node = ReactDOM.findDOMNode(drag);
342+
343+
TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag)); // start drag so window listener is up
344+
expect(drag.state.dragging).toEqual(true);
345+
346+
document.body.style.height = '10000px';
347+
window.scrollTo(0, 500);
348+
setTimeout(function() {
349+
expect(dragCalled).toEqual(true);
350+
expect(drag.state.clientY).toEqual(500);
351+
done();
352+
}, 0);
353+
});
328354
});
329355

330356
describe('validation', function () {

0 commit comments

Comments
 (0)