<!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>[209445] 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/209445">209445</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2016-12-06 20:36:55 -0800 (Tue, 06 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>After preventing a beforeinput event, an input event is fired when formatting rich text
https://bugs.webkit.org/show_bug.cgi?id=165435
&lt;rdar://problem/29522314&gt;

Reviewed by Ryosuke Niwa.

Source/WebCore:

This regressed after I refactored some input event event dispatch logic when formatting text in <a href="http://trac.webkit.org/projects/webkit/changeset/208461">r208461</a>.
I moved the logic for dispatching input events when applying styles into Editor::applyStyle, but left out an
early return after firing the beforeinput event if the default behavior was prevented, which caused us to
continue on and dispatch an input event. The fix is to bail from applyStyle if default was prevented.

Augmented an existing layout test to cover this case.

* editing/Editor.cpp:
(WebCore::Editor::applyStyle):
(WebCore::Editor::applyParagraphStyle):

LayoutTests:

Augmented a layout test to verify that when preventing beforeinput events, a corresponding input event is not
fired in addition to the style not being applied to the text.

* fast/events/before-input-prevent-biu.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfasteventsbeforeinputpreventbiuhtml">trunk/LayoutTests/fast/events/before-input-prevent-biu.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreeditingEditorcpp">trunk/Source/WebCore/editing/Editor.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (209444 => 209445)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-12-07 04:26:50 UTC (rev 209444)
+++ trunk/LayoutTests/ChangeLog        2016-12-07 04:36:55 UTC (rev 209445)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2016-12-06  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        After preventing a beforeinput event, an input event is fired when formatting rich text
+        https://bugs.webkit.org/show_bug.cgi?id=165435
+        &lt;rdar://problem/29522314&gt;
+
+        Reviewed by Ryosuke Niwa.
+
+        Augmented a layout test to verify that when preventing beforeinput events, a corresponding input event is not
+        fired in addition to the style not being applied to the text.
+
+        * fast/events/before-input-prevent-biu.html:
+
</ins><span class="cx"> 2016-12-06  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix behavior of background-attachment:fixed with visual viewports
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsbeforeinputpreventbiuhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/events/before-input-prevent-biu.html (209444 => 209445)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/before-input-prevent-biu.html        2016-12-07 04:26:50 UTC (rev 209444)
+++ trunk/LayoutTests/fast/events/before-input-prevent-biu.html        2016-12-07 04:36:55 UTC (rev 209445)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> &lt;!DOCTYPE html&gt;
</span><span class="cx"> &lt;html&gt;
</span><span class="cx"> &lt;body&gt;
</span><del>-    &lt;div id=&quot;editable&quot; contenteditable onbeforeinput=handleBeforeInput(event)&gt;&lt;/div&gt;
</del><ins>+    &lt;div id=&quot;editable&quot; contenteditable onbeforeinput=handleBeforeInput(event) oninput=handleInput(event)&gt;&lt;/div&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/dump-as-markup.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script type=&quot;text/javascript&quot;&gt;
</span><span class="cx">         Markup.description(`To manually test this, turn on bold, italic and underline via the context menu, and then type some text into the contenteditable. The text should be italicized and underlined, but not bold.`);
</span><span class="lines">@@ -33,6 +33,12 @@
</span><span class="cx">             if (event.inputType === &quot;formatBold&quot;)
</span><span class="cx">                 event.preventDefault();
</span><span class="cx">         }
</span><ins>+
+        function handleInput(event)
+        {
+            if (event.inputType === &quot;formatBold&quot;)
+                Markup.dump(&quot;editable&quot;, &quot;FAILED: received input event&quot;);
+        }
</ins><span class="cx">     &lt;/script&gt;
</span><span class="cx"> &lt;/body&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (209444 => 209445)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-07 04:26:50 UTC (rev 209444)
+++ trunk/Source/WebCore/ChangeLog        2016-12-07 04:36:55 UTC (rev 209445)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2016-12-06  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        After preventing a beforeinput event, an input event is fired when formatting rich text
+        https://bugs.webkit.org/show_bug.cgi?id=165435
+        &lt;rdar://problem/29522314&gt;
+
+        Reviewed by Ryosuke Niwa.
+
+        This regressed after I refactored some input event event dispatch logic when formatting text in r208461.
+        I moved the logic for dispatching input events when applying styles into Editor::applyStyle, but left out an
+        early return after firing the beforeinput event if the default behavior was prevented, which caused us to
+        continue on and dispatch an input event. The fix is to bail from applyStyle if default was prevented.
+
+        Augmented an existing layout test to cover this case.
+
+        * editing/Editor.cpp:
+        (WebCore::Editor::applyStyle):
+        (WebCore::Editor::applyParagraphStyle):
+
</ins><span class="cx"> 2016-12-06  Antoine Quint  &lt;graouts@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Modern Media Controls] Instantiate iOS media controls
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingEditorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/Editor.cpp (209444 => 209445)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/Editor.cpp        2016-12-07 04:26:50 UTC (rev 209444)
+++ trunk/Source/WebCore/editing/Editor.cpp        2016-12-07 04:36:55 UTC (rev 209445)
</span><span class="lines">@@ -792,17 +792,18 @@
</span><span class="cx">     String inputTypeName = inputTypeNameForEditingAction(editingAction);
</span><span class="cx">     String inputEventData = inputEventDataForEditingStyleAndAction(*style, editingAction);
</span><span class="cx">     RefPtr&lt;Element&gt; element = m_frame.selection().selection().rootEditableElement();
</span><del>-    if (!element || dispatchBeforeInputEvent(*element, inputTypeName, inputEventData)) {
-        switch(selectionType) {
-        case VisibleSelection::CaretSelection:
-            computeAndSetTypingStyle(*style, editingAction);
-            break;
-        case VisibleSelection::RangeSelection:
-            applyCommand(ApplyStyleCommand::create(document(), style.get(), editingAction));
-            break;
-        default:
-            break;
-        }
</del><ins>+    if (element &amp;&amp; !dispatchBeforeInputEvent(*element, inputTypeName, inputEventData))
+        return;
+
+    switch (selectionType) {
+    case VisibleSelection::CaretSelection:
+        computeAndSetTypingStyle(*style, editingAction);
+        break;
+    case VisibleSelection::RangeSelection:
+        applyCommand(ApplyStyleCommand::create(document(), style.get(), editingAction));
+        break;
+    default:
+        break;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     client()-&gt;didApplyStyle();
</span><span class="lines">@@ -826,9 +827,10 @@
</span><span class="cx"> 
</span><span class="cx">     String inputTypeName = inputTypeNameForEditingAction(editingAction);
</span><span class="cx">     RefPtr&lt;Element&gt; element = m_frame.selection().selection().rootEditableElement();
</span><del>-    if (!element || dispatchBeforeInputEvent(*element, inputTypeName))
-        applyCommand(ApplyStyleCommand::create(document(), EditingStyle::create(style).ptr(), editingAction, ApplyStyleCommand::ForceBlockProperties));
</del><ins>+    if (element &amp;&amp; !dispatchBeforeInputEvent(*element, inputTypeName))
+        return;
</ins><span class="cx"> 
</span><ins>+    applyCommand(ApplyStyleCommand::create(document(), EditingStyle::create(style).ptr(), editingAction, ApplyStyleCommand::ForceBlockProperties));
</ins><span class="cx">     client()-&gt;didApplyStyle();
</span><span class="cx">     if (element)
</span><span class="cx">         dispatchInputEvent(*element, inputTypeName);
</span></span></pre>
</div>
</div>

</body>
</html>