<!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>[207841] 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/207841">207841</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2016-10-25 13:23:10 -0700 (Tue, 25 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Support InputEvent.dataTransfer for the InputEvent spec
https://bugs.webkit.org/show_bug.cgi?id=163213
&lt;rdar://problem/28700407&gt;

Reviewed by Ryosuke Niwa.

Source/WebCore:

Adds support for the dataTransfer attribute of InputEvent, which contains both HTML and plain text
representations of inserted content corresponding to input types &quot;insertFromPaste&quot;, &quot;insertFromDrop&quot; and
&quot;insertReplacementText&quot;. The specification calls for the data transfer's drag data item list to contain this
information via two entries with type strings &quot;text/html&quot; and &quot;text/plain&quot;. However, WebKit does not yet support
the DataTransfer.items -- in lieu of this, we will provide this information for now via getData(&quot;text/plain&quot;)
and getData(&quot;text/html&quot;), respectively.

To support this attribute, we need a special type of DataTransfer which is readonly and returns canned data
given a type string. To implement this, we introduce StaticPasteboard, a type of Pasteboard which is initialized
with a map of type string to data. When asked for its data via getData, the StaticPasteboard searches its map
for the requested type and returns the result, if any.

An editing command may now create a new DataTransfer via DataTransfer::createForInputEvent from HTML and
plaintext strings, and then vend this information to its dispatched input events by overriding
CompositeEditCommand::inputEventDataTransfer.

Some further work will be needed to ensure that all information exposed via this DataTransfer does not contain
hidden content. To do this, we should create a new Document, &quot;paste&quot; the contents of our copied HTML string into
it, then simulate selecting the content and generating markup from the selection to create a sanitized
DocumentFragment corresponding to the original copied HTML. This will be addressed in a future patch.

Tests: fast/events/input-events-paste-rich-datatransfer.html
       fast/events/input-events-spell-checking-datatransfer.html

* PlatformEfl.cmake:
* PlatformGTK.cmake:
* PlatformWin.cmake:

Add StaticPasteboard.cpp.

* WebCore.xcodeproj/project.pbxproj:
* dom/DataTransfer.cpp:
(WebCore::DataTransfer::DataTransfer):
(WebCore::DataTransfer::createForInputEvent):

Initializes a new DataTransfer for the purposes of input events. This takes a HTML and plain text
representations of the data being inserted and creates a new readonly DataTransfer backed by a StaticPasteboard
that only knows how to map the &quot;text/plain&quot; data type to the given plaintext string and &quot;text/html&quot; to the
given HTML text.

* dom/DataTransfer.h:
* dom/InputEvent.cpp:
(WebCore::InputEvent::create):
(WebCore::InputEvent::InputEvent):
(WebCore::InputEvent::dataTransfer):
* dom/InputEvent.h:
* dom/InputEvent.idl:

Add the InputEvent.dataTransfer attribute.

* dom/Node.cpp:
* editing/CompositeEditCommand.cpp:
(WebCore::CompositeEditCommand::inputEventDataTransfer):

Add a new hook for CompositeEditCommands to vend a DataTransfer for the purposes of input events. By default,
this is null.

* editing/CompositeEditCommand.h:
* editing/Editor.cpp:
(WebCore::dispatchBeforeInputEvent):
(WebCore::dispatchInputEvent):
(WebCore::dispatchBeforeInputEvents):
(WebCore::dispatchInputEvents):
(WebCore::Editor::willApplyEditing):
(WebCore::Editor::appliedEditing):
* editing/ReplaceRangeWithTextCommand.cpp:
(WebCore::ReplaceRangeWithTextCommand::willApplyCommand):
(WebCore::ReplaceRangeWithTextCommand::doApply):
(WebCore::ReplaceRangeWithTextCommand::inputEventDataTransfer):
* editing/ReplaceRangeWithTextCommand.h:
* editing/ReplaceSelectionCommand.cpp:
(WebCore::ReplaceSelectionCommand::willApplyCommand):

Initialize the ReplacementFragment here before applying the command, adjusting the DocumentFragment to be
inserted in the process.

(WebCore::ReplaceSelectionCommand::doApply):
(WebCore::ReplaceSelectionCommand::inputEventDataTransfer):
(WebCore::ReplaceSelectionCommand::ensureReplacementFragment):

Returns the ReplacementFragment used to apply the command, initializing it if necessary and stripping extraneous
nodes off of the document fragment in the process. Since ReplaceSelectionCommand may be used as a top-level
editing command or a child of another CompositeEditCommand such as the ReplaceRangeWithTextCommand, the
ReplacementFragment may be initialized either in willApplyCommand or in doApply.

* editing/ReplaceSelectionCommand.h:
* editing/SpellingCorrectionCommand.cpp:
(WebCore::SpellingCorrectionCommand::willApplyCommand):
(WebCore::SpellingCorrectionCommand::doApply):
(WebCore::SpellingCorrectionCommand::inputEventDataTransfer):
* editing/SpellingCorrectionCommand.h:

Using the replacement text fragment, create and return a DataTransfer for input events.

* platform/Pasteboard.h:
* platform/StaticPasteboard.cpp: Added.
(WebCore::StaticPasteboard::create):
(WebCore::StaticPasteboard::StaticPasteboard):
(WebCore::StaticPasteboard::hasData):
(WebCore::StaticPasteboard::types):
(WebCore::StaticPasteboard::readString):
* platform/StaticPasteboard.h: Copied from Source/WebCore/dom/InputEvent.cpp.
* platform/efl/PasteboardEfl.cpp:
(WebCore::Pasteboard::writeMarkup):
(WebCore::Pasteboard::write):
(WebCore::Pasteboard::read):
* platform/gtk/PasteboardGtk.cpp:
(WebCore::Pasteboard::writeMarkup):
* platform/ios/PasteboardIOS.mm:
(WebCore::Pasteboard::writeMarkup):
* platform/mac/PasteboardMac.mm:
(WebCore::Pasteboard::Pasteboard):
(WebCore::Pasteboard::writeMarkup):
* platform/win/PasteboardWin.cpp:
(WebCore::Pasteboard::write):
(WebCore::Pasteboard::read):

To account for virtual methods on Pasteboard, add implementations for methods that were previously defined but
unimplemented on these platforms.

LayoutTests:

Adds 2 new layout tests verifying that input events dispatched as a result of pasting or spell checking contain
DataTransfers that have rich and plain text representations of the contents being inserted.

