WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
107800
[Shadow] Implements event re-targeting for Touch Events.
https://bugs.webkit.org/show_bug.cgi?id=107800
Summary
[Shadow] Implements event re-targeting for Touch Events.
Hayato Ito
Reported
2013-01-24 00:57:47 PST
I've filed a bug for the Shadow DOM Spec here:
https://www.w3.org/Bugs/Public/show_bug.cgi?id=20746
. We have to re-target Touch.target for multiple touches if each touch point is in different shadow trees.
Attachments
WIP. flaky. Not ready for review
(33.66 KB, patch)
2013-02-22 04:27 PST
,
Hayato Ito
no flags
Details
Formatted Diff
Diff
Ready for review
(37.13 KB, patch)
2013-03-04 21:23 PST
,
Hayato Ito
no flags
Details
Formatted Diff
Diff
Fix a build hopefully
(37.53 KB, patch)
2013-03-05 02:46 PST
,
Hayato Ito
no flags
Details
Formatted Diff
Diff
comments addressed.
(38.01 KB, patch)
2013-03-05 17:25 PST
,
Hayato Ito
no flags
Details
Formatted Diff
Diff
Show Obsolete
(3)
View All
Add attachment
proposed patch, testcase, etc.
Hayato Ito
Comment 1
2013-01-24 05:45:24 PST
At first glance, we have to: - Introduces TouchEventDispatchMediator - Refactor EventContext so that it has additional fields, such as touches, targetTouches and changedTouches. Another ides is to have another class which inherites EventContext. - Refactor EventRelatedTargetAdjuster so that it can be re-used from TouchEventDispatchMediator. More importantly, we should be careful to the performance. In naive implementation, it takes O(n^2) times than simple MouseEvent relatedTarget-retargeting. TouchEvent retargeting will involve N events times N retargetings (N is the number of touch points).
Dominic Cooney
Comment 2
2013-01-28 06:02:41 PST
Actually not O(n^2) but O(nm) where n is number of targets and m number of touches, right?
Shinya Kawanaka
Comment 3
2013-01-28 22:38:44 PST
Actually we have to run event retargeting algorithm with single touch :-)
Hayato Ito
Comment 4
2013-02-22 04:27:03 PST
Created
attachment 189745
[details]
WIP. flaky. Not ready for review
Dimitri Glazkov (Google)
Comment 5
2013-02-22 08:54:17 PST
Thank you for working on this!
Hayato Ito
Comment 6
2013-03-04 21:23:21 PST
Created
attachment 191397
[details]
Ready for review
WebKit Review Bot
Comment 7
2013-03-04 21:29:03 PST
Attachment 191397
[details]
did not pass style-queue: Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'LayoutTests/ChangeLog', u'LayoutTests/fast/dom/shadow/resources/event-dispatching.js', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node-expected.txt', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node.html', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-text-node-in-shadow-root-expected.txt', u'LayoutTests/fast/dom/shadow/touch-event-retargeting-expected.txt', u'LayoutTests/fast/dom/shadow/touch-event-retargeting.html', u'Source/WebCore/ChangeLog', u'Source/WebCore/dom/EventContext.cpp', u'Source/WebCore/dom/EventContext.h', u'Source/WebCore/dom/EventRetargeter.cpp', u'Source/WebCore/dom/EventRetargeter.h', u'Source/WebCore/dom/Node.cpp', u'Source/WebCore/dom/Node.h', u'Source/WebCore/dom/Touch.cpp', u'Source/WebCore/dom/Touch.h', u'Source/WebCore/dom/TouchEvent.cpp', u'Source/WebCore/dom/TouchEvent.h', u'Source/WebCore/dom/TouchList.cpp', u'Source/WebCore/dom/TouchList.h', u'Source/WebCore/page/EventHandler.cpp']" exit_code: 1 Source/WebCore/dom/EventContext.h:80: The parameter name "target" adds no information, so it should be removed. [readability/parameter_name] [5] Total errors found: 1 in 21 files If any of these errors are false positives, please file a bug against check-webkit-style.
Hayato Ito
Comment 8
2013-03-04 21:31:47 PST
This is an expected style error. We should file a bug against check-webkit-style... (In reply to
comment #7
)
>
Attachment 191397
[details]
did not pass style-queue: > > Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'LayoutTests/ChangeLog', u'LayoutTests/fast/dom/shadow/resources/event-dispatching.js', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node-expected.txt', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node.html', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-text-node-in-shadow-root-expected.txt', u'LayoutTests/fast/dom/shadow/touch-event-retargeting-expected.txt', u'LayoutTests/fast/dom/shadow/touch-event-retargeting.html', u'Source/WebCore/ChangeLog', u'Source/WebCore/dom/EventContext.cpp', u'Source/WebCore/dom/EventContext.h', u'Source/WebCore/dom/EventRetargeter.cpp', u'Source/WebCore/dom/EventRetargeter.h', u'Source/WebCore/dom/Node.cpp', u'Source/WebCore/dom/Node.h', u'Source/WebCore/dom/Touch.cpp', u'Source/WebCore/dom/Touch.h', u'Source/WebCore/dom/TouchEvent.cpp', u'Source/WebCore/dom/TouchEvent.h', u'Source/WebCore/dom/TouchList.cpp', u'Source/WebCore/dom/TouchList.h', u'Source/WebCore/page/EventHandler.cpp']" exit_code: 1 > Source/WebCore/dom/EventContext.h:80: The parameter name "target" adds no information, so it should be removed. [readability/parameter_name] [5] > Total errors found: 1 in 21 files > > > If any of these errors are false positives, please file a bug against check-webkit-style.
Build Bot
Comment 9
2013-03-04 22:27:27 PST
Comment on
attachment 191397
[details]
Ready for review
Attachment 191397
[details]
did not pass mac-wk2-ews (mac-wk2): Output:
http://webkit-commit-queue.appspot.com/results/16988081
Hayato Ito
Comment 10
2013-03-04 22:40:34 PST
Mac bot seems unhappy. Let me take a look. (In reply to
comment #9
)
> (From update of
attachment 191397
[details]
) >
Attachment 191397
[details]
did not pass mac-wk2-ews (mac-wk2): > Output:
http://webkit-commit-queue.appspot.com/results/16988081
Build Bot
Comment 11
2013-03-04 22:44:04 PST
Comment on
attachment 191397
[details]
Ready for review
Attachment 191397
[details]
did not pass mac-ews (mac): Output:
http://webkit-commit-queue.appspot.com/results/16999059
Hayato Ito
Comment 12
2013-03-04 22:58:32 PST
It seems I have to update the patch to support the port where TOUCH_EVENTS flag is disabled. (In reply to
comment #10
)
> Mac bot seems unhappy. Let me take a look. > > (In reply to
comment #9
) > > (From update of
attachment 191397
[details]
[details]) > >
Attachment 191397
[details]
[details] did not pass mac-wk2-ews (mac-wk2): > > Output:
http://webkit-commit-queue.appspot.com/results/16988081
Hayato Ito
Comment 13
2013-03-05 02:46:09 PST
Created
attachment 191447
[details]
Fix a build hopefully
WebKit Review Bot
Comment 14
2013-03-05 02:53:00 PST
Attachment 191447
[details]
did not pass style-queue: Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'LayoutTests/ChangeLog', u'LayoutTests/fast/dom/shadow/resources/event-dispatching.js', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node-expected.txt', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node.html', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-text-node-in-shadow-root-expected.txt', u'LayoutTests/fast/dom/shadow/touch-event-retargeting-expected.txt', u'LayoutTests/fast/dom/shadow/touch-event-retargeting.html', u'Source/WebCore/ChangeLog', u'Source/WebCore/dom/EventContext.cpp', u'Source/WebCore/dom/EventContext.h', u'Source/WebCore/dom/EventRetargeter.cpp', u'Source/WebCore/dom/EventRetargeter.h', u'Source/WebCore/dom/Node.cpp', u'Source/WebCore/dom/Node.h', u'Source/WebCore/dom/Touch.cpp', u'Source/WebCore/dom/Touch.h', u'Source/WebCore/dom/TouchEvent.cpp', u'Source/WebCore/dom/TouchEvent.h', u'Source/WebCore/dom/TouchList.cpp', u'Source/WebCore/dom/TouchList.h', u'Source/WebCore/page/EventHandler.cpp']" exit_code: 1 Source/WebCore/dom/EventContext.h:82: The parameter name "target" adds no information, so it should be removed. [readability/parameter_name] [5] Total errors found: 1 in 21 files If any of these errors are false positives, please file a bug against check-webkit-style.
Dimitri Glazkov (Google)
Comment 15
2013-03-05 09:45:51 PST
Comment on
attachment 191447
[details]
Fix a build hopefully View in context:
https://bugs.webkit.org/attachment.cgi?id=191447&action=review
This looks great, I only have two quibbles below: the loop avoidance and the cloning of touches. If the latter is not important (I don't know), we can land this and improve on it.
> Source/WebCore/dom/EventRetargeter.cpp:135 > + TouchEventContext* touchEventContext = static_cast<TouchEventContext*>(eventPath[i].get());
Sounds like we need a toTouchEventContext helper?
> Source/WebCore/dom/EventRetargeter.cpp:150 > + for (size_t i = 0; i< touchList.length(); ++i) {
"i<" to "i <" Also, I wonder if we could check to see if adjustment is going to be needed at a given node in event path and eliminate this loop in those cases?
> Source/WebCore/dom/EventRetargeter.cpp:156 > + touchListPath[j]->append(touch.cloneWithNewTarget(adjustedNodes[j].get()));
Wait.. this is interesting. Are we supposed to return the same object from .touches each time? If so, this code is not doing the right thing -- we should be only adjusting the target on touch.
> Source/WebCore/dom/EventRetargeter.h:54 > + typedef Vector<RefPtr<TouchList> > TouchListPath;
EventPathTouchLists?
> Source/WebCore/dom/EventRetargeter.h:69 > + static void calculateAdjustedNodes(const Node*, const Node* relatedNode, bool stopEventAtBoundaryIfNeeded, EventPath&, AdjustedNodes&);
Turn stopEventAtBoundaryIfNeeded into an enum?
Daniel Freedman
Comment 16
2013-03-05 12:32:31 PST
(In reply to
comment #15
)
> (From update of
attachment 191447
[details]
) > View in context:
https://bugs.webkit.org/attachment.cgi?id=191447&action=review
> > This looks great, I only have two quibbles below: the loop avoidance and the cloning of touches. If the latter is not important (I don't know), we can land this and improve on it. > > > Source/WebCore/dom/EventRetargeter.cpp:135 > > + TouchEventContext* touchEventContext = static_cast<TouchEventContext*>(eventPath[i].get()); > > Sounds like we need a toTouchEventContext helper? > > > Source/WebCore/dom/EventRetargeter.cpp:150 > > + for (size_t i = 0; i< touchList.length(); ++i) { > > "i<" to "i <" > > Also, I wonder if we could check to see if adjustment is going to be needed at a given node in event path and eliminate this loop in those cases? > > > Source/WebCore/dom/EventRetargeter.cpp:156 > > + touchListPath[j]->append(touch.cloneWithNewTarget(adjustedNodes[j].get())); > > Wait.. this is interesting. Are we supposed to return the same object from .touches each time? If so, this code is not doing the right thing -- we should be only adjusting the target on touch.
Chrome and Safari seem to diverge here. In Chrome, each touch object is created anew for each touch event. In iOS safari, the touch objects are reused between touch events. Technically, the spec states that Touch objects are immutable, and it's attributes must not change:
http://www.w3.org/TR/touch-events/#touch-interface
However, neither the safari documentation, nor the touch event specs state if the Touch object should or should not be reused between touch events.
> > > Source/WebCore/dom/EventRetargeter.h:54 > > + typedef Vector<RefPtr<TouchList> > TouchListPath; > > EventPathTouchLists? > > > Source/WebCore/dom/EventRetargeter.h:69 > > + static void calculateAdjustedNodes(const Node*, const Node* relatedNode, bool stopEventAtBoundaryIfNeeded, EventPath&, AdjustedNodes&); > > Turn stopEventAtBoundaryIfNeeded into an enum?
Hayato Ito
Comment 17
2013-03-05 16:35:32 PST
Thank you for the review. Let me upload a new patch soon. But I am WebKit gardener from today... :) (In reply to
comment #15
)
> (From update of
attachment 191447
[details]
) > View in context:
https://bugs.webkit.org/attachment.cgi?id=191447&action=review
> > This looks great, I only have two quibbles below: the loop avoidance and the cloning of touches. If the latter is not important (I don't know), we can land this and improve on it. > > > Source/WebCore/dom/EventRetargeter.cpp:135 > > + TouchEventContext* touchEventContext = static_cast<TouchEventContext*>(eventPath[i].get()); > > Sounds like we need a toTouchEventContext helper?
Sure. Let me add the helper.
> > > Source/WebCore/dom/EventRetargeter.cpp:150 > > + for (size_t i = 0; i< touchList.length(); ++i) { > > "i<" to "i <"
Ops. Let me fix.
> > Also, I wonder if we could check to see if adjustment is going to be needed at a given node in event path and eliminate this loop in those cases?
Yay, we can. I have to admit that this patch is naive in terms of the performance, but this is the safest and easy-to-understand approach as the first wave. I have a vague plan that I'll introduce per-treescope EventContext rather than current per-node EventContext. Touch Events dispatching will get a benefit from that, I think. So instead of making this first patch complex, I'd like to delay such an optimization and work on per-treescope EventContext in another bug. Are you happy with this? If so, I'll file a bug for per-treescope EventContext.
> > > Source/WebCore/dom/EventRetargeter.cpp:156 > > + touchListPath[j]->append(touch.cloneWithNewTarget(adjustedNodes[j].get())); > > Wait.. this is interesting. Are we supposed to return the same object from .touches each time? If so, this code is not doing the right thing -- we should be only adjusting the target on touch.
That's exactly what I did in the first WIP patch.
https://bugs.webkit.org/attachment.cgi?id=189745
I have encountered the strange aliasing problem. The reason is what Daniel pointed out. Touch object may be re-used between multiple Touch event dispatchings. EventHandler keeps Touch objects between multiple Touch Events dispatching. So we have to clone it.
> > > Source/WebCore/dom/EventRetargeter.h:54 > > + typedef Vector<RefPtr<TouchList> > TouchListPath; > > EventPathTouchLists?
Okay.
> > > Source/WebCore/dom/EventRetargeter.h:69 > > + static void calculateAdjustedNodes(const Node*, const Node* relatedNode, bool stopEventAtBoundaryIfNeeded, EventPath&, AdjustedNodes&); > > Turn stopEventAtBoundaryIfNeeded into an enum?
Okay. Let me do it. (In reply to
comment #16
)
> (In reply to
comment #15
) > > (From update of
attachment 191447
[details]
[details]) > > View in context:
https://bugs.webkit.org/attachment.cgi?id=191447&action=review
> > > > This looks great, I only have two quibbles below: the loop avoidance and the cloning of touches. If the latter is not important (I don't know), we can land this and improve on it. > > > > > Source/WebCore/dom/EventRetargeter.cpp:135 > > > + TouchEventContext* touchEventContext = static_cast<TouchEventContext*>(eventPath[i].get()); > > > > Sounds like we need a toTouchEventContext helper? > > > > > Source/WebCore/dom/EventRetargeter.cpp:150 > > > + for (size_t i = 0; i< touchList.length(); ++i) { > > > > "i<" to "i <" > > > > Also, I wonder if we could check to see if adjustment is going to be needed at a given node in event path and eliminate this loop in those cases? > > > > > Source/WebCore/dom/EventRetargeter.cpp:156 > > > + touchListPath[j]->append(touch.cloneWithNewTarget(adjustedNodes[j].get())); > > > > Wait.. this is interesting. Are we supposed to return the same object from .touches each time? If so, this code is not doing the right thing -- we should be only adjusting the target on touch. > > Chrome and Safari seem to diverge here. In Chrome, each touch object is created anew for each touch event. In iOS safari, the touch objects are reused between touch events. > > Technically, the spec states that Touch objects are immutable, and it's attributes must not change:
http://www.w3.org/TR/touch-events/#touch-interface
> > However, neither the safari documentation, nor the touch event specs state if the Touch object should or should not be reused between touch events.
Yay. I thought the fact, Touch is immutable, can justify the cloning of Touch object since users cannot notice Touch is the same instance or not in their event listeners. Therefore, in practical, it does not matter for users wheter Touch object is cloned or not as long as Touch is immutable. As for the performance, I tried to re-use Touch object if there is an available Touch objects which has the same target. But I don't think it is worth that maintaing such Touch objects pool and looking for existing re-usable Touch objects. It might be an expensive operation.
> > > > > > Source/WebCore/dom/EventRetargeter.h:54 > > > + typedef Vector<RefPtr<TouchList> > TouchListPath; > > > > EventPathTouchLists? > > > > > Source/WebCore/dom/EventRetargeter.h:69 > > > + static void calculateAdjustedNodes(const Node*, const Node* relatedNode, bool stopEventAtBoundaryIfNeeded, EventPath&, AdjustedNodes&); > > > > Turn stopEventAtBoundaryIfNeeded into an enum?
Hayato Ito
Comment 18
2013-03-05 17:25:42 PST
Created
attachment 191617
[details]
comments addressed.
WebKit Review Bot
Comment 19
2013-03-05 17:36:18 PST
Attachment 191617
[details]
did not pass style-queue: Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'LayoutTests/ChangeLog', u'LayoutTests/fast/dom/shadow/resources/event-dispatching.js', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node-expected.txt', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-distributed-text-node.html', u'LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-text-node-in-shadow-root-expected.txt', u'LayoutTests/fast/dom/shadow/touch-event-retargeting-expected.txt', u'LayoutTests/fast/dom/shadow/touch-event-retargeting.html', u'Source/WebCore/ChangeLog', u'Source/WebCore/dom/EventContext.cpp', u'Source/WebCore/dom/EventContext.h', u'Source/WebCore/dom/EventRetargeter.cpp', u'Source/WebCore/dom/EventRetargeter.h', u'Source/WebCore/dom/Node.cpp', u'Source/WebCore/dom/Node.h', u'Source/WebCore/dom/Touch.cpp', u'Source/WebCore/dom/Touch.h', u'Source/WebCore/dom/TouchEvent.cpp', u'Source/WebCore/dom/TouchEvent.h', u'Source/WebCore/dom/TouchList.cpp', u'Source/WebCore/dom/TouchList.h', u'Source/WebCore/page/EventHandler.cpp']" exit_code: 1 Source/WebCore/dom/EventContext.h:84: The parameter name "target" adds no information, so it should be removed. [readability/parameter_name] [5] Total errors found: 1 in 21 files If any of these errors are false positives, please file a bug against check-webkit-style.
WebKit Review Bot
Comment 20
2013-03-05 21:18:19 PST
Comment on
attachment 191617
[details]
comments addressed. Clearing flags on attachment: 191617 Committed
r144877
: <
http://trac.webkit.org/changeset/144877
>
WebKit Review Bot
Comment 21
2013-03-05 21:18:24 PST
All reviewed patches have been landed. Closing bug.
Hayato Ito
Comment 22
2013-03-05 23:32:35 PST
I've filed a bug for per-scope (Touch)EventContext for future improvement.
https://bugs.webkit.org/show_bug.cgi?id=111527
. (In reply to
comment #21
)
> All reviewed patches have been landed. Closing bug.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug