<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[208630] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/208630">208630</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2016-11-11 16:48:46 -0800 (Fri, 11 Nov 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Hovering over a slotted Text node clears hover state
https://bugs.webkit.org/show_bug.cgi?id=164002
<rdar://problem/29040471>
Reviewed by Simon Fraser.
Source/WebCore:
The bug was caused by HitTestResult::innerElement returning the parent element of a Text node without
taking the shadow root or slots into account. For hit testing, we always want to use the "flat tree"
or "composed tree" (imprecisely but close enough in this case).
Fixed the bug by making HitTestResult::innerElement use parentNodeInComposedTree. Also renamed it to
HitTestResult::targetElement to be consistent with HitTestResult::targetNode.
Tests: fast/shadow-dom/activate-over-slotted-content.html
fast/shadow-dom/hover-over-slotted-content.html
* dom/Document.cpp:
(WebCore::Document::prepareMouseEvent):
* html/MediaElementSession.cpp:
(WebCore::isMainContentForPurposesOfAutoplay):
* page/EventHandler.cpp:
(WebCore::EventHandler::eventMayStartDrag):
(WebCore::EventHandler::hitTestResultAtPoint):
(WebCore::EventHandler::handleWheelEvent):
(WebCore::EventHandler::sendContextMenuEventForKey):
(WebCore::EventHandler::hoverTimerFired):
(WebCore::EventHandler::handleDrag):
(WebCore::EventHandler::handleTouchEvent):
* rendering/HitTestResult.cpp:
(WebCore::HitTestResult::targetElement): Renamed from innerElement.
Now finds the parent element in the composed tree.
* rendering/HitTestResult.h:
(WebCore::HitTestResult::innerNode):
Source/WebKit/mac:
* WebView/WebImmediateActionController.mm:
(-[WebImmediateActionController performHitTestAtPoint:]):
Source/WebKit2:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::determinePrimarySnapshottedPlugIn):
* WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::performImmediateActionHitTestAtLocation):
LayoutTests:
Added two reference tests for activating and hovering over a Text node.
The text node should activate :hover and :activate rules in the shadow tree respectively.
* fast/shadow-dom/activate-over-slotted-content-expected.html: Added.
* fast/shadow-dom/activate-over-slotted-content.html: Added.
* fast/shadow-dom/hover-over-slotted-content-expected.html: Added.
* fast/shadow-dom/hover-over-slotted-content.html: Added.
* platform/ios-simulator/TestExpectations: Skip the newly added tests since iOS doesn't
support :hover or :activate via mouse down.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorTestExpectations">trunk/LayoutTests/platform/ios-simulator/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaElementSessioncpp">trunk/Source/WebCore/html/MediaElementSession.cpp</a></li>
<li><a href="#trunkSourceWebCorepageEventHandlercpp">trunk/Source/WebCore/page/EventHandler.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingHitTestResultcpp">trunk/Source/WebCore/rendering/HitTestResult.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingHitTestResulth">trunk/Source/WebCore/rendering/HitTestResult.h</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebImmediateActionControllermm">trunk/Source/WebKit/mac/WebView/WebImmediateActionController.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacWebPageMacmm">trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastshadowdomactivateoverslottedcontentexpectedhtml">trunk/LayoutTests/fast/shadow-dom/activate-over-slotted-content-expected.html</a></li>
<li><a href="#trunkLayoutTestsfastshadowdomactivateoverslottedcontenthtml">trunk/LayoutTests/fast/shadow-dom/activate-over-slotted-content.html</a></li>
<li><a href="#trunkLayoutTestsfastshadowdomhoveroverslottedcontentexpectedhtml">trunk/LayoutTests/fast/shadow-dom/hover-over-slotted-content-expected.html</a></li>
<li><a href="#trunkLayoutTestsfastshadowdomhoveroverslottedcontenthtml">trunk/LayoutTests/fast/shadow-dom/hover-over-slotted-content.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/LayoutTests/ChangeLog        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2016-11-11 Ryosuke Niwa <rniwa@webkit.org>
+
+ Hovering over a slotted Text node clears hover state
+ https://bugs.webkit.org/show_bug.cgi?id=164002
+ <rdar://problem/29040471>
+
+ Reviewed by Simon Fraser.
+
+ Added two reference tests for activating and hovering over a Text node.
+ The text node should activate :hover and :activate rules in the shadow tree respectively.
+
+ * fast/shadow-dom/activate-over-slotted-content-expected.html: Added.
+ * fast/shadow-dom/activate-over-slotted-content.html: Added.
+ * fast/shadow-dom/hover-over-slotted-content-expected.html: Added.
+ * fast/shadow-dom/hover-over-slotted-content.html: Added.
+ * platform/ios-simulator/TestExpectations: Skip the newly added tests since iOS doesn't
+ support :hover or :activate via mouse down.
+
</ins><span class="cx"> 2016-11-11 Brent Fulgham <bfulgham@apple.com>
</span><span class="cx">
</span><span class="cx"> Neutered ArrayBuffers are not properly serialized
</span></span></pre></div>
<a id="trunkLayoutTestsfastshadowdomactivateoverslottedcontentexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/shadow-dom/activate-over-slotted-content-expected.html (0 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/shadow-dom/activate-over-slotted-content-expected.html         (rev 0)
+++ trunk/LayoutTests/fast/shadow-dom/activate-over-slotted-content-expected.html        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<body>
+ <p>Test passes if you see a single 100px by 100px green box below.</p>
+ <div style="width: 100px; height: 100px; background: green;"></div>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsfastshadowdomactivateoverslottedcontenthtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/shadow-dom/activate-over-slotted-content.html (0 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/shadow-dom/activate-over-slotted-content.html         (rev 0)
+++ trunk/LayoutTests/fast/shadow-dom/activate-over-slotted-content.html        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -0,0 +1,45 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<head>
+<style>
+my-host {
+ display: block;
+ width: 100px;
+ height: 100px;
+ background: purple;
+}
+</style>
+</head>
+<body>
+<p>Test passes if you see a single 100px by 100px green box below.</p>
+<my-host>Mouse down over this text</my-host>
+
+<script>
+const host = document.querySelector('my-host');
+host.attachShadow({mode: 'closed'}).innerHTML = `
+<a><span><slot></slot></span></a>
+<style>
+a {
+ display: block;
+ width: 80px;
+ height: 80px;
+ padding: 10px;
+ background: red;
+}
+a:active {
+ background: green;
+ color: green;
+}
+span {
+ background: green;
+}
+</style>`;
+
+if (window.eventSender) {
+ eventSender.mouseMoveTo(host.offsetLeft + 15, host.offsetTop + 15);
+ eventSender.mouseDown();
+}
+
+</script>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsfastshadowdomhoveroverslottedcontentexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/shadow-dom/hover-over-slotted-content-expected.html (0 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/shadow-dom/hover-over-slotted-content-expected.html         (rev 0)
+++ trunk/LayoutTests/fast/shadow-dom/hover-over-slotted-content-expected.html        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<body>
+ <p>Test passes if you see a single 100px by 100px green box below.</p>
+ <div style="width: 100px; height: 100px; background: green;"></div>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsfastshadowdomhoveroverslottedcontenthtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/shadow-dom/hover-over-slotted-content.html (0 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/shadow-dom/hover-over-slotted-content.html         (rev 0)
+++ trunk/LayoutTests/fast/shadow-dom/hover-over-slotted-content.html        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<head>
+<style>
+my-host {
+ display: block;
+ width: 100px;
+ height: 100px;
+ background: purple;
+}
+</style>
+</head>
+<body>
+<p>Test passes if you see a single 100px by 100px green box below.</p>
+<my-host>Hover over this text</my-host>
+
+<script>
+const host = document.querySelector('my-host');
+host.attachShadow({mode: 'closed'}).innerHTML = `
+<div id="container"><span><slot></slot></span></div>
+<style>
+#container {
+ width: 80px;
+ height: 80px;
+ padding: 10px;
+ background: red;
+}
+#container:hover {
+ background: green;
+ color: green;
+}
+span {
+ background: green;
+}
+</style>`;
+
+if (window.eventSender)
+ eventSender.mouseMoveTo(host.offsetLeft + 15, host.offsetTop + 15);
+
+</script>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator/TestExpectations (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator/TestExpectations        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/LayoutTests/platform/ios-simulator/TestExpectations        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -341,6 +341,8 @@
</span><span class="cx"> webkit.org/b/155233 fast/events/max-tabindex-focus.html [ Skip ]
</span><span class="cx"> fast/shadow-dom/shadow-host-removal-crash.html [ Skip ]
</span><span class="cx"> fast/shadow-dom/input-element-in-shadow.html [ Skip ]
</span><ins>+fast/shadow-dom/activate-over-slotted-content.html [ Skip ]
+fast/shadow-dom/hover-over-slotted-content.html [ Skip ]
</ins><span class="cx"> fast/events/keyboardevent-key.html [ Skip ]
</span><span class="cx"> fast/events/keyboardevent-code.html [ Skip ]
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebCore/ChangeLog        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2016-11-11 Ryosuke Niwa <rniwa@webkit.org>
+
+ Hovering over a slotted Text node clears hover state
+ https://bugs.webkit.org/show_bug.cgi?id=164002
+ <rdar://problem/29040471>
+
+ Reviewed by Simon Fraser.
+
+ The bug was caused by HitTestResult::innerElement returning the parent element of a Text node without
+ taking the shadow root or slots into account. For hit testing, we always want to use the "flat tree"
+ or "composed tree" (imprecisely but close enough in this case).
+
+ Fixed the bug by making HitTestResult::innerElement use parentNodeInComposedTree. Also renamed it to
+ HitTestResult::targetElement to be consistent with HitTestResult::targetNode.
+
+ Tests: fast/shadow-dom/activate-over-slotted-content.html
+ fast/shadow-dom/hover-over-slotted-content.html
+
+ * dom/Document.cpp:
+ (WebCore::Document::prepareMouseEvent):
+ * html/MediaElementSession.cpp:
+ (WebCore::isMainContentForPurposesOfAutoplay):
+ * page/EventHandler.cpp:
+ (WebCore::EventHandler::eventMayStartDrag):
+ (WebCore::EventHandler::hitTestResultAtPoint):
+ (WebCore::EventHandler::handleWheelEvent):
+ (WebCore::EventHandler::sendContextMenuEventForKey):
+ (WebCore::EventHandler::hoverTimerFired):
+ (WebCore::EventHandler::handleDrag):
+ (WebCore::EventHandler::handleTouchEvent):
+ * rendering/HitTestResult.cpp:
+ (WebCore::HitTestResult::targetElement): Renamed from innerElement.
+ Now finds the parent element in the composed tree.
+ * rendering/HitTestResult.h:
+ (WebCore::HitTestResult::innerNode):
+
</ins><span class="cx"> 2016-11-11 Brent Fulgham <bfulgham@apple.com>
</span><span class="cx">
</span><span class="cx"> Unreviewed build fix after r208628
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebCore/dom/Document.cpp        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -3277,7 +3277,7 @@
</span><span class="cx"> renderView()->hitTest(request, result);
</span><span class="cx">
</span><span class="cx"> if (!request.readOnly())
</span><del>- updateHoverActiveState(request, result.innerElement());
</del><ins>+ updateHoverActiveState(request, result.targetElement());
</ins><span class="cx">
</span><span class="cx"> return MouseEventWithHitTestResults(event, result);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaElementSessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaElementSession.cpp        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -676,7 +676,7 @@
</span><span class="cx"> // Elements which are obscured by other elements cannot be main content.
</span><span class="cx"> mainRenderView.hitTest(request, result);
</span><span class="cx"> result.setToNonUserAgentShadowAncestor();
</span><del>- Element* hitElement = result.innerElement();
</del><ins>+ Element* hitElement = result.targetElement();
</ins><span class="cx"> if (hitElement != &element)
</span><span class="cx"> return false;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorepageEventHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/EventHandler.cpp (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/EventHandler.cpp        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebCore/page/EventHandler.cpp        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -892,7 +892,8 @@
</span><span class="cx"> HitTestResult result(view->windowToContents(event.position()));
</span><span class="cx"> renderView->hitTest(request, result);
</span><span class="cx"> DragState state;
</span><del>- return result.innerElement() && page->dragController().draggableElement(&m_frame, result.innerElement(), result.roundedPointInInnerNodeFrame(), state);
</del><ins>+ Element* targetElement = result.targetElement();
+ return targetElement && page->dragController().draggableElement(&m_frame, targetElement, result.roundedPointInInnerNodeFrame(), state);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void EventHandler::updateSelectionForMouseDrag()
</span><span class="lines">@@ -1159,7 +1160,7 @@
</span><span class="cx"> HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent);
</span><span class="cx"> renderView->hitTest(request, result);
</span><span class="cx"> if (!request.readOnly())
</span><del>- m_frame.document()->updateHoverActiveState(request, result.innerElement());
</del><ins>+ m_frame.document()->updateHoverActiveState(request, result.targetElement());
</ins><span class="cx">
</span><span class="cx"> if (request.disallowsUserAgentShadowContent())
</span><span class="cx"> result.setToNonUserAgentShadowAncestor();
</span><span class="lines">@@ -2689,7 +2690,7 @@
</span><span class="cx"> HitTestResult result(view->windowToContents(event.position()));
</span><span class="cx"> renderView->hitTest(request, result);
</span><span class="cx">
</span><del>- RefPtr<Element> element = result.innerElement();
</del><ins>+ RefPtr<Element> element = result.targetElement();
</ins><span class="cx"> RefPtr<ContainerNode> scrollableContainer;
</span><span class="cx"> WeakPtr<ScrollableArea> scrollableArea;
</span><span class="cx"> bool isOverWidget = result.isOverWidget();
</span><span class="lines">@@ -2875,7 +2876,7 @@
</span><span class="cx"> // Use the focused node as the target for hover and active.
</span><span class="cx"> HitTestResult result(position);
</span><span class="cx"> result.setInnerNode(targetNode);
</span><del>- doc->updateHoverActiveState(HitTestRequest::Active | HitTestRequest::DisallowUserAgentShadowContent, result.innerElement());
</del><ins>+ doc->updateHoverActiveState(HitTestRequest::Active | HitTestRequest::DisallowUserAgentShadowContent, result.targetElement());
</ins><span class="cx">
</span><span class="cx"> // The contextmenu event is a mouse event even when invoked using the keyboard.
</span><span class="cx"> // This is required for web compatibility.
</span><span class="lines">@@ -2997,7 +2998,7 @@
</span><span class="cx"> HitTestRequest request(HitTestRequest::Move | HitTestRequest::DisallowUserAgentShadowContent);
</span><span class="cx"> HitTestResult result(view->windowToContents(m_lastKnownMousePosition));
</span><span class="cx"> renderView->hitTest(request, result);
</span><del>- m_frame.document()->updateHoverActiveState(request, result.innerElement());
</del><ins>+ m_frame.document()->updateHoverActiveState(request, result.targetElement());
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -3442,7 +3443,7 @@
</span><span class="cx"> HitTestResult result(m_mouseDownPos);
</span><span class="cx"> m_frame.contentRenderer()->hitTest(request, result);
</span><span class="cx"> if (m_frame.page())
</span><del>- dragState().source = m_frame.page()->dragController().draggableElement(&m_frame, result.innerElement(), m_mouseDownPos, dragState());
</del><ins>+ dragState().source = m_frame.page()->dragController().draggableElement(&m_frame, result.targetElement(), m_mouseDownPos, dragState());
</ins><span class="cx">
</span><span class="cx"> if (!dragState().source)
</span><span class="cx"> m_mouseDownMayStartDrag = false; // no element is draggable
</span><span class="lines">@@ -3915,14 +3916,13 @@
</span><span class="cx"> } else
</span><span class="cx"> continue;
</span><span class="cx">
</span><del>- // FIXME: This code should use Element* instead of Node*.
- Node* node = result.innerElement();
- ASSERT(node);
</del><ins>+ Element* element = result.targetElement();
+ ASSERT(element);
</ins><span class="cx">
</span><del>- if (node && InspectorInstrumentation::handleTouchEvent(m_frame, *node))
</del><ins>+ if (element && InspectorInstrumentation::handleTouchEvent(m_frame, *element))
</ins><span class="cx"> return true;
</span><span class="cx">
</span><del>- Document& doc = node->document();
</del><ins>+ Document& doc = element->document();
</ins><span class="cx"> // Record the originating touch document even if it does not have a touch listener.
</span><span class="cx"> if (freshTouchEvents) {
</span><span class="cx"> m_originatingTouchPointDocument = &doc;
</span><span class="lines">@@ -3930,8 +3930,8 @@
</span><span class="cx"> }
</span><span class="cx"> if (!doc.hasTouchEventHandlers())
</span><span class="cx"> continue;
</span><del>- m_originatingTouchPointTargets.set(touchPointTargetKey, node);
- touchTarget = node;
</del><ins>+ m_originatingTouchPointTargets.set(touchPointTargetKey, element);
+ touchTarget = element;
</ins><span class="cx"> } else if (pointState == PlatformTouchPoint::TouchReleased || pointState == PlatformTouchPoint::TouchCancelled) {
</span><span class="cx"> // No need to perform a hit-test since we only need to unset :hover and :active states.
</span><span class="cx"> if (!shouldGesturesTriggerActive() && allTouchReleased)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingHitTestResultcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/HitTestResult.cpp (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/HitTestResult.cpp        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebCore/rendering/HitTestResult.cpp        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -764,14 +764,13 @@
</span><span class="cx"> return node;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Element* HitTestResult::innerElement() const
</del><ins>+Element* HitTestResult::targetElement() const
</ins><span class="cx"> {
</span><del>- Node* node = m_innerNode.get();
- if (!node)
- return nullptr;
- if (is<Element>(*node))
- return downcast<Element>(node);
- return node->parentElement();
</del><ins>+ for (Node* node = m_innerNode.get(); node; node = node->parentInComposedTree()) {
+ if (is<Element>(*node))
+ return downcast<Element>(node);
+ }
+ return nullptr;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Element* HitTestResult::innerNonSharedElement() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingHitTestResulth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/HitTestResult.h (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/HitTestResult.h        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebCore/rendering/HitTestResult.h        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -59,7 +59,6 @@
</span><span class="cx"> WEBCORE_EXPORT HitTestResult& operator=(const HitTestResult&);
</span><span class="cx">
</span><span class="cx"> Node* innerNode() const { return m_innerNode.get(); }
</span><del>- WEBCORE_EXPORT Element* innerElement() const;
</del><span class="cx"> Node* innerNonSharedNode() const { return m_innerNonSharedNode.get(); }
</span><span class="cx"> WEBCORE_EXPORT Element* innerNonSharedElement() const;
</span><span class="cx"> Element* URLElement() const { return m_innerURLElement.get(); }
</span><span class="lines">@@ -151,6 +150,7 @@
</span><span class="cx"> Vector<String> dictationAlternatives() const;
</span><span class="cx">
</span><span class="cx"> Node* targetNode() const;
</span><ins>+ WEBCORE_EXPORT Element* targetElement() const;
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> NodeSet& mutableRectBasedTestResult(); // See above.
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2016-11-11 Ryosuke Niwa <rniwa@webkit.org>
+
+ Hovering over a slotted Text node clears hover state
+ https://bugs.webkit.org/show_bug.cgi?id=164002
+ <rdar://problem/29040471>
+
+ Reviewed by Simon Fraser.
+
+ * WebView/WebImmediateActionController.mm:
+ (-[WebImmediateActionController performHitTestAtPoint:]):
+
</ins><span class="cx"> 2016-11-11 Wenson Hsieh <wenson_hsieh@apple.com>
</span><span class="cx">
</span><span class="cx"> [WK2] autocorrect and autocapitalize attributes do not work in contenteditable elements
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebImmediateActionControllermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebImmediateActionController.mm (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebImmediateActionController.mm        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebKit/mac/WebView/WebImmediateActionController.mm        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -150,7 +150,7 @@
</span><span class="cx"> _hitTestResult = coreFrame->eventHandler().hitTestResultAtPoint(IntPoint(viewPoint));
</span><span class="cx"> coreFrame->eventHandler().setImmediateActionStage(ImmediateActionStage::PerformedHitTest);
</span><span class="cx">
</span><del>- if (Element* element = _hitTestResult.innerElement())
</del><ins>+ if (Element* element = _hitTestResult.targetElement())
</ins><span class="cx"> _contentPreventsDefault = element->dispatchMouseForceWillBegin();
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebKit2/ChangeLog        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2016-11-11 Ryosuke Niwa <rniwa@webkit.org>
+
+ Hovering over a slotted Text node clears hover state
+ https://bugs.webkit.org/show_bug.cgi?id=164002
+ <rdar://problem/29040471>
+
+ Reviewed by Simon Fraser.
+
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::determinePrimarySnapshottedPlugIn):
+ * WebProcess/WebPage/mac/WebPageMac.mm:
+ (WebKit::WebPage::performImmediateActionHitTestAtLocation):
+
</ins><span class="cx"> 2016-11-11 Wenson Hsieh <wenson_hsieh@apple.com>
</span><span class="cx">
</span><span class="cx"> [WK2] autocorrect and autocapitalize attributes do not work in contenteditable elements
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -5281,7 +5281,7 @@
</span><span class="cx"> HitTestResult hitTestResult(plugInRectRelativeToTopDocument.center());
</span><span class="cx"> mainRenderView.hitTest(request, hitTestResult);
</span><span class="cx">
</span><del>- Element* element = hitTestResult.innerElement();
</del><ins>+ Element* element = hitTestResult.targetElement();
</ins><span class="cx"> if (!element)
</span><span class="cx"> continue;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacWebPageMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm (208629 => 208630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm        2016-11-12 00:40:52 UTC (rev 208629)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm        2016-11-12 00:48:46 UTC (rev 208630)
</span><span class="lines">@@ -1001,7 +1001,7 @@
</span><span class="cx"> HitTestResult hitTestResult = mainFrame.eventHandler().hitTestResultAtPoint(locationInContentCoordinates);
</span><span class="cx">
</span><span class="cx"> bool immediateActionHitTestPreventsDefault = false;
</span><del>- Element* element = hitTestResult.innerElement();
</del><ins>+ Element* element = hitTestResult.targetElement();
</ins><span class="cx">
</span><span class="cx"> mainFrame.eventHandler().setImmediateActionStage(ImmediateActionStage::PerformedHitTest);
</span><span class="cx"> if (element)
</span></span></pre>
</div>
</div>
</body>
</html>