From ee51005320b5f5bacb60d3aa1377f3c537eb45e5 Mon Sep 17 00:00:00 2001 From: yyc <395976266@qq.com> Date: Sat, 11 May 2019 18:15:58 +0800 Subject: [PATCH] fix(event): touchmove event prevent default --- src/job/utils/InitEventJobUtils.re | 23 +++++++++--- test/unit/job/no_worker/InitEventJob_test.re | 37 +++++++++++++++++++ .../unit/job/no_worker/tool/TouchEventTool.re | 11 +++--- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/job/utils/InitEventJobUtils.re b/src/job/utils/InitEventJobUtils.re index 5655c2ae96..4d605185b8 100755 --- a/src/job/utils/InitEventJobUtils.re +++ b/src/job/utils/InitEventJobUtils.re @@ -7,6 +7,19 @@ let _getBody = () => DomExtend.document##body |> bodyToEventTarget; let _fromPointDomEvent = (eventName, state) => WonderBsMost.Most.fromEvent(eventName, _getBody(), false); +let _fromTouchMoveDomEventAndPreventnDefault = state => + Obj.magic( + WonderBsMost.Most.fromEvent, + "touchmove", + _getBody(), + {"passive": false}, + ) + |> WonderBsMost.Most.tap(event => + HandlePointDomEventMainService.preventDefault( + event |> eventTargetToTouchDomEvent |> touchDomEventToPointDomEvent, + ) + ); + let _fromKeyboardDomEvent = (eventName, state) => WonderBsMost.Most.fromEvent(eventName, _getBody(), false); @@ -378,9 +391,9 @@ let _fromPCDomEventArr = state => [| _fromPointDomEvent("mouseup", state) |> WonderBsMost.Most.tap(event => _execMouseEventHandle(MouseUp, event)), _fromPointDomEvent("mousemove", state) - |> WonderBsMost.Most.tap(event => { - _execMouseMoveEventHandle(MouseMove, event); - }), + |> WonderBsMost.Most.tap(event => + _execMouseMoveEventHandle(MouseMove, event) + ), _fromPointDomEvent("mousewheel", state) |> WonderBsMost.Most.tap(event => _execMouseEventHandle(MouseWheel, event)), _fromPointDomEvent("mousedown", state) @@ -413,14 +426,14 @@ let _fromMobileDomEventArr = state => [| |> WonderBsMost.Most.tap(event => _execTouchEventHandle(TouchEnd, event)), _fromPointDomEvent("touchstart", state) |> WonderBsMost.Most.tap(event => _execTouchEventHandle(TouchStart, event)), - _fromPointDomEvent("touchmove", state) + _fromTouchMoveDomEventAndPreventnDefault(state) |> WonderBsMost.Most.tap(event => _execTouchMoveEventHandle(TouchMove, event) ), _fromPointDomEvent("touchstart", state) |> WonderBsMost.Most.tap(event => _execTouchDragStartEventHandle(event)) |> WonderBsMost.Most.flatMap(event => - _fromPointDomEvent("touchmove", state) + _fromTouchMoveDomEventAndPreventnDefault(state) |> WonderBsMost.Most.until( _fromPointDomEvent("touchend", state) |> WonderBsMost.Most.tap(event => diff --git a/test/unit/job/no_worker/InitEventJob_test.re b/test/unit/job/no_worker/InitEventJob_test.re index 77ef6673f9..b4633df1fb 100755 --- a/test/unit/job/no_worker/InitEventJob_test.re +++ b/test/unit/job/no_worker/InitEventJob_test.re @@ -1492,6 +1492,43 @@ let _ = describe("bind touchmove event", () => { _testTouchEvent(TouchMove, "touchmove"); + test("preventDefault", () => { + let state = TouchEventTool.prepare(~sandbox, ()); + let state = state |> NoWorkerJobTool.execInitJobs; + let preventDefaultFunc = createEmptyStubWithJsObjSandbox(sandbox); + let stopPropagationFunc = + createEmptyStubWithJsObjSandbox(sandbox); + + let state = + ManageEventAPI.onTouchEvent( + TouchMove, + 0, + (. event: touchEvent, state) => state, + state, + ); + + let state = MainStateTool.setState(state); + EventTool.triggerDomEvent( + "touchmove", + EventTool.getPointEventBindedDom(state), + TouchEventTool.buildTouchEvent( + ~changedTouches=[| + TouchEventTool.buildTouchData(~pageX=10, ~pageY=20, ()), + |], + ~preventDefaultFunc, + ~stopPropagationFunc, + (), + ), + ); + let state = EventTool.restore(state); + + ( + preventDefaultFunc |> getCallCount, + stopPropagationFunc |> getCallCount, + ) + |> expect == (1, 1); + }); + describe("test touch event", () => describe("test movementDelta", () => test("set lastX, lastY after handle", () => { diff --git a/test/unit/job/no_worker/tool/TouchEventTool.re b/test/unit/job/no_worker/tool/TouchEventTool.re index 44fa4927e6..14af48c4e8 100755 --- a/test/unit/job/no_worker/tool/TouchEventTool.re +++ b/test/unit/job/no_worker/tool/TouchEventTool.re @@ -11,8 +11,8 @@ let setIsDrag = HandleTouchEventMainService.setIsDrag; let buildTouchData = (~pageX=10, ~pageY=20, ()) => { "clientX": 0, "clientY": 0, - "pageX", - "pageY", + "pageX": pageX, + "pageY": pageY, "identifier": 0, "screenX": 0, "screenY": 0, @@ -27,14 +27,17 @@ let buildTouchEvent = ~touches=[|buildTouchData()|], ~changedTouches=[|buildTouchData()|], ~targetTouches=[|buildTouchData()|], + ~preventDefaultFunc=() => (), + ~stopPropagationFunc=() => (), (), ) => { "touches": touches, "changedTouches": changedTouches, "targetTouches": targetTouches, + "preventDefault": preventDefaultFunc, + "stopPropagation": stopPropagationFunc, }; - let prepareWithState = ( ~sandbox, @@ -57,8 +60,6 @@ let prepareWithState = MainStateTool.unsafeGetState(); }; - - let prepare = ( ~sandbox,