<!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>[209901] 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/209901">209901</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-12-15 19:14:52 -0800 (Thu, 15 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Make sure HTML validation bubble's state is updated after layout
https://bugs.webkit.org/show_bug.cgi?id=165922
&lt;rdar://problem/29694730&gt;

Reviewed by Simon Fraser.

Source/WebCore:

Make sure HTML validation bubble's state is updated after layout.
In particular, if the validation bubble's associated element has
moved or is no longer visible, we now hide the bubble.

Tests: fast/forms/validation-bubble-disappears-when-input-detached.html
       fast/forms/validation-bubble-disappears-when-input-moved.html
       fast/forms/validation-bubble-disappears-when-input-no-longer-visible.html

* page/FrameView.cpp:
(WebCore::FrameView::viewportContentsChanged):
* page/Page.cpp:
(WebCore::Page::updateValidationBubbleStateIfNeeded):
* page/Page.h:
* page/ValidationMessageClient.h:

Source/WebKit/mac:

Make sure HTML validation bubble's state is updated after layout.
In particular, if the validation bubble's associated element has
moved or is no longer visible, we now hide the bubble.

* WebCoreSupport/WebValidationMessageClient.h:
* WebCoreSupport/WebValidationMessageClient.mm:
(WebValidationMessageClient::showValidationMessage):
(WebValidationMessageClient::hideValidationMessage):
(WebValidationMessageClient::updateValidationBubbleStateIfNeeded):

Source/WebKit2:

Make sure HTML validation bubble's state is updated after layout.
In particular, if the validation bubble's associated element has
moved or is no longer visible, we now hide the bubble.

* WebProcess/WebCoreSupport/WebValidationMessageClient.cpp:
(WebKit::WebValidationMessageClient::showValidationMessage):
(WebKit::WebValidationMessageClient::hideValidationMessage):
(WebKit::WebValidationMessageClient::updateValidationBubbleStateIfNeeded):
* WebProcess/WebCoreSupport/WebValidationMessageClient.h:

LayoutTests:

Add several layout tests to cover this.

