<!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>[248463] trunk/Source/WebCore</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/248463">248463</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2019-08-09 00:17:44 -0700 (Fri, 09 Aug 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION (iOS 13): united.com web forms do not respond to taps
https://bugs.webkit.org/show_bug.cgi?id=200531

Reviewed by Antti Koivisto and Wenson Hsieh.

The bug is caused by the content change observer detecting “Site Feedback” link at the bottom of
the page (https://www.united.com/ual/en/US/account/enroll/default) constantly getting re-generated
in every frame via requestAnimationFrame when the page is opened with iPhone UA string.
Note that the content re-generation can be reproduced even in Chrome if iPhone UA string is used.

Ignore this constant content change in ContentChangeObserver as a site specific quirk.

In the future, we should make ContentChangeObserver observe the final location of each element
being observed so that we can ignore content that like this which is placed outside the viewport,
and/or far away from where the user tapped.

* page/Quirks.cpp:
(WebCore::Quirks::shouldIgnoreContentChange const): Added.
* page/Quirks.h:
* page/ios/ContentChangeObserver.cpp:
(WebCore::ContentChangeObserver::shouldObserveVisibilityChangeForElement):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageQuirkscpp">trunk/Source/WebCore/page/Quirks.cpp</a></li>
<li><a href="#trunkSourceWebCorepageQuirksh">trunk/Source/WebCore/page/Quirks.h</a></li>
<li><a href="#trunkSourceWebCorepageiosContentChangeObservercpp">trunk/Source/WebCore/page/ios/ContentChangeObserver.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (248462 => 248463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2019-08-09 05:51:44 UTC (rev 248462)
+++ trunk/Source/WebCore/ChangeLog      2019-08-09 07:17:44 UTC (rev 248463)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2019-08-09  Ryosuke Niwa  <rniwa@webkit.org>
+
+        REGRESSION (iOS 13): united.com web forms do not respond to taps
+        https://bugs.webkit.org/show_bug.cgi?id=200531
+
+        Reviewed by Antti Koivisto and Wenson Hsieh.
+
+        The bug is caused by the content change observer detecting “Site Feedback” link at the bottom of
+        the page (https://www.united.com/ual/en/US/account/enroll/default) constantly getting re-generated
+        in every frame via requestAnimationFrame when the page is opened with iPhone UA string.
+        Note that the content re-generation can be reproduced even in Chrome if iPhone UA string is used.
+
+        Ignore this constant content change in ContentChangeObserver as a site specific quirk.
+
+        In the future, we should make ContentChangeObserver observe the final location of each element
+        being observed so that we can ignore content that like this which is placed outside the viewport,
+        and/or far away from where the user tapped.
+
+        * page/Quirks.cpp:
+        (WebCore::Quirks::shouldIgnoreContentChange const): Added.
+        * page/Quirks.h:
+        * page/ios/ContentChangeObserver.cpp:
+        (WebCore::ContentChangeObserver::shouldObserveVisibilityChangeForElement):
+
</ins><span class="cx"> 2019-08-08  Devin Rousso  <drousso@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Page: don't allow the domain to be disabled
</span></span></pre></div>
<a id="trunkSourceWebCorepageQuirkscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Quirks.cpp (248462 => 248463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Quirks.cpp     2019-08-09 05:51:44 UTC (rev 248462)
+++ trunk/Source/WebCore/page/Quirks.cpp        2019-08-09 07:17:44 UTC (rev 248463)
</span><span class="lines">@@ -410,6 +410,30 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Quirks::shouldIgnoreContentChange(const Element& element) const
+{
+#if PLATFORM(IOS_FAMILY)
+    if (!needsQuirks())
+        return false;
+
+    auto* parentElement = element.parentElement();
+    if (!parentElement || !parentElement->hasClass())
+        return false;
+
+    DOMTokenList& classList = parentElement->classList();
+    if (!classList.contains("feedback") || !classList.contains("feedback-mid"))
+        return false;
+
+    if (!equalLettersIgnoringASCIICase(topPrivatelyControlledDomain(m_document->url().host().toString()), "united.com"))
+        return false;
+
+    return true;
+#else
+    UNUSED_PARAM(element);
+    return false;
+#endif
+}
+
</ins><span class="cx"> // FIXME(<rdar://problem/50394969>): Remove after desmos.com adopts inputmode="none".
</span><span class="cx"> bool Quirks::needsInputModeNoneImplicitly(const HTMLElement& element) const
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCorepageQuirksh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Quirks.h (248462 => 248463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Quirks.h       2019-08-09 05:51:44 UTC (rev 248462)
+++ trunk/Source/WebCore/page/Quirks.h  2019-08-09 07:17:44 UTC (rev 248463)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class Document;
</span><ins>+class Element;
</ins><span class="cx"> class EventTarget;
</span><span class="cx"> class HTMLElement;
</span><span class="cx"> class LayoutUnit;
</span><span class="lines">@@ -55,6 +56,7 @@
</span><span class="cx">     Optional<Event::IsCancelable> simulatedMouseEventTypeForTarget(EventTarget*) const;
</span><span class="cx"> #endif
</span><span class="cx">     bool shouldDisablePointerEventsQuirk() const;
</span><ins>+    bool shouldIgnoreContentChange(const Element&) const;
</ins><span class="cx">     bool needsInputModeNoneImplicitly(const HTMLElement&) const;
</span><span class="cx">     bool needsDeferKeyDownAndKeyPressTimersUntilNextEditingCommand() const;
</span><span class="cx">     bool shouldLightenJapaneseBoldSansSerif() const;
</span></span></pre></div>
<a id="trunkSourceWebCorepageiosContentChangeObservercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ios/ContentChangeObserver.cpp (248462 => 248463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ios/ContentChangeObserver.cpp  2019-08-09 05:51:44 UTC (rev 248462)
+++ trunk/Source/WebCore/page/ios/ContentChangeObserver.cpp     2019-08-09 07:17:44 UTC (rev 248463)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include "Logging.h"
</span><span class="cx"> #include "NodeRenderStyle.h"
</span><span class="cx"> #include "Page.h"
</span><ins>+#include "Quirks.h"
</ins><span class="cx"> #include "RenderDescendantIterator.h"
</span><span class="cx"> #include "Settings.h"
</span><span class="cx"> 
</span><span class="lines">@@ -596,7 +597,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool ContentChangeObserver::shouldObserveVisibilityChangeForElement(const Element& element)
</span><span class="cx"> {
</span><del>-    return isObservingContentChanges() && !hasVisibleChangeState() && !visibleRendererWasDestroyed(element);
</del><ins>+    return isObservingContentChanges() && !hasVisibleChangeState() && !visibleRendererWasDestroyed(element) && !element.document().quirks().shouldIgnoreContentChange(element);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ContentChangeObserver::StyleChangeScope::StyleChangeScope(Document& document, const Element& element)
</span></span></pre>
</div>
</div>

</body>
</html>