* fast/events/input-events-fired-when-typing-expected.txt:
* fast/events/input-events-fired-when-typing.html:
* fast/events/input-events-paste-rich-datatransfer-expected.txt: Added.
* fast/events/input-events-paste-rich-datatransfer.html: Added.
* fast/events/input-events-spell-checking-datatransfer-expected.txt: Added.
* fast/events/input-events-spell-checking-datatransfer.html: Added.
* platform/ios-simulator/TestExpectations:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfasteventsinputeventsfiredwhentypingexpectedtxt">trunk/LayoutTests/fast/events/input-events-fired-when-typing-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsinputeventsfiredwhentypinghtml">trunk/LayoutTests/fast/events/input-events-fired-when-typing.html</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="#trunkSourceWebCorePlatformEflcmake">trunk/Source/WebCore/PlatformEfl.cmake</a></li>
<li><a href="#trunkSourceWebCorePlatformGTKcmake">trunk/Source/WebCore/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebCorePlatformWincmake">trunk/Source/WebCore/PlatformWin.cmake</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoredomDataTransfercpp">trunk/Source/WebCore/dom/DataTransfer.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDataTransferh">trunk/Source/WebCore/dom/DataTransfer.h</a></li>
<li><a href="#trunkSourceWebCoredomInputEventcpp">trunk/Source/WebCore/dom/InputEvent.cpp</a></li>
<li><a href="#trunkSourceWebCoredomInputEventh">trunk/Source/WebCore/dom/InputEvent.h</a></li>
<li><a href="#trunkSourceWebCoredomInputEventidl">trunk/Source/WebCore/dom/InputEvent.idl</a></li>
<li><a href="#trunkSourceWebCoredomNodecpp">trunk/Source/WebCore/dom/Node.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingCompositeEditCommandcpp">trunk/Source/WebCore/editing/CompositeEditCommand.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingCompositeEditCommandh">trunk/Source/WebCore/editing/CompositeEditCommand.h</a></li>
<li><a href="#trunkSourceWebCoreeditingEditorcpp">trunk/Source/WebCore/editing/Editor.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingReplaceRangeWithTextCommandcpp">trunk/Source/WebCore/editing/ReplaceRangeWithTextCommand.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingReplaceRangeWithTextCommandh">trunk/Source/WebCore/editing/ReplaceRangeWithTextCommand.h</a></li>
<li><a href="#trunkSourceWebCoreeditingReplaceSelectionCommandcpp">trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingReplaceSelectionCommandh">trunk/Source/WebCore/editing/ReplaceSelectionCommand.h</a></li>
<li><a href="#trunkSourceWebCoreeditingSpellingCorrectionCommandcpp">trunk/Source/WebCore/editing/SpellingCorrectionCommand.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingSpellingCorrectionCommandh">trunk/Source/WebCore/editing/SpellingCorrectionCommand.h</a></li>
<li><a href="#trunkSourceWebCoreplatformPasteboardh">trunk/Source/WebCore/platform/Pasteboard.h</a></li>
<li><a href="#trunkSourceWebCoreplatformeflPasteboardEflcpp">trunk/Source/WebCore/platform/efl/PasteboardEfl.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgtkPasteboardGtkcpp">trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformiosPasteboardIOSmm">trunk/Source/WebCore/platform/ios/PasteboardIOS.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmacPasteboardMacmm">trunk/Source/WebCore/platform/mac/PasteboardMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformwinPasteboardWincpp">trunk/Source/WebCore/platform/win/PasteboardWin.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasteventsinputeventspasterichdatatransferexpectedtxt">trunk/LayoutTests/fast/events/input-events-paste-rich-datatransfer-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsinputeventspasterichdatatransferhtml">trunk/LayoutTests/fast/events/input-events-paste-rich-datatransfer.html</a></li>
<li><a href="#trunkLayoutTestsfasteventsinputeventsspellcheckingdatatransferexpectedtxt">trunk/LayoutTests/fast/events/input-events-spell-checking-datatransfer-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsinputeventsspellcheckingdatatransferhtml">trunk/LayoutTests/fast/events/input-events-spell-checking-datatransfer.html</a></li>
<li><a href="#trunkSourceWebCoreplatformStaticPasteboardcpp">trunk/Source/WebCore/platform/StaticPasteboard.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformStaticPasteboardh">trunk/Source/WebCore/platform/StaticPasteboard.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/LayoutTests/ChangeLog        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2016-10-25  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        Support InputEvent.dataTransfer for the InputEvent spec
+        https://bugs.webkit.org/show_bug.cgi?id=163213
+        &lt;rdar://problem/28700407&gt;
+
+        Reviewed by Ryosuke Niwa.
+
+        Adds 2 new layout tests verifying that input events dispatched as a result of pasting or spell checking contain
+        DataTransfers that have rich and plain text representations of the contents being inserted.
+
+        * fast/events/input-events-fired-when-typing-expected.txt:
+        * fast/events/input-events-fired-when-typing.html:
+        * fast/events/input-events-paste-rich-datatransfer-expected.txt: Added.
+        * fast/events/input-events-paste-rich-datatransfer.html: Added.
+        * fast/events/input-events-spell-checking-datatransfer-expected.txt: Added.
+        * fast/events/input-events-spell-checking-datatransfer.html: Added.
+        * platform/ios-simulator/TestExpectations:
+
</ins><span class="cx"> 2016-10-25  Andy Estes  &lt;aestes@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Implement rel=noopener
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsinputeventsfiredwhentypingexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/events/input-events-fired-when-typing-expected.txt (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/input-events-fired-when-typing-expected.txt        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/LayoutTests/fast/events/input-events-fired-when-typing-expected.txt        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -4,6 +4,7 @@
</span><span class="cx"> Fired `onbeforeinput`!
</span><span class="cx"> PASS event.__lookupGetter__('inputType') is defined.
</span><span class="cx"> PASS event.__lookupGetter__('data') is defined.
</span><ins>+PASS event.__lookupGetter__('dataTransfer') is defined.
</ins><span class="cx"> PASS event.getTargetRanges is defined.
</span><span class="cx"> PASS event.target.id is expectedTargetID
</span><span class="cx"> PASS event.bubbles is true
</span><span class="lines">@@ -12,6 +13,7 @@
</span><span class="cx"> Fired `oninput`!
</span><span class="cx"> PASS event.__lookupGetter__('inputType') is defined.
</span><span class="cx"> PASS event.__lookupGetter__('data') is defined.
</span><ins>+PASS event.__lookupGetter__('dataTransfer') is defined.
</ins><span class="cx"> PASS event.getTargetRanges is defined.
</span><span class="cx"> PASS event.target.id is expectedTargetID
</span><span class="cx"> PASS event.bubbles is true
</span><span class="lines">@@ -20,6 +22,7 @@
</span><span class="cx"> Fired `onbeforeinput`!
</span><span class="cx"> PASS event.__lookupGetter__('inputType') is defined.
</span><span class="cx"> PASS event.__lookupGetter__('data') is defined.
</span><ins>+PASS event.__lookupGetter__('dataTransfer') is defined.
</ins><span class="cx"> PASS event.getTargetRanges is defined.
</span><span class="cx"> PASS event.target.id is expectedTargetID
</span><span class="cx"> PASS event.bubbles is true
</span><span class="lines">@@ -28,6 +31,7 @@
</span><span class="cx"> Fired `oninput`!
</span><span class="cx"> PASS event.__lookupGetter__('inputType') is defined.
</span><span class="cx"> PASS event.__lookupGetter__('data') is defined.
</span><ins>+PASS event.__lookupGetter__('dataTransfer') is defined.
</ins><span class="cx"> PASS event.getTargetRanges is defined.
</span><span class="cx"> PASS event.target.id is expectedTargetID
</span><span class="cx"> PASS event.bubbles is true
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsinputeventsfiredwhentypinghtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/events/input-events-fired-when-typing.html (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/input-events-fired-when-typing.html        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/LayoutTests/fast/events/input-events-fired-when-typing.html        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx">             debug(&quot;Fired `oninput`!&quot;);
</span><span class="cx">             shouldBeDefined(&quot;event.__lookupGetter__('inputType')&quot;);
</span><span class="cx">             shouldBeDefined(&quot;event.__lookupGetter__('data')&quot;);
</span><ins>+            shouldBeDefined(&quot;event.__lookupGetter__('dataTransfer')&quot;);
</ins><span class="cx">             shouldBeDefined(&quot;event.getTargetRanges&quot;);
</span><span class="cx">             shouldBe(&quot;event.target.id&quot;, &quot;expectedTargetID&quot;);
</span><span class="cx">             shouldBe(&quot;event.bubbles&quot;, &quot;true&quot;);
</span><span class="lines">@@ -48,6 +49,7 @@
</span><span class="cx">             debug(&quot;Fired `onbeforeinput`!&quot;);
</span><span class="cx">             shouldBeDefined(&quot;event.__lookupGetter__('inputType')&quot;);
</span><span class="cx">             shouldBeDefined(&quot;event.__lookupGetter__('data')&quot;);
</span><ins>+            shouldBeDefined(&quot;event.__lookupGetter__('dataTransfer')&quot;);
</ins><span class="cx">             shouldBeDefined(&quot;event.getTargetRanges&quot;);
</span><span class="cx">             shouldBe(&quot;event.target.id&quot;, &quot;expectedTargetID&quot;);
</span><span class="cx">             shouldBe(&quot;event.bubbles&quot;, &quot;true&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsinputeventspasterichdatatransferexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/input-events-paste-rich-datatransfer-expected.txt (0 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/input-events-paste-rich-datatransfer-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/input-events-paste-rich-datatransfer-expected.txt        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+To manually test this, copy and paste into the first contenteditable. The following contenteditables should reflect the pasted contents.
+
+destination after pasting (text/html):
+| &lt;b&gt;
+|   style=&quot;color: rgb(255, 0, 0); font-family: -webkit-standard; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;&quot;
+|   &quot;LayoutTests&quot;
+|   &lt;i&gt;
+|     &quot;are&quot;
+|     &lt;u&gt;
+|       &quot;fun!&quot;
+
+destination after pasting (text/plain):
+| &quot;LayoutTestsarefun!&quot;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsinputeventspasterichdatatransferhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/input-events-paste-rich-datatransfer.html (0 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/input-events-paste-rich-datatransfer.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/input-events-paste-rich-datatransfer.html        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+    &lt;div id=&quot;source&quot; contenteditable onbeforeinput=beforeInput(event)&gt;&lt;span style=&quot;color:red&quot;&gt;&lt;b&gt;LayoutTests&lt;i&gt;are&lt;u&gt;fun!&lt;/i&gt;&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
+    &lt;div id=&quot;destinationHTML&quot; contenteditable&gt;&lt;/div&gt;
+    &lt;div id=&quot;destinationPlain&quot; contenteditable&gt;&lt;/div&gt;
+    &lt;script src=&quot;../../resources/dump-as-markup.js&quot;&gt;&lt;/script&gt;
+    &lt;script&gt;
+        Markup.description(`To manually test this, copy and paste into the first contenteditable. The following contenteditables should reflect the pasted contents.`);
+        source.focus();
+        document.execCommand(&quot;selectAll&quot;, false, null);
+
+        if (window.internals)
+            internals.settings.setInputEventsEnabled(true);
+
+        if (window.testRunner) {
+            testRunner.execCommand(&quot;Cut&quot;);
+            testRunner.execCommand(&quot;Paste&quot;);
+        }
+        source.blur();
+
+        Markup.dump(&quot;destinationHTML&quot;, &quot;destination after pasting (text/html)&quot;);
+        Markup.dump(&quot;destinationPlain&quot;, &quot;destination after pasting (text/plain)&quot;);
+
+        function beforeInput(event)
+        {
+            if (event.inputType !== &quot;insertFromPaste&quot;)
+                return;
+
+            destinationHTML.innerHTML = event.dataTransfer.getData(&quot;text/html&quot;);
+            destinationPlain.textContent = event.dataTransfer.getData(&quot;text/plain&quot;);
+            event.preventDefault();
+        }
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsinputeventsspellcheckingdatatransferexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/input-events-spell-checking-datatransfer-expected.txt (0 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/input-events-spell-checking-datatransfer-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/input-events-spell-checking-datatransfer-expected.txt        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+To manually test this, make a typo in the first contenteditable and use spell checking to correct it. The corrected value should appear below.
+
+after autocorrection:
+| &quot;&lt;p&gt;escape me!&lt;/p&gt;&quot;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsinputeventsspellcheckingdatatransferhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/input-events-spell-checking-datatransfer.html (0 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/input-events-spell-checking-datatransfer.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/input-events-spell-checking-datatransfer.html        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+    &lt;div id=&quot;source&quot; contenteditable onbeforeinput=beforeInput(event)&gt;&lt;/div&gt;
+    &lt;div id=&quot;destination&quot; contenteditable&gt;&lt;/div&gt;
+    &lt;script src=&quot;../../resources/dump-as-markup.js&quot;&gt;&lt;/script&gt;
+    &lt;script&gt;
+        Markup.description(`To manually test this, make a typo in the first contenteditable and use spell checking to correct it. The corrected value should appear below.`);
+        source.focus();
+
+        if (window.internals &amp;&amp; window.eventSender) {
+            internals.settings.setInputEventsEnabled(true);
+            eventSender.keyDown(&quot;e&quot;, []);
+            eventSender.keyDown(&quot;s&quot;, []);
+            eventSender.keyDown(&quot;c&quot;, []);
+            internals.handleAcceptedCandidate(&quot;&lt;p&gt;escape me!&lt;/p&gt;&quot;, 0, 3);
+        }
+
+        Markup.dump(&quot;destination&quot;, &quot;after autocorrection&quot;);
+
+        function beforeInput(event)
+        {
+            if (!event.dataTransfer)
+                return;
+
+            destination.innerHTML = event.dataTransfer.getData(&quot;text/html&quot;);
+            event.preventDefault();
+        }
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator/TestExpectations (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator/TestExpectations        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/LayoutTests/platform/ios-simulator/TestExpectations        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -1211,6 +1211,8 @@
</span><span class="cx"> fast/events/input-events-forecolor-data.html [ Failure ]
</span><span class="cx"> fast/events/input-events-ime-recomposition.html [ Failure ]
</span><span class="cx"> fast/events/input-events-ime-composition.html [ Failure ]
</span><ins>+fast/events/input-events-paste-rich-datatransfer.html [ Failure ]
+fast/events/input-events-spell-checking-datatransfer.html [ Failure ]
</ins><span class="cx"> fast/events/before-input-events-prevent-default.html [ Failure ]
</span><span class="cx"> fast/events/before-input-events-prevent-default-in-textfield.html [ Failure ]
</span><span class="cx"> fast/events/before-input-events-different-start-end-elements.html [ Failure ]
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/ChangeLog        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -1,3 +1,131 @@
</span><ins>+2016-10-25  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        Support InputEvent.dataTransfer for the InputEvent spec
+        https://bugs.webkit.org/show_bug.cgi?id=163213
+        &lt;rdar://problem/28700407&gt;
+
+        Reviewed by Ryosuke Niwa.
+
+        Adds support for the dataTransfer attribute of InputEvent, which contains both HTML and plain text
+        representations of inserted content corresponding to input types &quot;insertFromPaste&quot;, &quot;insertFromDrop&quot; and
+        &quot;insertReplacementText&quot;. The specification calls for the data transfer's drag data item list to contain this
+        information via two entries with type strings &quot;text/html&quot; and &quot;text/plain&quot;. However, WebKit does not yet support
+        the DataTransfer.items -- in lieu of this, we will provide this information for now via getData(&quot;text/plain&quot;)
+        and getData(&quot;text/html&quot;), respectively.
+
+        To support this attribute, we need a special type of DataTransfer which is readonly and returns canned data
+        given a type string. To implement this, we introduce StaticPasteboard, a type of Pasteboard which is initialized
+        with a map of type string to data. When asked for its data via getData, the StaticPasteboard searches its map
+        for the requested type and returns the result, if any.
+
+        An editing command may now create a new DataTransfer via DataTransfer::createForInputEvent from HTML and
+        plaintext strings, and then vend this information to its dispatched input events by overriding
+        CompositeEditCommand::inputEventDataTransfer.
+
+        Some further work will be needed to ensure that all information exposed via this DataTransfer does not contain
+        hidden content. To do this, we should create a new Document, &quot;paste&quot; the contents of our copied HTML string into
+        it, then simulate selecting the content and generating markup from the selection to create a sanitized
+        DocumentFragment corresponding to the original copied HTML. This will be addressed in a future patch.
+
+        Tests: fast/events/input-events-paste-rich-datatransfer.html
+               fast/events/input-events-spell-checking-datatransfer.html
+
+        * PlatformEfl.cmake:
+        * PlatformGTK.cmake:
+        * PlatformWin.cmake:
+
+        Add StaticPasteboard.cpp.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * dom/DataTransfer.cpp:
+        (WebCore::DataTransfer::DataTransfer):
+        (WebCore::DataTransfer::createForInputEvent):
+
+        Initializes a new DataTransfer for the purposes of input events. This takes a HTML and plain text
+        representations of the data being inserted and creates a new readonly DataTransfer backed by a StaticPasteboard
+        that only knows how to map the &quot;text/plain&quot; data type to the given plaintext string and &quot;text/html&quot; to the
+        given HTML text.
+
+        * dom/DataTransfer.h:
+        * dom/InputEvent.cpp:
+        (WebCore::InputEvent::create):
+        (WebCore::InputEvent::InputEvent):
+        (WebCore::InputEvent::dataTransfer):
+        * dom/InputEvent.h:
+        * dom/InputEvent.idl:
+
+        Add the InputEvent.dataTransfer attribute.
+
+        * dom/Node.cpp:
+        * editing/CompositeEditCommand.cpp:
+        (WebCore::CompositeEditCommand::inputEventDataTransfer):
+
+        Add a new hook for CompositeEditCommands to vend a DataTransfer for the purposes of input events. By default,
+        this is null.
+
+        * editing/CompositeEditCommand.h:
+        * editing/Editor.cpp:
+        (WebCore::dispatchBeforeInputEvent):
+        (WebCore::dispatchInputEvent):
+        (WebCore::dispatchBeforeInputEvents):
+        (WebCore::dispatchInputEvents):
+        (WebCore::Editor::willApplyEditing):
+        (WebCore::Editor::appliedEditing):
+        * editing/ReplaceRangeWithTextCommand.cpp:
+        (WebCore::ReplaceRangeWithTextCommand::willApplyCommand):
+        (WebCore::ReplaceRangeWithTextCommand::doApply):
+        (WebCore::ReplaceRangeWithTextCommand::inputEventDataTransfer):
+        * editing/ReplaceRangeWithTextCommand.h:
+        * editing/ReplaceSelectionCommand.cpp:
+        (WebCore::ReplaceSelectionCommand::willApplyCommand):
+
+        Initialize the ReplacementFragment here before applying the command, adjusting the DocumentFragment to be
+        inserted in the process.
+
+        (WebCore::ReplaceSelectionCommand::doApply):
+        (WebCore::ReplaceSelectionCommand::inputEventDataTransfer):
+        (WebCore::ReplaceSelectionCommand::ensureReplacementFragment):
+
+        Returns the ReplacementFragment used to apply the command, initializing it if necessary and stripping extraneous
+        nodes off of the document fragment in the process. Since ReplaceSelectionCommand may be used as a top-level
+        editing command or a child of another CompositeEditCommand such as the ReplaceRangeWithTextCommand, the
+        ReplacementFragment may be initialized either in willApplyCommand or in doApply.
+
+        * editing/ReplaceSelectionCommand.h:
+        * editing/SpellingCorrectionCommand.cpp:
+        (WebCore::SpellingCorrectionCommand::willApplyCommand):
+        (WebCore::SpellingCorrectionCommand::doApply):
+        (WebCore::SpellingCorrectionCommand::inputEventDataTransfer):
+        * editing/SpellingCorrectionCommand.h:
+
+        Using the replacement text fragment, create and return a DataTransfer for input events.
+
+        * platform/Pasteboard.h:
+        * platform/StaticPasteboard.cpp: Added.
+        (WebCore::StaticPasteboard::create):
+        (WebCore::StaticPasteboard::StaticPasteboard):
+        (WebCore::StaticPasteboard::hasData):
+        (WebCore::StaticPasteboard::types):
+        (WebCore::StaticPasteboard::readString):
+        * platform/StaticPasteboard.h: Copied from Source/WebCore/dom/InputEvent.cpp.
+        * platform/efl/PasteboardEfl.cpp:
+        (WebCore::Pasteboard::writeMarkup):
+        (WebCore::Pasteboard::write):
+        (WebCore::Pasteboard::read):
+        * platform/gtk/PasteboardGtk.cpp:
+        (WebCore::Pasteboard::writeMarkup):
+        * platform/ios/PasteboardIOS.mm:
+        (WebCore::Pasteboard::writeMarkup):
+        * platform/mac/PasteboardMac.mm:
+        (WebCore::Pasteboard::Pasteboard):
+        (WebCore::Pasteboard::writeMarkup):
+        * platform/win/PasteboardWin.cpp:
+        (WebCore::Pasteboard::write):
+        (WebCore::Pasteboard::read):
+
+        To account for virtual methods on Pasteboard, add implementations for methods that were previously defined but
+        unimplemented on these platforms.
+
</ins><span class="cx"> 2016-10-25  Andy Estes  &lt;aestes@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Implement rel=noopener
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformEflcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformEfl.cmake (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformEfl.cmake        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/PlatformEfl.cmake        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -87,6 +87,7 @@
</span><span class="cx">     page/scrolling/AxisScrollSnapOffsets.cpp
</span><span class="cx"> 
</span><span class="cx">     platform/KillRingNone.cpp
</span><ins>+    platform/StaticPasteboard.cpp
</ins><span class="cx"> 
</span><span class="cx">     platform/audio/efl/AudioBusEfl.cpp
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformGTK.cmake (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformGTK.cmake        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/PlatformGTK.cmake        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -84,6 +84,7 @@
</span><span class="cx">     loader/soup/SubresourceLoaderSoup.cpp
</span><span class="cx"> 
</span><span class="cx">     platform/KillRingNone.cpp
</span><ins>+    platform/StaticPasteboard.cpp
</ins><span class="cx">     platform/UserAgentQuirks.cpp
</span><span class="cx"> 
</span><span class="cx">     platform/audio/glib/AudioBusGLib.cpp
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformWincmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformWin.cmake (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformWin.cmake        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/PlatformWin.cmake        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -60,6 +60,7 @@
</span><span class="cx">     platform/Cursor.cpp
</span><span class="cx">     platform/KillRingNone.cpp
</span><span class="cx">     platform/LocalizedStrings.cpp
</span><ins>+    platform/StaticPasteboard.cpp
</ins><span class="cx">     platform/VNodeTracker.cpp
</span><span class="cx"> 
</span><span class="cx">     platform/audio/PlatformMediaSessionManager.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -6372,6 +6372,8 @@
</span><span class="cx">                 F3F5CF1112ED81A80084C569 /* InspectorConsoleInstrumentation.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F5CF1012ED81A80084C569 /* InspectorConsoleInstrumentation.h */; };
</span><span class="cx">                 F40EA8AB1B867E4400CE5581 /* NSScrollingInputFilterSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = F40EA8AA1B867D6500CE5581 /* NSScrollingInputFilterSPI.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 F42FFB461984B71600F6837F /* LengthRepeat.h in Headers */ = {isa = PBXBuildFile; fileRef = F42FFB451984B71600F6837F /* LengthRepeat.h */; };
</span><ins>+                F433E9031DBBDBA200EF0D14 /* StaticPasteboard.h in Headers */ = {isa = PBXBuildFile; fileRef = F433E9021DBBDBA200EF0D14 /* StaticPasteboard.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                F433E9051DBBDFCA00EF0D14 /* StaticPasteboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F433E9041DBBDBC200EF0D14 /* StaticPasteboard.cpp */; };
</ins><span class="cx">                 F44EBBD91DB5D21400277334 /* StaticRange.h in Headers */ = {isa = PBXBuildFile; fileRef = F44EBBD81DB5D21400277334 /* StaticRange.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 F44EBBDB1DB5DD9D00277334 /* StaticRange.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F44EBBDA1DB5DD9D00277334 /* StaticRange.cpp */; };
</span><span class="cx">                 F45C231D1995B73B00A6E2E3 /* AxisScrollSnapOffsets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F45C231B1995B73B00A6E2E3 /* AxisScrollSnapOffsets.cpp */; };
</span><span class="lines">@@ -14191,6 +14193,8 @@
</span><span class="cx">                 F3F5CF1012ED81A80084C569 /* InspectorConsoleInstrumentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorConsoleInstrumentation.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 F40EA8AA1B867D6500CE5581 /* NSScrollingInputFilterSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSScrollingInputFilterSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 F42FFB451984B71600F6837F /* LengthRepeat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LengthRepeat.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                F433E9021DBBDBA200EF0D14 /* StaticPasteboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StaticPasteboard.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                F433E9041DBBDBC200EF0D14 /* StaticPasteboard.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = StaticPasteboard.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 F44EBBD61DB5D1B600277334 /* StaticRange.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = StaticRange.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 F44EBBD81DB5D21400277334 /* StaticRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StaticRange.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 F44EBBDA1DB5DD9D00277334 /* StaticRange.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StaticRange.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -22183,6 +22187,8 @@
</span><span class="cx">                                 93309EA0099EB78C0056E581 /* SharedTimer.h */,
</span><span class="cx">                                 4B3043C60AE0370300A82647 /* Sound.h */,
</span><span class="cx">                                 F587866202DE3B1101EA4122 /* SSLKeyGenerator.h */,
</span><ins>+                                F433E9041DBBDBC200EF0D14 /* StaticPasteboard.cpp */,
+                                F433E9021DBBDBA200EF0D14 /* StaticPasteboard.h */,
</ins><span class="cx">                                 93B2D8150F9920D2006AE6B2 /* SuddenTermination.h */,
</span><span class="cx">                                 97627B9714FB5424002CDCA1 /* Supplementable.h */,
</span><span class="cx">                                 CDA07FBB18E0A16A004699FA /* SystemSleepListener.cpp */,
</span><span class="lines">@@ -24520,6 +24526,7 @@
</span><span class="cx">                                 079D0868162F20E800DB8658 /* CaptionUserPreferences.h in Headers */,
</span><span class="cx">                                 079D086B162F21F900DB8658 /* CaptionUserPreferencesMediaAF.h in Headers */,
</span><span class="cx">                                 07B7116D1D899E63009F0FFB /* CaptureDevice.h in Headers */,
</span><ins>+                                F433E9031DBBDBA200EF0D14 /* StaticPasteboard.h in Headers */,
</ins><span class="cx">                                 07B7116F1D899E63009F0FFB /* CaptureDeviceManager.h in Headers */,
</span><span class="cx">                                 99CC0B4F18BE9849006CEBCC /* CapturingInputCursor.h in Headers */,
</span><span class="cx">                                 CDC734151977896D0046BFC5 /* CARingBuffer.h in Headers */,
</span><span class="lines">@@ -29013,6 +29020,7 @@
</span><span class="cx">                                 41614A781DA6423B004AD06F /* HTTPHeaderValues.cpp in Sources */,
</span><span class="cx">                                 514C76720CE923A1007EF3CD /* HTTPParsers.cpp in Sources */,
</span><span class="cx">                                 371A67CB11C6C7DB00047B8B /* HyphenationCF.cpp in Sources */,
</span><ins>+                                F433E9051DBBDFCA00EF0D14 /* StaticPasteboard.cpp in Sources */,
</ins><span class="cx">                                 97E4028F13A696ED00913D67 /* IconController.cpp in Sources */,
</span><span class="cx">                                 5126E6BB0A2E3B12005C29FA /* IconDatabase.cpp in Sources */,
</span><span class="cx">                                 516953971329A3C800B92D04 /* IconDatabaseBase.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCoredomDataTransfercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DataTransfer.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DataTransfer.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/dom/DataTransfer.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &quot;HTMLImageElement.h&quot;
</span><span class="cx"> #include &quot;Image.h&quot;
</span><span class="cx"> #include &quot;Pasteboard.h&quot;
</span><ins>+#include &quot;StaticPasteboard.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -59,7 +60,7 @@
</span><span class="cx">     : m_policy(policy)
</span><span class="cx">     , m_pasteboard(WTFMove(pasteboard))
</span><span class="cx"> #if ENABLE(DRAG_SUPPORT)
</span><del>-    , m_forDrag(type != CopyAndPaste)
</del><ins>+    , m_forDrag(type == DragAndDrop)
</ins><span class="cx">     , m_forFileDrag(forFileDrag)
</span><span class="cx">     , m_dropEffect(ASCIILiteral(&quot;uninitialized&quot;))
</span><span class="cx">     , m_effectAllowed(ASCIILiteral(&quot;uninitialized&quot;))
</span><span class="lines">@@ -67,7 +68,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> {
</span><span class="cx"> #if !ENABLE(DRAG_SUPPORT)
</span><del>-    ASSERT_UNUSED(type, type == CopyAndPaste);
</del><ins>+    ASSERT_UNUSED(type, type != DragAndDrop);
</ins><span class="cx">     ASSERT_UNUSED(forFileDrag, !forFileDrag);
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="lines">@@ -198,6 +199,14 @@
</span><span class="cx">     return !type.isNull() &amp;&amp; types().contains(type);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Ref&lt;DataTransfer&gt; DataTransfer::createForInputEvent(const String&amp; plainText, const String&amp; htmlText)
+{
+    TypeToStringMap typeToStringMap;
+    typeToStringMap.set(ASCIILiteral(&quot;text/plain&quot;), plainText);
+    typeToStringMap.set(ASCIILiteral(&quot;text/html&quot;), htmlText);
+    return adoptRef(*new DataTransfer(DataTransferAccessPolicy::Readable, StaticPasteboard::create(WTFMove(typeToStringMap)), InputEvent));
+}
+
</ins><span class="cx"> #if !ENABLE(DRAG_SUPPORT)
</span><span class="cx"> 
</span><span class="cx"> String DataTransfer::dropEffect() const
</span></span></pre></div>
<a id="trunkSourceWebCoredomDataTransferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DataTransfer.h (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DataTransfer.h        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/dom/DataTransfer.h        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -45,6 +45,7 @@
</span><span class="cx">     class DataTransfer : public RefCounted&lt;DataTransfer&gt; {
</span><span class="cx">     public:
</span><span class="cx">         static Ref&lt;DataTransfer&gt; createForCopyAndPaste(DataTransferAccessPolicy);
</span><ins>+        static Ref&lt;DataTransfer&gt; createForInputEvent(const String&amp; plainText, const String&amp; htmlText);
</ins><span class="cx"> 
</span><span class="cx">         WEBCORE_EXPORT ~DataTransfer();
</span><span class="cx"> 
</span><span class="lines">@@ -97,7 +98,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     private:
</span><del>-        enum Type { CopyAndPaste, DragAndDrop };
</del><ins>+        enum Type { CopyAndPaste, DragAndDrop, InputEvent };
</ins><span class="cx">         DataTransfer(DataTransferAccessPolicy, std::unique_ptr&lt;Pasteboard&gt;, Type = CopyAndPaste, bool forFileDrag = false);
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(DRAG_SUPPORT)
</span></span></pre></div>
<a id="trunkSourceWebCoredomInputEventcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/InputEvent.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/InputEvent.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/dom/InputEvent.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #include &quot;InputEvent.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DOMWindow.h&quot;
</span><ins>+#include &quot;DataTransfer.h&quot;
</ins><span class="cx"> #include &quot;EventNames.h&quot;
</span><span class="cx"> #include &quot;Node.h&quot;
</span><span class="cx"> #include &quot;NotImplemented.h&quot;
</span><span class="lines">@@ -35,10 +36,16 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-InputEvent::InputEvent(const AtomicString&amp; eventType, const String&amp; inputType, bool canBubble, bool cancelable, DOMWindow* view, const String&amp; data, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges, int detail)
</del><ins>+Ref&lt;InputEvent&gt; InputEvent::create(const AtomicString&amp; eventType, const String&amp; inputType, bool canBubble, bool cancelable, WebCore::DOMWindow *view, const String&amp; data, RefPtr&lt;DataTransfer&gt;&amp;&amp; dataTransfer, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges, int detail)
+{
+    return adoptRef(*new InputEvent(eventType, inputType, canBubble, cancelable, view, data, WTFMove(dataTransfer), targetRanges, detail));
+}
+
+InputEvent::InputEvent(const AtomicString&amp; eventType, const String&amp; inputType, bool canBubble, bool cancelable, DOMWindow* view, const String&amp; data, RefPtr&lt;DataTransfer&gt;&amp;&amp; dataTransfer, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges, int detail)
</ins><span class="cx">     : UIEvent(eventType, canBubble, cancelable, view, detail)
</span><span class="cx">     , m_inputType(inputType)
</span><span class="cx">     , m_data(data)
</span><ins>+    , m_dataTransfer(dataTransfer)
</ins><span class="cx">     , m_targetRanges(targetRanges)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -50,4 +57,9 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RefPtr&lt;DataTransfer&gt; InputEvent::dataTransfer() const
+{
+    return m_dataTransfer;
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoredomInputEventh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/InputEvent.h (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/InputEvent.h        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/dom/InputEvent.h        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -35,21 +35,17 @@
</span><span class="cx"> 
</span><span class="cx"> class InputEvent final : public UIEvent {
</span><span class="cx"> public:
</span><del>-    static Ref&lt;InputEvent&gt; create(const AtomicString&amp; eventType, const String&amp; inputType, bool canBubble, bool cancelable, DOMWindow* view, const String&amp; data, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges, int detail)
-    {
-        return adoptRef(*new InputEvent(eventType, inputType, canBubble, cancelable, view, data, targetRanges, detail));
-    }
-
</del><span class="cx">     struct Init : UIEventInit {
</span><span class="cx">         String data;
</span><span class="cx">     };
</span><span class="cx"> 
</span><ins>+    static Ref&lt;InputEvent&gt; create(const AtomicString&amp; eventType, const String&amp; inputType, bool canBubble, bool cancelable, DOMWindow* view, const String&amp; data, RefPtr&lt;DataTransfer&gt;&amp;&amp;, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges, int detail);
</ins><span class="cx">     static Ref&lt;InputEvent&gt; create(const AtomicString&amp; type, const Init&amp; initializer, IsTrusted isTrusted = IsTrusted::No)
</span><span class="cx">     {
</span><span class="cx">         return adoptRef(*new InputEvent(type, initializer, isTrusted));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    InputEvent(const AtomicString&amp; eventType, const String&amp; inputType, bool canBubble, bool cancelable, DOMWindow*, const String&amp; data, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges, int detail);
</del><ins>+    InputEvent(const AtomicString&amp; eventType, const String&amp; inputType, bool canBubble, bool cancelable, DOMWindow*, const String&amp; data, RefPtr&lt;DataTransfer&gt;&amp;&amp;, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges, int detail);
</ins><span class="cx">     InputEvent(const AtomicString&amp; eventType, const Init&amp;, IsTrusted);
</span><span class="cx"> 
</span><span class="cx">     virtual ~InputEvent() { }
</span><span class="lines">@@ -58,11 +54,13 @@
</span><span class="cx">     EventInterface eventInterface() const final { return InputEventInterfaceType; }
</span><span class="cx">     const String&amp; inputType() const { return m_inputType; }
</span><span class="cx">     const String&amp; data() const { return m_data; }
</span><ins>+    RefPtr&lt;DataTransfer&gt; dataTransfer() const;
</ins><span class="cx">     const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; getTargetRanges() { return m_targetRanges; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     String m_inputType;
</span><span class="cx">     String m_data;
</span><ins>+    RefPtr&lt;DataTransfer&gt; m_dataTransfer;
</ins><span class="cx">     Vector&lt;RefPtr&lt;StaticRange&gt;&gt; m_targetRanges;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomInputEventidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/InputEvent.idl (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/InputEvent.idl        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/dom/InputEvent.idl        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> ] interface InputEvent : UIEvent {
</span><span class="cx">     readonly attribute DOMString inputType;
</span><span class="cx">     readonly attribute DOMString? data;
</span><ins>+    readonly attribute DataTransfer? dataTransfer;
</ins><span class="cx"> 
</span><span class="cx">     sequence&lt;StaticRange&gt; getTargetRanges();
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/dom/Node.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include &quot;ComposedTreeAncestorIterator.h&quot;
</span><span class="cx"> #include &quot;ContainerNodeAlgorithms.h&quot;
</span><span class="cx"> #include &quot;ContextMenuController.h&quot;
</span><ins>+#include &quot;DataTransfer.h&quot;
</ins><span class="cx"> #include &quot;DocumentType.h&quot;
</span><span class="cx"> #include &quot;ElementIterator.h&quot;
</span><span class="cx"> #include &quot;ElementRareData.h&quot;
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingCompositeEditCommandcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/CompositeEditCommand.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/CompositeEditCommand.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/editing/CompositeEditCommand.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &quot;AppendNodeCommand.h&quot;
</span><span class="cx"> #include &quot;ApplyStyleCommand.h&quot;
</span><span class="cx"> #include &quot;BreakBlockquoteCommand.h&quot;
</span><ins>+#include &quot;DataTransfer.h&quot;
</ins><span class="cx"> #include &quot;DeleteFromTextNodeCommand.h&quot;
</span><span class="cx"> #include &quot;DeleteSelectionCommand.h&quot;
</span><span class="cx"> #include &quot;Document.h&quot;
</span><span class="lines">@@ -399,6 +400,11 @@
</span><span class="cx">     return targetRanges();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RefPtr&lt;DataTransfer&gt; CompositeEditCommand::inputEventDataTransfer() const
+{
+    return nullptr;
+}
+
</ins><span class="cx"> EditCommandComposition* CompositeEditCommand::ensureComposition()
</span><span class="cx"> {
</span><span class="cx">     CompositeEditCommand* command = this;
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingCompositeEditCommandh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/CompositeEditCommand.h (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/CompositeEditCommand.h        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/editing/CompositeEditCommand.h        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class EditingStyle;
</span><ins>+class DataTransfer;
</ins><span class="cx"> class HTMLElement;
</span><span class="cx"> class StaticRange;
</span><span class="cx"> class StyledElement;
</span><span class="lines">@@ -118,6 +119,7 @@
</span><span class="cx">     virtual String inputEventData() const { return { }; }
</span><span class="cx">     virtual bool isBeforeInputEventCancelable() const { return true; }
</span><span class="cx">     Vector&lt;RefPtr&lt;StaticRange&gt;&gt; targetRangesForBindings() const;
</span><ins>+    virtual RefPtr&lt;DataTransfer&gt; inputEventDataTransfer() const;
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     explicit CompositeEditCommand(Document&amp;, EditAction = EditActionUnspecified);
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingEditorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/Editor.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/Editor.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/editing/Editor.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -111,20 +111,20 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-static bool dispatchBeforeInputEvent(Element&amp; element, const AtomicString&amp; inputType, const String&amp; data = { }, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges = { }, bool cancelable = true)
</del><ins>+static bool dispatchBeforeInputEvent(Element&amp; element, const AtomicString&amp; inputType, const String&amp; data = { }, RefPtr&lt;DataTransfer&gt;&amp;&amp; dataTransfer = nullptr, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges = { }, bool cancelable = true)
</ins><span class="cx"> {
</span><span class="cx">     auto* settings = element.document().settings();
</span><span class="cx">     if (!settings || !settings-&gt;inputEventsEnabled())
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><del>-    return element.dispatchEvent(InputEvent::create(eventNames().beforeinputEvent, inputType, true, cancelable, element.document().defaultView(), data, targetRanges, 0));
</del><ins>+    return element.dispatchEvent(InputEvent::create(eventNames().beforeinputEvent, inputType, true, cancelable, element.document().defaultView(), data, WTFMove(dataTransfer), targetRanges, 0));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void dispatchInputEvent(Element&amp; element, const AtomicString&amp; inputType, const String&amp; data = { }, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges = { })
</del><ins>+static void dispatchInputEvent(Element&amp; element, const AtomicString&amp; inputType, const String&amp; data = { }, RefPtr&lt;DataTransfer&gt;&amp;&amp; dataTransfer = nullptr, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges = { })
</ins><span class="cx"> {
</span><span class="cx">     auto* settings = element.document().settings();
</span><span class="cx">     if (settings &amp;&amp; settings-&gt;inputEventsEnabled())
</span><del>-        element.dispatchEvent(InputEvent::create(eventNames().inputEvent, inputType, true, false, element.document().defaultView(), data, targetRanges, 0));
</del><ins>+        element.dispatchEvent(InputEvent::create(eventNames().inputEvent, inputType, true, false, element.document().defaultView(), data, WTFMove(dataTransfer), targetRanges, 0));
</ins><span class="cx">     else
</span><span class="cx">         element.dispatchInputEvent();
</span><span class="cx"> }
</span><span class="lines">@@ -1063,22 +1063,22 @@
</span><span class="cx">         endingTextControl-&gt;didEditInnerTextValue();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool dispatchBeforeInputEvents(RefPtr&lt;Element&gt; startRoot, RefPtr&lt;Element&gt; endRoot, const AtomicString&amp; inputTypeName, const String&amp; data = { }, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges = { }, bool cancelable = true)
</del><ins>+static bool dispatchBeforeInputEvents(RefPtr&lt;Element&gt; startRoot, RefPtr&lt;Element&gt; endRoot, const AtomicString&amp; inputTypeName, const String&amp; data = { }, RefPtr&lt;DataTransfer&gt;&amp;&amp; dataTransfer = nullptr, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges = { }, bool cancelable = true)
</ins><span class="cx"> {
</span><span class="cx">     bool continueWithDefaultBehavior = true;
</span><span class="cx">     if (startRoot)
</span><del>-        continueWithDefaultBehavior &amp;= dispatchBeforeInputEvent(*startRoot, inputTypeName, data, targetRanges, cancelable);
</del><ins>+        continueWithDefaultBehavior &amp;= dispatchBeforeInputEvent(*startRoot, inputTypeName, data, WTFMove(dataTransfer), targetRanges, cancelable);
</ins><span class="cx">     if (endRoot &amp;&amp; endRoot != startRoot)
</span><del>-        continueWithDefaultBehavior &amp;= dispatchBeforeInputEvent(*endRoot, inputTypeName, data, targetRanges, cancelable);
</del><ins>+        continueWithDefaultBehavior &amp;= dispatchBeforeInputEvent(*endRoot, inputTypeName, data, WTFMove(dataTransfer), targetRanges, cancelable);
</ins><span class="cx">     return continueWithDefaultBehavior;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void dispatchInputEvents(RefPtr&lt;Element&gt; startRoot, RefPtr&lt;Element&gt; endRoot, const AtomicString&amp; inputTypeName, const String&amp; data = { }, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges = { })
</del><ins>+static void dispatchInputEvents(RefPtr&lt;Element&gt; startRoot, RefPtr&lt;Element&gt; endRoot, const AtomicString&amp; inputTypeName, const String&amp; data = { }, RefPtr&lt;DataTransfer&gt;&amp;&amp; dataTransfer = nullptr, const Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp; targetRanges = { })
</ins><span class="cx"> {
</span><span class="cx">     if (startRoot)
</span><del>-        dispatchInputEvent(*startRoot, inputTypeName, data, targetRanges);
</del><ins>+        dispatchInputEvent(*startRoot, inputTypeName, data, WTFMove(dataTransfer), targetRanges);
</ins><span class="cx">     if (endRoot &amp;&amp; endRoot != startRoot)
</span><del>-        dispatchInputEvent(*endRoot, inputTypeName, data, targetRanges);
</del><ins>+        dispatchInputEvent(*endRoot, inputTypeName, data, WTFMove(dataTransfer), targetRanges);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Editor::willApplyEditing(CompositeEditCommand&amp; command, Vector&lt;RefPtr&lt;StaticRange&gt;&gt;&amp;&amp; targetRanges) const
</span><span class="lines">@@ -1087,7 +1087,7 @@
</span><span class="cx">     if (!composition)
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><del>-    return dispatchBeforeInputEvents(composition-&gt;startingRootEditableElement(), composition-&gt;endingRootEditableElement(), command.inputEventTypeName(), command.inputEventData(), targetRanges, command.isBeforeInputEventCancelable());
</del><ins>+    return dispatchBeforeInputEvents(composition-&gt;startingRootEditableElement(), composition-&gt;endingRootEditableElement(), command.inputEventTypeName(), command.inputEventData(), command.inputEventDataTransfer(), targetRanges, command.isBeforeInputEventCancelable());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Editor::appliedEditing(PassRefPtr&lt;CompositeEditCommand&gt; cmd)
</span><span class="lines">@@ -1106,7 +1106,7 @@
</span><span class="cx">     FrameSelection::SetSelectionOptions options = cmd-&gt;isDictationCommand() ? FrameSelection::DictationTriggered : 0;
</span><span class="cx">     
</span><span class="cx">     changeSelectionAfterCommand(newSelection, options);
</span><del>-    dispatchInputEvents(composition-&gt;startingRootEditableElement(), composition-&gt;endingRootEditableElement(), cmd-&gt;inputEventTypeName(), cmd-&gt;inputEventData());
</del><ins>+    dispatchInputEvents(composition-&gt;startingRootEditableElement(), composition-&gt;endingRootEditableElement(), cmd-&gt;inputEventTypeName(), cmd-&gt;inputEventData(), cmd-&gt;inputEventDataTransfer());
</ins><span class="cx"> 
</span><span class="cx">     updateEditorUINowIfScheduled();
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingReplaceRangeWithTextCommandcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/ReplaceRangeWithTextCommand.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/ReplaceRangeWithTextCommand.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/editing/ReplaceRangeWithTextCommand.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #include &quot;ReplaceRangeWithTextCommand.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;AlternativeTextController.h&quot;
</span><ins>+#include &quot;DataTransfer.h&quot;
</ins><span class="cx"> #include &quot;Document.h&quot;
</span><span class="cx"> #include &quot;DocumentFragment.h&quot;
</span><span class="cx"> #include &quot;Editor.h&quot;
</span><span class="lines">@@ -46,6 +47,12 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool ReplaceRangeWithTextCommand::willApplyCommand()
+{
+    m_textFragment = createFragmentFromText(*m_rangeToBeReplaced, m_text);
+    return CompositeEditCommand::willApplyCommand();
+}
+
</ins><span class="cx"> void ReplaceRangeWithTextCommand::doApply()
</span><span class="cx"> {
</span><span class="cx">     VisibleSelection selection = *m_rangeToBeReplaced;
</span><span class="lines">@@ -61,9 +68,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     applyCommandToComposite(SetSelectionCommand::create(selection, FrameSelection::defaultSetSelectionOptions()));
</span><del>-
-    auto fragment = createFragmentFromText(*m_rangeToBeReplaced, m_text);
-    applyCommandToComposite(ReplaceSelectionCommand::create(document(), WTFMove(fragment), ReplaceSelectionCommand::MatchStyle, EditActionPaste));
</del><ins>+    applyCommandToComposite(ReplaceSelectionCommand::create(document(), WTFMove(m_textFragment), ReplaceSelectionCommand::MatchStyle, EditActionPaste));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String ReplaceRangeWithTextCommand::inputEventData() const
</span><span class="lines">@@ -74,6 +79,14 @@
</span><span class="cx">     return CompositeEditCommand::inputEventData();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RefPtr&lt;DataTransfer&gt; ReplaceRangeWithTextCommand::inputEventDataTransfer() const
+{
+    if (!isEditingTextAreaOrTextInput())
+        return DataTransfer::createForInputEvent(m_text, createMarkup(*m_textFragment));
+
+    return CompositeEditCommand::inputEventDataTransfer();
+}
+
</ins><span class="cx"> Vector&lt;RefPtr&lt;StaticRange&gt;&gt; ReplaceRangeWithTextCommand::targetRanges() const
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;StaticRange&gt; range = StaticRange::createFromRange(*m_rangeToBeReplaced);
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingReplaceRangeWithTextCommandh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/ReplaceRangeWithTextCommand.h (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/ReplaceRangeWithTextCommand.h        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/editing/ReplaceRangeWithTextCommand.h        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -30,6 +30,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+class DocumentFragment;
+
</ins><span class="cx"> class ReplaceRangeWithTextCommand : public CompositeEditCommand {
</span><span class="cx"> public:
</span><span class="cx">     static Ref&lt;ReplaceRangeWithTextCommand&gt; create(RefPtr&lt;Range&gt; rangeToBeReplaced, const String&amp; text)
</span><span class="lines">@@ -39,11 +41,14 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     ReplaceRangeWithTextCommand(RefPtr&lt;Range&gt; rangeToBeReplaced, const String&amp; text);
</span><ins>+    bool willApplyCommand() final;
</ins><span class="cx">     void doApply() override;
</span><span class="cx">     String inputEventData() const final;
</span><ins>+    RefPtr&lt;DataTransfer&gt; inputEventDataTransfer() const final;
</ins><span class="cx">     Vector&lt;RefPtr&lt;StaticRange&gt;&gt; targetRanges() const final;
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Range&gt; m_rangeToBeReplaced;
</span><ins>+    RefPtr&lt;DocumentFragment&gt; m_textFragment;
</ins><span class="cx">     String m_text;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingReplaceSelectionCommandcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;BeforeTextInsertedEvent.h&quot;
</span><span class="cx"> #include &quot;BreakBlockquoteCommand.h&quot;
</span><span class="cx"> #include &quot;CSSStyleDeclaration.h&quot;
</span><ins>+#include &quot;DataTransfer.h&quot;
</ins><span class="cx"> #include &quot;Document.h&quot;
</span><span class="cx"> #include &quot;DocumentFragment.h&quot;
</span><span class="cx"> #include &quot;ElementIterator.h&quot;
</span><span class="lines">@@ -69,6 +70,8 @@
</span><span class="cx"> 
</span><span class="cx"> enum EFragmentType { EmptyFragment, SingleTextNodeFragment, TreeFragment };
</span><span class="cx"> 
</span><ins>+static void removeHeadContents(ReplacementFragment&amp;);
+
</ins><span class="cx"> // --- ReplacementFragment helper class
</span><span class="cx"> 
</span><span class="cx"> class ReplacementFragment {
</span><span class="lines">@@ -909,6 +912,14 @@
</span><span class="cx">     return highestEnclosingNodeOfType(insertionPos, isInlineNodeWithStyle, CannotCrossEditingBoundary, containgBlock);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool ReplaceSelectionCommand::willApplyCommand()
+{
+    ensureReplacementFragment();
+    m_documentFragmentPlainText = m_documentFragment-&gt;textContent();
+    m_documentFragmentHTMLMarkup = createMarkup(*m_documentFragment);
+    return CompositeEditCommand::willApplyCommand();
+}
+
</ins><span class="cx"> void ReplaceSelectionCommand::doApply()
</span><span class="cx"> {
</span><span class="cx">     VisibleSelection selection = endingSelection();
</span><span class="lines">@@ -922,7 +933,7 @@
</span><span class="cx">     if (!selection.isContentRichlyEditable())
</span><span class="cx">         m_matchStyle = false;
</span><span class="cx"> 
</span><del>-    ReplacementFragment fragment(document(), m_documentFragment.get(), selection);
</del><ins>+    ReplacementFragment&amp; fragment = *ensureReplacementFragment();
</ins><span class="cx">     if (performTrivialReplace(fragment))
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="lines">@@ -1045,8 +1056,6 @@
</span><span class="cx">     // any work performed after this that queries or uses the typing style.
</span><span class="cx">     frame().selection().clearTypingStyle();
</span><span class="cx"> 
</span><del>-    removeHeadContents(fragment);
-
</del><span class="cx">     // We don't want the destination to end up inside nodes that weren't selected.  To avoid that, we move the
</span><span class="cx">     // position forward without changing the visible position so we're still at the same visible location, but
</span><span class="cx">     // outside of preceding tags.
</span><span class="lines">@@ -1262,6 +1271,14 @@
</span><span class="cx">     return CompositeEditCommand::inputEventData();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RefPtr&lt;DataTransfer&gt; ReplaceSelectionCommand::inputEventDataTransfer() const
+{
+    if (isEditingTextAreaOrTextInput())
+        return CompositeEditCommand::inputEventDataTransfer();
+
+    return DataTransfer::createForInputEvent(m_documentFragmentPlainText, m_documentFragmentHTMLMarkup);
+}
+
</ins><span class="cx"> bool ReplaceSelectionCommand::shouldRemoveEndBR(Node* endBR, const VisiblePosition&amp; originalVisPosBeforeEndBR)
</span><span class="cx"> {
</span><span class="cx">     if (!endBR || !endBR-&gt;inDocument())
</span><span class="lines">@@ -1495,6 +1512,16 @@
</span><span class="cx">     m_endOfInsertedContent = lastPositionInOrAfterNode(node-&gt;lastDescendant());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ReplacementFragment* ReplaceSelectionCommand::ensureReplacementFragment()
+{
+    if (!m_replacementFragment) {
+        m_replacementFragment = std::make_unique&lt;ReplacementFragment&gt;(document(), m_documentFragment.get(), endingSelection());
+        removeHeadContents(*m_replacementFragment);
+    }
+
+    return m_replacementFragment.get();
+}
+
</ins><span class="cx"> // During simple pastes, where we're just pasting a text node into a run of text, we insert the text node
</span><span class="cx"> // directly into the text node that holds the selection.  This is much faster than the generalized code in
</span><span class="cx"> // ReplaceSelectionCommand, and works around &lt;https://bugs.webkit.org/show_bug.cgi?id=6148&gt; since we don't 
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingReplaceSelectionCommandh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/ReplaceSelectionCommand.h (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/ReplaceSelectionCommand.h        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/editing/ReplaceSelectionCommand.h        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -59,6 +59,8 @@
</span><span class="cx">     ReplaceSelectionCommand(Document&amp;, RefPtr&lt;DocumentFragment&gt;&amp;&amp;, CommandOptions, EditAction);
</span><span class="cx"> 
</span><span class="cx">     String inputEventData() const final;
</span><ins>+    RefPtr&lt;DataTransfer&gt; inputEventDataTransfer() const final;
+    bool willApplyCommand() final;
</ins><span class="cx">     virtual void doApply();
</span><span class="cx"> 
</span><span class="cx">     class InsertedNodes {
</span><span class="lines">@@ -111,6 +113,7 @@
</span><span class="cx">     void completeHTMLReplacement(const Position&amp; lastPositionToSelect);
</span><span class="cx">     void mergeTextNodesAroundPosition(Position&amp;, Position&amp; positionOnlyToBeUpdated);
</span><span class="cx"> 
</span><ins>+    ReplacementFragment* ensureReplacementFragment();
</ins><span class="cx">     bool performTrivialReplace(const ReplacementFragment&amp;);
</span><span class="cx"> 
</span><span class="cx">     VisibleSelection m_visibleSelectionForInsertedText;
</span><span class="lines">@@ -121,6 +124,9 @@
</span><span class="cx">     bool m_smartReplace;
</span><span class="cx">     bool m_matchStyle;
</span><span class="cx">     RefPtr&lt;DocumentFragment&gt; m_documentFragment;
</span><ins>+    std::unique_ptr&lt;ReplacementFragment&gt; m_replacementFragment;
+    String m_documentFragmentHTMLMarkup;
+    String m_documentFragmentPlainText;
</ins><span class="cx">     bool m_preventNesting;
</span><span class="cx">     bool m_movingParagraph;
</span><span class="cx">     bool m_sanitizeFragment;
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingSpellingCorrectionCommandcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/SpellingCorrectionCommand.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/SpellingCorrectionCommand.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/editing/SpellingCorrectionCommand.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #include &quot;SpellingCorrectionCommand.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;AlternativeTextController.h&quot;
</span><ins>+#include &quot;DataTransfer.h&quot;
</ins><span class="cx"> #include &quot;Document.h&quot;
</span><span class="cx"> #include &quot;DocumentFragment.h&quot;
</span><span class="cx"> #include &quot;Editor.h&quot;
</span><span class="lines">@@ -90,6 +91,12 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool SpellingCorrectionCommand::willApplyCommand()
+{
+    m_correctionFragment = createFragmentFromText(*m_rangeToBeCorrected, m_correction);
+    return CompositeEditCommand::willApplyCommand();
+}
+
</ins><span class="cx"> void SpellingCorrectionCommand::doApply()
</span><span class="cx"> {
</span><span class="cx">     m_corrected = plainText(m_rangeToBeCorrected.get());
</span><span class="lines">@@ -102,14 +109,12 @@
</span><span class="cx">     if (!m_rangeToBeCorrected)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    auto fragment = createFragmentFromText(*m_rangeToBeCorrected, m_correction);
-
</del><span class="cx">     applyCommandToComposite(SetSelectionCommand::create(m_selectionToBeCorrected, FrameSelection::defaultSetSelectionOptions() | FrameSelection::SpellCorrectionTriggered));
</span><span class="cx"> #if USE(AUTOCORRECTION_PANEL)
</span><span class="cx">     applyCommandToComposite(SpellingCorrectionRecordUndoCommand::create(document(), m_corrected, m_correction));
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    applyCommandToComposite(ReplaceSelectionCommand::create(document(), WTFMove(fragment), ReplaceSelectionCommand::MatchStyle, EditActionPaste));
</del><ins>+    applyCommandToComposite(ReplaceSelectionCommand::create(document(), WTFMove(m_correctionFragment), ReplaceSelectionCommand::MatchStyle, EditActionPaste));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String SpellingCorrectionCommand::inputEventData() const
</span><span class="lines">@@ -126,6 +131,14 @@
</span><span class="cx">     return { 1, range };
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RefPtr&lt;DataTransfer&gt; SpellingCorrectionCommand::inputEventDataTransfer() const
+{
+    if (!isEditingTextAreaOrTextInput())
+        return DataTransfer::createForInputEvent(m_correction, createMarkup(*m_correctionFragment));
+
+    return CompositeEditCommand::inputEventDataTransfer();
+}
+
</ins><span class="cx"> bool SpellingCorrectionCommand::shouldRetainAutocorrectionIndicator() const
</span><span class="cx"> {
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingSpellingCorrectionCommandh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/SpellingCorrectionCommand.h (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/SpellingCorrectionCommand.h        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/editing/SpellingCorrectionCommand.h        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -39,14 +39,17 @@
</span><span class="cx">     }
</span><span class="cx"> private:
</span><span class="cx">     SpellingCorrectionCommand(PassRefPtr&lt;Range&gt; rangeToBeCorrected, const String&amp; correction);
</span><ins>+    bool willApplyCommand() final;
</ins><span class="cx">     void doApply() override;
</span><span class="cx">     bool shouldRetainAutocorrectionIndicator() const override;
</span><span class="cx"> 
</span><span class="cx">     String inputEventData() const final;
</span><span class="cx">     Vector&lt;RefPtr&lt;StaticRange&gt;&gt; targetRanges() const final;
</span><ins>+    RefPtr&lt;DataTransfer&gt; inputEventDataTransfer() const final;
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Range&gt; m_rangeToBeCorrected;
</span><span class="cx">     VisibleSelection m_selectionToBeCorrected;
</span><ins>+    RefPtr&lt;DocumentFragment&gt; m_correctionFragment;
</ins><span class="cx">     String m_corrected;
</span><span class="cx">     String m_correction;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformPasteboardh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/Pasteboard.h (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/Pasteboard.h        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/platform/Pasteboard.h        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -138,7 +138,7 @@
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(Pasteboard); WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><span class="cx">     Pasteboard();
</span><del>-    ~Pasteboard();
</del><ins>+    virtual ~Pasteboard();
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(GTK)
</span><span class="cx">     explicit Pasteboard(const String&amp; name);
</span><span class="lines">@@ -154,34 +154,34 @@
</span><span class="cx">     WEBCORE_EXPORT static std::unique_ptr&lt;Pasteboard&gt; createForCopyAndPaste();
</span><span class="cx">     static std::unique_ptr&lt;Pasteboard&gt; createPrivate(); // Temporary pasteboard. Can put data on this and then write to another pasteboard with writePasteboard.
</span><span class="cx"> 
</span><del>-    bool hasData();
-    Vector&lt;String&gt; types();
-    String readString(const String&amp; type);
</del><ins>+    virtual bool hasData();
+    virtual Vector&lt;String&gt; types();
+    virtual String readString(const String&amp; type);
</ins><span class="cx"> 
</span><del>-    void writeString(const String&amp; type, const String&amp; data);
-    void clear();
-    void clear(const String&amp; type);
</del><ins>+    virtual void writeString(const String&amp; type, const String&amp; data);
+    virtual void clear();
+    virtual void clear(const String&amp; type);
</ins><span class="cx"> 
</span><del>-    void read(PasteboardPlainText&amp;);
-    void read(PasteboardWebContentReader&amp;);
</del><ins>+    virtual void read(PasteboardPlainText&amp;);
+    virtual void read(PasteboardWebContentReader&amp;);
</ins><span class="cx"> 
</span><del>-    void write(const PasteboardURL&amp;);
-    void write(const PasteboardImage&amp;);
-    void write(const PasteboardWebContent&amp;);
</del><ins>+    virtual void write(const PasteboardURL&amp;);
+    virtual void write(const PasteboardImage&amp;);
+    virtual void write(const PasteboardWebContent&amp;);
</ins><span class="cx"> 
</span><del>-    Vector&lt;String&gt; readFilenames();
-    bool canSmartReplace();
</del><ins>+    virtual Vector&lt;String&gt; readFilenames();
+    virtual bool canSmartReplace();
</ins><span class="cx"> 
</span><del>-    void writeMarkup(const String&amp; markup);
</del><ins>+    virtual void writeMarkup(const String&amp; markup);
</ins><span class="cx">     enum SmartReplaceOption { CanSmartReplace, CannotSmartReplace };
</span><del>-    WEBCORE_EXPORT void writePlainText(const String&amp;, SmartReplaceOption); // FIXME: Two separate functions would be clearer than one function with an argument.
-    void writePasteboard(const Pasteboard&amp; sourcePasteboard);
</del><ins>+    virtual WEBCORE_EXPORT void writePlainText(const String&amp;, SmartReplaceOption); // FIXME: Two separate functions would be clearer than one function with an argument.
+    virtual void writePasteboard(const Pasteboard&amp; sourcePasteboard);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(DRAG_SUPPORT)
</span><span class="cx">     static std::unique_ptr&lt;Pasteboard&gt; createForDragAndDrop();
</span><span class="cx">     static std::unique_ptr&lt;Pasteboard&gt; createForDragAndDrop(const DragData&amp;);
</span><span class="cx"> 
</span><del>-    void setDragImage(DragImageRef, const IntPoint&amp; hotSpot);
</del><ins>+    virtual void setDragImage(DragImageRef, const IntPoint&amp; hotSpot);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(WIN)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformStaticPasteboardcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/StaticPasteboard.cpp (0 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/StaticPasteboard.cpp                                (rev 0)
+++ trunk/Source/WebCore/platform/StaticPasteboard.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+/*
+* Copyright (C) 2016 Apple Inc. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in the
+*    documentation and/or other materials provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+* THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include &quot;config.h&quot;
+#include &quot;StaticPasteboard.h&quot;
+
+namespace WebCore {
+
+std::unique_ptr&lt;StaticPasteboard&gt; StaticPasteboard::create(TypeToStringMap&amp;&amp; typeToStringMap)
+{
+    return std::make_unique&lt;StaticPasteboard&gt;(WTFMove(typeToStringMap));
+}
+
+StaticPasteboard::StaticPasteboard(TypeToStringMap&amp;&amp; typeToStringMap)
+    : m_typeToStringMap(typeToStringMap)
+{
+}
+
+bool StaticPasteboard::hasData()
+{
+    return !m_typeToStringMap.isEmpty();
+}
+
+Vector&lt;String&gt; StaticPasteboard::types()
+{
+    Vector&lt;String&gt; allTypes(m_typeToStringMap.size());
+    for (auto&amp; type : m_typeToStringMap.keys())
+        allTypes.append(type);
+    return allTypes;
+}
+
+String StaticPasteboard::readString(const String&amp; type)
+{
+    if (!m_typeToStringMap.contains(type))
+        return { };
+    return m_typeToStringMap.get(type);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformStaticPasteboardhfromrev207840trunkSourceWebCoredomInputEventcpp"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/platform/StaticPasteboard.h (from rev 207840, trunk/Source/WebCore/dom/InputEvent.cpp) (0 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/StaticPasteboard.h                                (rev 0)
+++ trunk/Source/WebCore/platform/StaticPasteboard.h        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -0,0 +1,72 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &quot;Pasteboard.h&quot;
+#include &lt;wtf/HashMap.h&gt;
+#include &lt;wtf/text/StringHash.h&gt;
+
+namespace WebCore {
+
+typedef HashMap&lt;String, String&gt; TypeToStringMap;
+
+class StaticPasteboard final : public Pasteboard {
+public:
+    static std::unique_ptr&lt;StaticPasteboard&gt; create(TypeToStringMap&amp;&amp;);
+
+    StaticPasteboard(TypeToStringMap&amp;&amp;);
+
+    bool hasData() final;
+    Vector&lt;String&gt; types() final;
+    String readString(const String&amp; type) final;
+
+    void writeString(const String&amp;, const String&amp;) final { }
+    void clear() final { }
+    void clear(const String&amp;) final { }
+
+    void read(PasteboardPlainText&amp;) final { }
+    void read(PasteboardWebContentReader&amp;) final { }
+
+    void write(const PasteboardURL&amp;) final { }
+    void write(const PasteboardImage&amp;) final { }
+    void write(const PasteboardWebContent&amp;) final { }
+
+    Vector&lt;String&gt; readFilenames() final { return { }; }
+    bool canSmartReplace() final { return false; }
+
+    void writeMarkup(const String&amp;) final { }
+    void writePlainText(const String&amp;, SmartReplaceOption) final { }
+    void writePasteboard(const Pasteboard&amp;) final { }
+
+#if ENABLE(DRAG_SUPPORT)
+    void setDragImage(DragImageRef, const IntPoint&amp;) final { }
+#endif
+
+private:
+    TypeToStringMap m_typeToStringMap;
+};
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformeflPasteboardEflcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/efl/PasteboardEfl.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/efl/PasteboardEfl.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/platform/efl/PasteboardEfl.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -125,4 +125,24 @@
</span><span class="cx">     notImplemented();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Pasteboard::writeMarkup(const String&amp;)
+{
+    notImplemented();
</ins><span class="cx"> }
</span><ins>+
+void Pasteboard::write(const PasteboardWebContent&amp;)
+{
+    notImplemented();
+}
+
+void Pasteboard::read(PasteboardWebContentReader&amp;)
+{
+    notImplemented();
+}
+
+void Pasteboard::write(const PasteboardImage&amp;)
+{
+    notImplemented();
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkPasteboardGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -87,6 +87,11 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Pasteboard::Pasteboard()
+    : m_selectionData(SelectionData::create())
+{
+}
+
</ins><span class="cx"> Pasteboard::~Pasteboard()
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -271,6 +276,10 @@
</span><span class="cx">     text.text = m_selectionData-&gt;text();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Pasteboard::read(PasteboardWebContentReader&amp;)
+{
+}
+
</ins><span class="cx"> bool Pasteboard::hasData()
</span><span class="cx"> {
</span><span class="cx">     readFromClipboard();
</span><span class="lines">@@ -333,4 +342,8 @@
</span><span class="cx">     return m_selectionData-&gt;filenames();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Pasteboard::writeMarkup(const String&amp;)
+{
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformiosPasteboardIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/PasteboardIOS.mm (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/PasteboardIOS.mm        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/platform/ios/PasteboardIOS.mm        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -88,6 +88,10 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Pasteboard::writeMarkup(const String&amp;)
+{
+}
+
</ins><span class="cx"> std::unique_ptr&lt;Pasteboard&gt; Pasteboard::createForCopyAndPaste()
</span><span class="cx"> {
</span><span class="cx">     return std::make_unique&lt;Pasteboard&gt;();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacPasteboardMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/PasteboardMac.mm (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/PasteboardMac.mm        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/platform/mac/PasteboardMac.mm        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -107,6 +107,12 @@
</span><span class="cx">     return types;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Pasteboard::Pasteboard()
+    : m_pasteboardName(emptyString())
+    , m_changeCount(0)
+{
+}
+
</ins><span class="cx"> Pasteboard::Pasteboard(const String&amp; pasteboardName)
</span><span class="cx">     : m_pasteboardName(pasteboardName)
</span><span class="cx">     , m_changeCount(platformStrategies()-&gt;pasteboardStrategy()-&gt;changeCount(m_pasteboardName))
</span><span class="lines">@@ -281,6 +287,10 @@
</span><span class="cx">     return types.contains(WebSmartPastePboardType);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Pasteboard::writeMarkup(const String&amp;)
+{
+}
+
</ins><span class="cx"> void Pasteboard::read(PasteboardPlainText&amp; text)
</span><span class="cx"> {
</span><span class="cx">     PasteboardStrategy&amp; strategy = *platformStrategies()-&gt;pasteboardStrategy();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformwinPasteboardWincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/win/PasteboardWin.cpp (207840 => 207841)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/win/PasteboardWin.cpp        2016-10-25 20:17:36 UTC (rev 207840)
+++ trunk/Source/WebCore/platform/win/PasteboardWin.cpp        2016-10-25 20:23:10 UTC (rev 207841)
</span><span class="lines">@@ -1051,4 +1051,16 @@
</span><span class="cx">         GlobalFree(medium.hGlobal);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Pasteboard::write(const PasteboardWebContent&amp;)
+{
+}
+
+void Pasteboard::read(PasteboardWebContentReader&amp;)
+{
+}
+
+void Pasteboard::write(const PasteboardImage&amp;)
+{
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>