* fast/forms/validation-bubble-disappears-when-input-detached-expected.txt: Added.
* fast/forms/validation-bubble-disappears-when-input-detached.html: Added.
* fast/forms/validation-bubble-disappears-when-input-moved-expected.txt: Added.
* fast/forms/validation-bubble-disappears-when-input-moved.html: Added.
* fast/forms/validation-bubble-disappears-when-input-no-longer-visible-expected.txt: Added.
* fast/forms/validation-bubble-disappears-when-input-no-longer-visible.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastformsvalidationcustommessageexpectedtxt">trunk/LayoutTests/fast/forms/validation-custom-message-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastformsvalidationcustommessagehtml">trunk/LayoutTests/fast/forms/validation-custom-message.html</a></li>
<li><a href="#trunkLayoutTestsfastformsvalidationmessagesexpectedtxt">trunk/LayoutTests/fast/forms/validation-messages-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastformsvalidationmessageshtml">trunk/LayoutTests/fast/forms/validation-messages.html</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorwk2fastformsvalidationmessagesexpectedtxt">trunk/LayoutTests/platform/ios-simulator-wk2/fast/forms/validation-messages-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageFrameViewcpp">trunk/Source/WebCore/page/FrameView.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePageh">trunk/Source/WebCore/page/Page.h</a></li>
<li><a href="#trunkSourceWebCorepageValidationMessageClienth">trunk/Source/WebCore/page/ValidationMessageClient.h</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebValidationMessageClienth">trunk/Source/WebKit/mac/WebCoreSupport/WebValidationMessageClient.h</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebValidationMessageClientmm">trunk/Source/WebKit/mac/WebCoreSupport/WebValidationMessageClient.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebValidationMessageClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebValidationMessageClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebValidationMessageClienth">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebValidationMessageClient.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastformsvalidationbubbledisappearswheninputdetachedexpectedtxt">trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-detached-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastformsvalidationbubbledisappearswheninputdetachedhtml">trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-detached.html</a></li>
<li><a href="#trunkLayoutTestsfastformsvalidationbubbledisappearswheninputmovedexpectedtxt">trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-moved-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastformsvalidationbubbledisappearswheninputmovedhtml">trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-moved.html</a></li>
<li><a href="#trunkLayoutTestsfastformsvalidationbubbledisappearswheninputnolongervisibleexpectedtxt">trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-no-longer-visible-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastformsvalidationbubbledisappearswheninputnolongervisiblehtml">trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-no-longer-visible.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/LayoutTests/ChangeLog        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -1,5 +1,22 @@
</span><span class="cx"> 2016-12-15  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Make sure HTML validation bubble's state is updated after layout
+        https://bugs.webkit.org/show_bug.cgi?id=165922
+        &lt;rdar://problem/29694730&gt;
+
+        Reviewed by Simon Fraser.
+
+        Add several layout tests to cover this.
+
+        * fast/forms/validation-bubble-disappears-when-input-detached-expected.txt: Added.
+        * fast/forms/validation-bubble-disappears-when-input-detached.html: Added.
+        * fast/forms/validation-bubble-disappears-when-input-moved-expected.txt: Added.
+        * fast/forms/validation-bubble-disappears-when-input-moved.html: Added.
+        * fast/forms/validation-bubble-disappears-when-input-no-longer-visible-expected.txt: Added.
+        * fast/forms/validation-bubble-disappears-when-input-no-longer-visible.html: Added.
+
+2016-12-15  Chris Dumez  &lt;cdumez@apple.com&gt;
+
</ins><span class="cx">         Move charCode / keyCode / which attributes from UIEvent to KeyboardEvent
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=165904
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsfastformsvalidationbubbledisappearswheninputdetachedexpectedtxtfromrev209900trunkLayoutTestsfastformsvalidationcustommessageexpectedtxt"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-detached-expected.txt (from rev 209900, trunk/LayoutTests/fast/forms/validation-custom-message-expected.txt) (0 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-detached-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-detached-expected.txt        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -0,0 +1,11 @@
</span><ins>+Required text input: 
+Tests that the HTML form validation bubble disappears when its associated element is detached.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS validationBubbleContents.message is &quot;Fill out this field&quot;
+PASS validationBubbleContents.message is &quot;&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsvalidationbubbledisappearswheninputdetachedhtmlfromrev209900trunkLayoutTestsfastformsvalidationcustommessagehtml"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-detached.html (from rev 209900, trunk/LayoutTests/fast/forms/validation-custom-message.html) (0 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-detached.html                                (rev 0)
+++ trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-detached.html        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;form&gt;
+  Required text input: &lt;input type=&quot;text&quot; id=&quot;required_text_input&quot; required&gt;&lt;input id=&quot;required_text_input_submit&quot; type=&quot;submit&quot;&gt;
+&lt;/form&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description(&quot;Tests that the HTML form validation bubble disappears when its associated element is detached.&quot;);
+jsTestIsAsync = true;
+
+function getValidationBubbleContents()
+{
+    return `
+    (function() {
+        return JSON.stringify(uiController.contentsOfUserInterfaceItem('validationBubble'));
+    })();`
+}
+
+onload = function() {
+    input = document.getElementById(&quot;required_text_input&quot;);
+    submit = document.getElementById(&quot;required_text_input_submit&quot;);
+    submit.click();
+
+    testRunner.runUIScript(getValidationBubbleContents(), function(result) {
+        validationBubbleContents = JSON.parse(result).validationBubble;
+        shouldBeEqualToString(&quot;validationBubbleContents.message&quot;, &quot;Fill out this field&quot;);
+
+        // Detach input element.
+        input.remove();
+        // Force layout.
+        input.offsetTop;
+
+        testRunner.runUIScript(getValidationBubbleContents(), function(result) {
+            validationBubbleContents = JSON.parse(result).validationBubble;
+            shouldBeEqualToString(&quot;validationBubbleContents.message&quot;, &quot;&quot;); // No longer visible.
+            finishJSTest();
+        });
+    });
+}
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsvalidationbubbledisappearswheninputmovedexpectedtxtfromrev209900trunkLayoutTestsfastformsvalidationcustommessageexpectedtxt"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-moved-expected.txt (from rev 209900, trunk/LayoutTests/fast/forms/validation-custom-message-expected.txt) (0 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-moved-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-moved-expected.txt        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -0,0 +1,12 @@
</span><ins>+
+Required text input: 
+Tests that the HTML form validation bubble disappears when its associated element is no longer visible.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS validationBubbleContents.message is &quot;Fill out this field&quot;
+PASS validationBubbleContents.message is &quot;&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsvalidationbubbledisappearswheninputmovedhtmlfromrev209900trunkLayoutTestsfastformsvalidationcustommessagehtml"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-moved.html (from rev 209900, trunk/LayoutTests/fast/forms/validation-custom-message.html) (0 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-moved.html                                (rev 0)
+++ trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-moved.html        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;form&gt;
+  Required text input: &lt;input type=&quot;text&quot; id=&quot;required_text_input&quot; required&gt;&lt;input id=&quot;required_text_input_submit&quot; type=&quot;submit&quot;&gt;
+&lt;/form&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description(&quot;Tests that the HTML form validation bubble disappears when its associated element is no longer visible.&quot;);
+jsTestIsAsync = true;
+
+function getValidationBubbleContents()
+{
+    return `
+    (function() {
+        return JSON.stringify(uiController.contentsOfUserInterfaceItem('validationBubble'));
+    })();`
+}
+
+onload = function() {
+    input = document.getElementById(&quot;required_text_input&quot;);
+    submit = document.getElementById(&quot;required_text_input_submit&quot;);
+    submit.click();
+
+    testRunner.runUIScript(getValidationBubbleContents(), function(result) {
+        validationBubbleContents = JSON.parse(result).validationBubble;
+        shouldBeEqualToString(&quot;validationBubbleContents.message&quot;, &quot;Fill out this field&quot;);
+
+        // Move input element.
+        document.body.prepend(document.createElement(&quot;br&quot;));
+        // Force layout.
+        input.offsetTop;
+
+        testRunner.runUIScript(getValidationBubbleContents(), function(result) {
+            validationBubbleContents = JSON.parse(result).validationBubble;
+            shouldBeEqualToString(&quot;validationBubbleContents.message&quot;, &quot;&quot;); // No longer visible.
+            finishJSTest();
+        });
+    });
+}
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsvalidationbubbledisappearswheninputnolongervisibleexpectedtxtfromrev209900trunkLayoutTestsfastformsvalidationcustommessageexpectedtxt"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-no-longer-visible-expected.txt (from rev 209900, trunk/LayoutTests/fast/forms/validation-custom-message-expected.txt) (0 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-no-longer-visible-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-no-longer-visible-expected.txt        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -0,0 +1,11 @@
</span><ins>+Required text input: 
+Tests that the HTML form validation bubble disappears when its associated element is no longer visible.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS validationBubbleContents.message is &quot;Fill out this field&quot;
+PASS validationBubbleContents.message is &quot;&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsvalidationbubbledisappearswheninputnolongervisiblehtmlfromrev209900trunkLayoutTestsfastformsvalidationcustommessagehtml"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-no-longer-visible.html (from rev 209900, trunk/LayoutTests/fast/forms/validation-custom-message.html) (0 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-no-longer-visible.html                                (rev 0)
+++ trunk/LayoutTests/fast/forms/validation-bubble-disappears-when-input-no-longer-visible.html        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;form&gt;
+  Required text input: &lt;input type=&quot;text&quot; id=&quot;required_text_input&quot; required&gt;&lt;input id=&quot;required_text_input_submit&quot; type=&quot;submit&quot;&gt;
+&lt;/form&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description(&quot;Tests that the HTML form validation bubble disappears when its associated element is no longer visible.&quot;);
+jsTestIsAsync = true;
+
+function getValidationBubbleContents()
+{
+    return `
+    (function() {
+        return JSON.stringify(uiController.contentsOfUserInterfaceItem('validationBubble'));
+    })();`
+}
+
+onload = function() {
+    input = document.getElementById(&quot;required_text_input&quot;);
+    submit = document.getElementById(&quot;required_text_input_submit&quot;);
+    submit.click();
+
+    testRunner.runUIScript(getValidationBubbleContents(), function(result) {
+        validationBubbleContents = JSON.parse(result).validationBubble;
+        shouldBeEqualToString(&quot;validationBubbleContents.message&quot;, &quot;Fill out this field&quot;);
+
+        // Hide input element.
+        input.setAttribute(&quot;style&quot;, &quot;display: none&quot;);
+        // Force layout.
+        input.offsetTop;
+
+        testRunner.runUIScript(getValidationBubbleContents(), function(result) {
+            validationBubbleContents = JSON.parse(result).validationBubble;
+            shouldBeEqualToString(&quot;validationBubbleContents.message&quot;, &quot;&quot;); // No longer visible.
+            finishJSTest();
+        });
+    });
+}
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsvalidationcustommessageexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/forms/validation-custom-message-expected.txt (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/validation-custom-message-expected.txt        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/LayoutTests/fast/forms/validation-custom-message-expected.txt        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -1,11 +1,11 @@
</span><ins>+Required text input: 
</ins><span class="cx"> Tests that the custom validation message set by JavaScript is displayed on UI side.
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> PASS validationBubbleContents.message is &quot;This is a custom validity message.&quot;
</span><span class="cx"> PASS validationBubbleContents.message is &quot;Fill out this field&quot;
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span><del>-Required text input: 
</del><ins>+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsvalidationcustommessagehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/forms/validation-custom-message.html (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/validation-custom-message.html        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/LayoutTests/fast/forms/validation-custom-message.html        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -5,6 +5,8 @@
</span><span class="cx"> &lt;form&gt;
</span><span class="cx">   Required text input: &lt;input type=&quot;text&quot; id=&quot;required_text_input&quot; required&gt;&lt;input id=&quot;required_text_input_submit&quot; type=&quot;submit&quot;&gt;
</span><span class="cx"> &lt;/form&gt;
</span><ins>+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
</ins><span class="cx"> &lt;script&gt;
</span><span class="cx"> description(&quot;Tests that the custom validation message set by JavaScript is displayed on UI side.&quot;);
</span><span class="cx"> jsTestIsAsync = true;
</span></span></pre></div>
<a id="trunkLayoutTestsfastformsvalidationmessagesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/forms/validation-messages-expected.txt (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/validation-messages-expected.txt        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/LayoutTests/fast/forms/validation-messages-expected.txt        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -1,8 +1,19 @@
</span><ins>+Required text input: 
+Required checkbox input: 
+Required radio input: 
+Required radio input:   
+Required file input: 
+Required email input: 
+Required url input: 
+Required input with pattern: 
+Required input with minlength=100: 
+Required range with min=5: 
+Required range with max=5: 
+Required range with step=3 / min=0: 
</ins><span class="cx"> Tests the HTML form validation messages being shown on UI side.
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> PASS validationBubbleContents.message is &quot;Fill out this field&quot;
</span><span class="cx"> PASS validationBubbleContents.message is &quot;Select this checkbox&quot;
</span><span class="cx"> PASS validationBubbleContents.message is &quot;Select one of these options&quot;
</span><span class="lines">@@ -17,15 +28,4 @@
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span><del>-Required text input: 
-Required checkbox input: 
-Required radio input: 
-Required radio input:   
-Required file input: 
-Required email input: 
-Required url input: 
-Required input with pattern: 
-Required input with minlength=100: 
-Required range with min=5: 
-Required range with max=5: 
-Required range with step=3 / min=0: 
</del><ins>+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastformsvalidationmessageshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/forms/validation-messages.html (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/validation-messages.html        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/LayoutTests/fast/forms/validation-messages.html        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -37,6 +37,8 @@
</span><span class="cx"> &lt;form&gt;
</span><span class="cx">   Required range with step=3 / min=0: &lt;input type=&quot;number&quot; value=&quot;10&quot; min=0 step=3 required&gt;&lt;input id=&quot;range_with_step_submit&quot; type=&quot;submit&quot;&gt;
</span><span class="cx"> &lt;/form&gt;
</span><ins>+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
</ins><span class="cx"> &lt;script&gt;
</span><span class="cx"> description(&quot;Tests the HTML form validation messages being shown on UI side.&quot;);
</span><span class="cx"> jsTestIsAsync = true;
</span></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorwk2fastformsvalidationmessagesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator-wk2/fast/forms/validation-messages-expected.txt (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator-wk2/fast/forms/validation-messages-expected.txt        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/LayoutTests/platform/ios-simulator-wk2/fast/forms/validation-messages-expected.txt        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -1,8 +1,19 @@
</span><ins>+Required text input: 
+Required checkbox input: 
+Required radio input: 
+Required radio input:   
+Required file input: 
+Required email input: 
+Required url input: 
+Required input with pattern: 
+Required input with minlength=100: 
+Required range with min=5: 
+Required range with max=5: 
+Required range with step=3 / min=0: 
</ins><span class="cx"> Tests the HTML form validation messages being shown on UI side.
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> PASS validationBubbleContents.message is &quot;Fill out this field&quot;
</span><span class="cx"> PASS validationBubbleContents.message is &quot;Select this checkbox&quot;
</span><span class="cx"> PASS validationBubbleContents.message is &quot;Select one of these options&quot;
</span><span class="lines">@@ -17,15 +28,4 @@
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span><del>-Required text input: 
-Required checkbox input: 
-Required radio input: 
-Required radio input:   
-Required file input: 
-Required email input: 
-Required url input: 
-Required input with pattern: 
-Required input with minlength=100: 
-Required range with min=5: 
-Required range with max=5: 
-Required range with step=3 / min=0: 
</del><ins>+
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebCore/ChangeLog        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2016-12-15  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Make sure HTML validation bubble's state is updated after layout
+        https://bugs.webkit.org/show_bug.cgi?id=165922
+        &lt;rdar://problem/29694730&gt;
+
+        Reviewed by Simon Fraser.
+
+        Make sure HTML validation bubble's state is updated after layout.
+        In particular, if the validation bubble's associated element has
+        moved or is no longer visible, we now hide the bubble.
+
+        Tests: fast/forms/validation-bubble-disappears-when-input-detached.html
+               fast/forms/validation-bubble-disappears-when-input-moved.html
+               fast/forms/validation-bubble-disappears-when-input-no-longer-visible.html
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::viewportContentsChanged):
+        * page/Page.cpp:
+        (WebCore::Page::updateValidationBubbleStateIfNeeded):
+        * page/Page.h:
+        * page/ValidationMessageClient.h:
+
</ins><span class="cx"> 2016-12-15  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebIDL] Remove use of Dictionary from JSCryptoAlgorithmDictionary
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.cpp (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.cpp        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebCore/page/FrameView.cpp        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -2127,6 +2127,9 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (auto* page = frame().page())
+        page-&gt;updateValidationBubbleStateIfNeeded();
+
</ins><span class="cx">     // When the viewport contents changes (scroll, resize, style recalc, layout, ...),
</span><span class="cx">     // check if we should resume animated images or unthrottle DOM timers.
</span><span class="cx">     applyRecursivelyWithVisibleRect([] (FrameView&amp; frameView, const IntRect&amp; visibleRect) {
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebCore/page/Page.cpp        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -135,6 +135,12 @@
</span><span class="cx">         function(*page);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Page::updateValidationBubbleStateIfNeeded()
+{
+    if (auto* client = validationMessageClient())
+        client-&gt;updateValidationBubbleStateIfNeeded();
+}
+
</ins><span class="cx"> static void networkStateChanged(bool isOnLine)
</span><span class="cx"> {
</span><span class="cx">     Vector&lt;Ref&lt;Frame&gt;&gt; frames;
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.h (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.h        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebCore/page/Page.h        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -215,7 +215,9 @@
</span><span class="cx"> #if ENABLE(POINTER_LOCK)
</span><span class="cx">     PointerLockController&amp; pointerLockController() const { return *m_pointerLockController; }
</span><span class="cx"> #endif
</span><ins>+
</ins><span class="cx">     ValidationMessageClient* validationMessageClient() const { return m_validationMessageClient.get(); }
</span><ins>+    void updateValidationBubbleStateIfNeeded();
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT ScrollingCoordinator* scrollingCoordinator();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepageValidationMessageClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ValidationMessageClient.h (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ValidationMessageClient.h        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebCore/page/ValidationMessageClient.h        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -47,6 +47,8 @@
</span><span class="cx">     // Returns true if the validation message for the specified anchor element
</span><span class="cx">     // is visible.
</span><span class="cx">     virtual bool isValidationMessageVisible(const Element&amp; anchor) = 0;
</span><ins>+
+    virtual void updateValidationBubbleStateIfNeeded() = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -1,5 +1,23 @@
</span><span class="cx"> 2016-12-15  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Make sure HTML validation bubble's state is updated after layout
+        https://bugs.webkit.org/show_bug.cgi?id=165922
+        &lt;rdar://problem/29694730&gt;
+
+        Reviewed by Simon Fraser.
+
+        Make sure HTML validation bubble's state is updated after layout.
+        In particular, if the validation bubble's associated element has
+        moved or is no longer visible, we now hide the bubble.
+
+        * WebCoreSupport/WebValidationMessageClient.h:
+        * WebCoreSupport/WebValidationMessageClient.mm:
+        (WebValidationMessageClient::showValidationMessage):
+        (WebValidationMessageClient::hideValidationMessage):
+        (WebValidationMessageClient::updateValidationBubbleStateIfNeeded):
+
+2016-12-15  Chris Dumez  &lt;cdumez@apple.com&gt;
+
</ins><span class="cx">         Move charCode / keyCode / which attributes from UIEvent to KeyboardEvent
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=165904
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebValidationMessageClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebValidationMessageClient.h (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebValidationMessageClient.h        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebValidationMessageClient.h        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><ins>+#import &lt;WebCore/IntRect.h&gt;
</ins><span class="cx"> #import &lt;WebCore/ValidationMessageClient.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -42,8 +43,10 @@
</span><span class="cx">     void showValidationMessage(const WebCore::Element&amp; anchor, const String&amp; message) final;
</span><span class="cx">     void hideValidationMessage(const WebCore::Element&amp; anchor) final;
</span><span class="cx">     bool isValidationMessageVisible(const WebCore::Element&amp; anchor) final;
</span><ins>+    void updateValidationBubbleStateIfNeeded() final;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     WebView* m_view;
</span><span class="cx">     const WebCore::Element* m_currentAnchor { nullptr };
</span><ins>+    WebCore::IntRect m_currentAnchorRect;
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebValidationMessageClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebValidationMessageClient.mm (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebValidationMessageClient.mm        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebValidationMessageClient.mm        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -48,7 +48,8 @@
</span><span class="cx">         hideValidationMessage(*m_currentAnchor);
</span><span class="cx"> 
</span><span class="cx">     m_currentAnchor = &amp;anchor;
</span><del>-    [m_view showFormValidationMessage:message withAnchorRect:anchor.clientRect()];
</del><ins>+    m_currentAnchorRect = anchor.clientRect();
+    [m_view showFormValidationMessage:message withAnchorRect:m_currentAnchorRect];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebValidationMessageClient::hideValidationMessage(const Element&amp; anchor)
</span><span class="lines">@@ -57,6 +58,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_currentAnchor = nullptr;
</span><ins>+    m_currentAnchorRect = { };
</ins><span class="cx">     [m_view hideFormValidationMessage];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -64,3 +66,14 @@
</span><span class="cx"> {
</span><span class="cx">     return m_currentAnchor == &amp;anchor;
</span><span class="cx"> }
</span><ins>+
+void WebValidationMessageClient::updateValidationBubbleStateIfNeeded()
+{
+    if (!m_currentAnchor)
+        return;
+
+    // We currently hide the validation bubble if its position is outdated instead of trying
+    // to update its position.
+    if (m_currentAnchorRect != m_currentAnchor-&gt;clientRect())
+        hideValidationMessage(*m_currentAnchor);
+}
</ins></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebKit2/ChangeLog        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2016-12-15  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Make sure HTML validation bubble's state is updated after layout
+        https://bugs.webkit.org/show_bug.cgi?id=165922
+        &lt;rdar://problem/29694730&gt;
+
+        Reviewed by Simon Fraser.
+
+        Make sure HTML validation bubble's state is updated after layout.
+        In particular, if the validation bubble's associated element has
+        moved or is no longer visible, we now hide the bubble.
+
+        * WebProcess/WebCoreSupport/WebValidationMessageClient.cpp:
+        (WebKit::WebValidationMessageClient::showValidationMessage):
+        (WebKit::WebValidationMessageClient::hideValidationMessage):
+        (WebKit::WebValidationMessageClient::updateValidationBubbleStateIfNeeded):
+        * WebProcess/WebCoreSupport/WebValidationMessageClient.h:
+
</ins><span class="cx"> 2016-12-15  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Improve NetworkSession logging
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebValidationMessageClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebValidationMessageClient.cpp (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebValidationMessageClient.cpp        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebValidationMessageClient.cpp        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -52,7 +52,8 @@
</span><span class="cx">         hideValidationMessage(*m_currentAnchor);
</span><span class="cx"> 
</span><span class="cx">     m_currentAnchor = &amp;anchor;
</span><del>-    m_page.send(Messages::WebPageProxy::ShowValidationMessage(anchor.clientRect(), message));
</del><ins>+    m_currentAnchorRect = anchor.clientRect();
+    m_page.send(Messages::WebPageProxy::ShowValidationMessage(m_currentAnchorRect, message));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebValidationMessageClient::hideValidationMessage(const Element&amp; anchor)
</span><span class="lines">@@ -61,6 +62,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_currentAnchor = nullptr;
</span><ins>+    m_currentAnchorRect = { };
</ins><span class="cx">     m_page.send(Messages::WebPageProxy::HideValidationMessage());
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -69,4 +71,15 @@
</span><span class="cx">     return m_currentAnchor == &amp;anchor;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebValidationMessageClient::updateValidationBubbleStateIfNeeded()
+{
+    if (!m_currentAnchor)
+        return;
+
+    // We currently hide the validation bubble if its position is outdated instead of trying
+    // to update its position.
+    if (m_currentAnchorRect != m_currentAnchor-&gt;clientRect())
+        hideValidationMessage(*m_currentAnchor);
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebValidationMessageClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebValidationMessageClient.h (209900 => 209901)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebValidationMessageClient.h        2016-12-16 03:01:14 UTC (rev 209900)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebValidationMessageClient.h        2016-12-16 03:14:52 UTC (rev 209901)
</span><span class="lines">@@ -41,10 +41,12 @@
</span><span class="cx">     void showValidationMessage(const WebCore::Element&amp; anchor, const String&amp; message) final;
</span><span class="cx">     void hideValidationMessage(const WebCore::Element&amp; anchor) final;
</span><span class="cx">     bool isValidationMessageVisible(const WebCore::Element&amp; anchor) final;
</span><ins>+    void updateValidationBubbleStateIfNeeded() final;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     WebPage&amp; m_page;
</span><span class="cx">     const WebCore::Element* m_currentAnchor { nullptr };
</span><ins>+    WebCore::IntRect m_currentAnchorRect;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>