[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
morrita at google.com
morrita at google.com
Wed Dec 22 12:08:03 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 222ce0958efc98c2279b6ccb307af78472c4c6ee
Author: morrita at google.com <morrita at google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Mon Aug 16 07:30:02 2010 +0000
2010-08-13 MORITA Hajime <morrita at google.com>
Reviewed by Tony Chang.
https://bugs.webkit.org/show_bug.cgi?id=43778
Dropping should fire textInput event.
* editing/pasteboard/drop-text-events-expected.txt: Added.
* editing/pasteboard/drop-text-events-sideeffect-expected.txt: Added.
* editing/pasteboard/drop-text-events-sideeffect.html: Added.
* editing/pasteboard/drop-text-events.html: Added.
* editing/pasteboard/script-tests/drop-text-events-sideeffect.js: Added.
* editing/pasteboard/script-tests/drop-text-events.js: Added.
2010-08-13 MORITA Hajime <morrita at google.com>
Reviewed by Tony Chang.
https://bugs.webkit.org/show_bug.cgi?id=43778
Dropping should fire textInput event
This change:
- added TextEvent::m_isDrop to distinguish drop-initiated events.
- added to dispatch TextEvent from DragController before making a side effect
and cancel the side effect if the event prevents default
Tests: editing/pasteboard/drop-text-events-sideeffect.html
editing/pasteboard/drop-text-events.html
* dom/TextEvent.cpp:
(WebCore::TextEvent::createForDrop): Added.
(WebCore::TextEvent::TextEvent):
* dom/TextEvent.h:
(WebCore::TextEvent::isDrop): Added.
* editing/Editor.cpp:
(WebCore::Editor::handleTextEvent):
(WebCore::Editor::findEventTargetFrom): Extracted from findEventTargetFromSelection().
(WebCore::Editor::findEventTargetFromSelection):
* editing/Editor.h:
* page/DragController.cpp:
(WebCore::DragController::dispatchTextInputEventFor): Added.
(WebCore::DragController::concludeEditDrag): Added an event dispatch path.
* page/DragController.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@65395 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 4df4e0a..ef19ff1 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,17 @@
+2010-08-13 MORITA Hajime <morrita at google.com>
+
+ Reviewed by Tony Chang.
+
+ https://bugs.webkit.org/show_bug.cgi?id=43778
+ Dropping should fire textInput event.
+
+ * editing/pasteboard/drop-text-events-expected.txt: Added.
+ * editing/pasteboard/drop-text-events-sideeffect-expected.txt: Added.
+ * editing/pasteboard/drop-text-events-sideeffect.html: Added.
+ * editing/pasteboard/drop-text-events.html: Added.
+ * editing/pasteboard/script-tests/drop-text-events-sideeffect.js: Added.
+ * editing/pasteboard/script-tests/drop-text-events.js: Added.
+
2010-08-15 Ariya Hidayat <ariya at sencha.com>
Reviewed by Antonio Gomes.
diff --git a/LayoutTests/editing/pasteboard/drop-text-events-expected.txt b/LayoutTests/editing/pasteboard/drop-text-events-expected.txt
new file mode 100644
index 0000000..cdddb75
--- /dev/null
+++ b/LayoutTests/editing/pasteboard/drop-text-events-expected.txt
@@ -0,0 +1,35 @@
+This tests that Drag drop fires textInput events.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS event.data is 'PlainHello'
+PASS testTargetTextarea.value is 'PlainHello'
+PASS event.data is 'PlainHello'
+PASS testTargetInput.value is 'PlainHello'
+PASS event.data is ''
+PASS 0 <= testTargetEditable.innerHTML.indexOf('PlainHello') is true
+PASS event.data is 'RichHello'
+PASS testTargetTextarea.value is 'RichHello'
+PASS event.data is 'RichHello'
+PASS testTargetInput.value is 'RichHello'
+PASS event.data is ''
+PASS 0 <= testTargetEditable.innerHTML.indexOf('<b>Rich</b>Hello') is true
+PASS textInputCount is proceedingTestCases.length
+PASS event.data is 'PlainHello'
+PASS testTargetTextarea.value is ''
+PASS event.data is 'PlainHello'
+PASS testTargetInput.value is ''
+PASS event.data is ''
+PASS testTargetEditable.innerHTML is 'placeholder'
+PASS event.data is 'RichHello'
+PASS testTargetTextarea.value is ''
+PASS event.data is 'RichHello'
+PASS testTargetInput.value is ''
+PASS event.data is ''
+PASS testTargetEditable.innerHTML is 'placeholder'
+PASS textInputCount is cancelingTestCases.length
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/editing/pasteboard/drop-text-events-sideeffect-expected.txt b/LayoutTests/editing/pasteboard/drop-text-events-sideeffect-expected.txt
new file mode 100644
index 0000000..bf50962
--- /dev/null
+++ b/LayoutTests/editing/pasteboard/drop-text-events-sideeffect-expected.txt
@@ -0,0 +1,11 @@
+Ensure safety on side-effect on drop-initiated TextEvent.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS testTargetEditable.innerHTML is 'initialValue'
+PASS testTargetIFrameDocument.body.innerHTML is 'initialBody'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/editing/pasteboard/drop-text-events-sideeffect.html b/LayoutTests/editing/pasteboard/drop-text-events-sideeffect.html
new file mode 100644
index 0000000..b52950a
--- /dev/null
+++ b/LayoutTests/editing/pasteboard/drop-text-events-sideeffect.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/drop-text-events-sideeffect.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/editing/pasteboard/drop-text-events.html b/LayoutTests/editing/pasteboard/drop-text-events.html
new file mode 100644
index 0000000..a678d01
--- /dev/null
+++ b/LayoutTests/editing/pasteboard/drop-text-events.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/drop-text-events.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/editing/pasteboard/script-tests/drop-text-events-sideeffect.js b/LayoutTests/editing/pasteboard/script-tests/drop-text-events-sideeffect.js
new file mode 100644
index 0000000..d45c7ef
--- /dev/null
+++ b/LayoutTests/editing/pasteboard/script-tests/drop-text-events-sideeffect.js
@@ -0,0 +1,91 @@
+description('Ensure safety on side-effect on drop-initiated TextEvent.');
+
+function toStringLiteral(str)
+{
+ return "'" + str + "'";
+}
+
+var testSourceRoot = document.createElement("div");
+document.body.appendChild(testSourceRoot);
+
+var testTargetRoot = document.createElement("div");
+testTargetRoot.innerHTML += "<div><span id='targetEditable' contentEditable>initialValue</span></div>";
+testTargetRoot.innerHTML += "<iframe id='targetIFrame' src='data:text/html;charset=utf-8," + encodeURI("<html></html>") + "'></iframe>";
+document.body.appendChild(testTargetRoot);
+
+testTargetEditable = document.getElementById("targetEditable");
+testTargetIFrame = document.getElementById("targetIFrame");
+testTargetIFrameDocument = testTargetIFrame.contentDocument;
+testTargetIFrameDocument.body.innerHTML = "initialBody";
+testTargetIFrameDocument.designMode = "on";
+
+function handlerRemovingTarget(event)
+{
+ event.target.parentNode.removeChild(event.target);
+}
+
+function handlerRemovingIFrame(event)
+{
+ testTargetIFrame.parentNode.removeChild(testTargetIFrame);
+}
+
+function dragFrom(element)
+{
+ var x = element.offsetLeft + element.offsetWidth / 2;
+ var y = element.offsetTop + element.offsetHeight / 2;
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseDown();
+
+ // Makes drag happen
+ var meaninglessDelta = 10;
+ eventSender.leapForward(500);
+ eventSender.mouseMoveTo(x + meaninglessDelta , y + meaninglessDelta);
+}
+
+function dropTo(element)
+{
+ var x = element.offsetLeft + element.offsetWidth / 2;
+ var y = element.offsetTop + element.offsetHeight / 2;
+
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseUp();
+}
+
+function dragPlainText()
+{
+ var selection = window.getSelection();
+
+ testSourceRoot.innerHTML = "<input type='text' value='PlainHello' id='src' />";
+ var input = document.getElementById("src");
+ input.focus();
+ selection.modify("extend", "forward", "line");
+ dragFrom(input);
+}
+
+function dropToTargetEditable()
+{
+ dropTo(testTargetEditable);
+}
+
+function dropToTargetIFrame()
+{
+ dropTo(testTargetIFrame);
+}
+
+testTargetEditable.addEventListener("textInput", handlerRemovingTarget);
+dragPlainText();
+dropToTargetEditable();
+// detached node shouldn't get dropped value
+shouldBe("testTargetEditable.innerHTML", toStringLiteral("initialValue"));
+
+testTargetIFrameDocument.body.addEventListener("textInput", handlerRemovingIFrame);
+dragPlainText();
+dropToTargetIFrame();
+// detached frame shouldn't get dropped value
+shouldBe("testTargetIFrameDocument.body.innerHTML", toStringLiteral("initialBody"));
+
+// Hides dataset to make dump clean.
+testTargetRoot.style.display = "none";
+testSourceRoot.style.display = "none";
+
+var successfullyParsed = true;
\ No newline at end of file
diff --git a/LayoutTests/editing/pasteboard/script-tests/drop-text-events.js b/LayoutTests/editing/pasteboard/script-tests/drop-text-events.js
new file mode 100644
index 0000000..eeb5488
--- /dev/null
+++ b/LayoutTests/editing/pasteboard/script-tests/drop-text-events.js
@@ -0,0 +1,173 @@
+description('This tests that Drag drop fires textInput events.');
+
+function toStringLiteral(str)
+{
+ return "'" + str + "'";
+}
+
+var willCancelTextInput = false;
+var textInputCount = 0;
+var expectedTextEventData = "";
+
+function droppingTextInputHandler(evt)
+{
+ shouldBe("event.data", toStringLiteral(expectedTextEventData));
+ textInputCount++;
+ if (willCancelTextInput)
+ evt.preventDefault();
+}
+
+var testSourceRoot = document.createElement("div");
+document.body.appendChild(testSourceRoot);
+
+var testTargetRoot = document.createElement("div");
+testTargetRoot.innerHTML += "<input type='text' id='targetInput' value=''>";
+testTargetRoot.innerHTML += "<div><span id='targetEditable' contentEditable></span></div>";
+testTargetRoot.innerHTML += "<textarea id='targetTextarea' ></textarea>";
+document.body.appendChild(testTargetRoot);
+
+testTargetEditable = document.getElementById("targetEditable");
+testTargetEditable.addEventListener("textInput", droppingTextInputHandler);
+testTargetInput = document.getElementById("targetInput");
+testTargetInput.addEventListener("textInput", droppingTextInputHandler);
+testTargetTextarea = document.getElementById("targetTextarea");
+testTargetTextarea.addEventListener("textInput", droppingTextInputHandler);
+
+var selection = window.getSelection();
+
+function clearTargets()
+{
+ testTargetEditable.innerHTML = "placeholder"; // give some text to have an area to drop
+ testTargetInput.value = "";
+ testTargetTextarea.value = "";
+}
+
+function dragFrom(element)
+{
+ var x = element.offsetLeft + element.offsetWidth / 2;
+ var y = element.offsetTop + element.offsetHeight / 2;
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseDown();
+
+ // Makes drag happen
+ var meaninglessDelta = 10;
+ eventSender.leapForward(500);
+ eventSender.mouseMoveTo(x + meaninglessDelta , y + meaninglessDelta);
+}
+
+function dropTo(element)
+{
+ var x = element.offsetLeft + element.offsetWidth / 2;
+ var y = element.offsetTop + element.offsetHeight / 2;
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseUp();
+}
+
+function dragPlainText()
+{
+ testSourceRoot.innerHTML = "<input type='text' value='PlainHello' id='src' />";
+ var input = document.getElementById("src");
+ input.focus();
+ selection.modify("extend", "forward", "line");
+ dragFrom(input);
+}
+
+function dragRichText()
+{
+ testSourceRoot.innerHTML = "<div id='src' contentEditable><b>Rich</b>Hello</div>";
+ var editable = document.getElementById("src");
+ selection.setBaseAndExtent(editable, 0, editable, 0);
+ selection.modify("extend", "forward", "line");
+ dragFrom(editable);
+}
+
+function dropToTargetEditable()
+{
+ var editable = testTargetEditable;
+ dropTo(editable);
+}
+
+function targetEditableShouldHave(value)
+{
+ shouldBeTrue("0 <= testTargetEditable.innerHTML.indexOf(" + toStringLiteral(value) + ")");
+}
+
+function targetEditableShouldStayAsIs()
+{
+ shouldBe("testTargetEditable.innerHTML", toStringLiteral("placeholder"));
+}
+
+function dropToTargetInput()
+{
+ var input = testTargetInput;
+ dropTo(input);
+}
+
+function targetInputShouldHave(value)
+{
+ shouldBe("testTargetInput.value", toStringLiteral(value));
+}
+
+function dropToTargetTextarea()
+{
+ var textarea = testTargetTextarea;
+ dropTo(textarea);
+}
+
+function targetTextareaShouldHave(value)
+{
+ shouldBe("testTargetTextarea.value", toStringLiteral(value));
+}
+
+var proceedingTestCases = [
+ [dragPlainText, dropToTargetTextarea, targetTextareaShouldHave, "PlainHello", "PlainHello"],
+ [dragPlainText, dropToTargetInput, targetInputShouldHave, "PlainHello", "PlainHello"],
+ [dragPlainText, dropToTargetEditable, targetEditableShouldHave, "PlainHello", ""],
+ [dragRichText, dropToTargetTextarea, targetTextareaShouldHave, "RichHello", "RichHello"],
+ [dragRichText, dropToTargetInput, targetInputShouldHave, "RichHello", "RichHello"],
+ [dragRichText, dropToTargetEditable, targetEditableShouldHave, "<b>Rich</b>Hello", ""],
+];
+
+var cancelingTestCases = [
+ [dragPlainText, dropToTargetTextarea, targetTextareaShouldHave, "", "PlainHello"],
+ [dragPlainText, dropToTargetInput, targetInputShouldHave, "", "PlainHello"],
+ [dragPlainText, dropToTargetEditable, targetEditableShouldStayAsIs, "", ""],
+ [dragRichText, dropToTargetTextarea, targetTextareaShouldHave, "", "RichHello"],
+ [dragRichText, dropToTargetInput, targetInputShouldHave, "", "RichHello"],
+ [dragRichText, dropToTargetEditable, targetEditableShouldStayAsIs, "", ""],
+];
+
+function runSingleTest(caseData)
+{
+ var drag = caseData[0];
+ var drop = caseData[1];
+ var verifyFunction = caseData[2];
+ var verifyParameter = caseData[3];
+
+ expectedTextEventData = caseData[4];
+
+ clearTargets();
+ drag();
+ drop();
+ verifyFunction(verifyParameter);
+}
+
+eventSender.dragMode = false;
+
+textInputCount = 0;
+willCancelTextInput = false;
+for (var i = 0; i < proceedingTestCases.length; ++i)
+ runSingleTest(proceedingTestCases[i]);
+shouldBe("textInputCount", "proceedingTestCases.length");
+
+textInputCount = 0;
+willCancelTextInput = true;
+for (var i = 0; i < cancelingTestCases.length; ++i)
+ runSingleTest(cancelingTestCases[i]);
+shouldBe("textInputCount", "cancelingTestCases.length");
+
+// Hides dataset to make dump clean.
+testTargetRoot.style.display = "none";
+testSourceRoot.style.display = "none";
+
+var successfullyParsed = true;
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 3e2d24b..9d1d247 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,33 @@
+2010-08-13 MORITA Hajime <morrita at google.com>
+
+ Reviewed by Tony Chang.
+
+ https://bugs.webkit.org/show_bug.cgi?id=43778
+ Dropping should fire textInput event
+
+ This change:
+ - added TextEvent::m_isDrop to distinguish drop-initiated events.
+ - added to dispatch TextEvent from DragController before making a side effect
+ and cancel the side effect if the event prevents default
+
+ Tests: editing/pasteboard/drop-text-events-sideeffect.html
+ editing/pasteboard/drop-text-events.html
+
+ * dom/TextEvent.cpp:
+ (WebCore::TextEvent::createForDrop): Added.
+ (WebCore::TextEvent::TextEvent):
+ * dom/TextEvent.h:
+ (WebCore::TextEvent::isDrop): Added.
+ * editing/Editor.cpp:
+ (WebCore::Editor::handleTextEvent):
+ (WebCore::Editor::findEventTargetFrom): Extracted from findEventTargetFromSelection().
+ (WebCore::Editor::findEventTargetFromSelection):
+ * editing/Editor.h:
+ * page/DragController.cpp:
+ (WebCore::DragController::dispatchTextInputEventFor): Added.
+ (WebCore::DragController::concludeEditDrag): Added an event dispatch path.
+ * page/DragController.h:
+
2010-08-15 Ariya Hidayat <ariya at sencha.com>
Unreviewed, rolling out r65393.
diff --git a/WebCore/dom/TextEvent.cpp b/WebCore/dom/TextEvent.cpp
index e49e2ab..68ed4b2 100644
--- a/WebCore/dom/TextEvent.cpp
+++ b/WebCore/dom/TextEvent.cpp
@@ -60,6 +60,11 @@ PassRefPtr<TextEvent> TextEvent::createForFragmentPaste(PassRefPtr<AbstractView>
return adoptRef(new TextEvent(view, "", data, shouldSmartReplace, shouldMatchStyle));
}
+PassRefPtr<TextEvent> TextEvent::createForDrop(PassRefPtr<AbstractView> view, const String& data)
+{
+ return adoptRef(new TextEvent(view, data, TextEvent::InputTypeDrop));
+}
+
TextEvent::TextEvent()
: m_inputType(TextEvent::InputTypeKeyboard)
, m_shouldSmartReplace(false)
diff --git a/WebCore/dom/TextEvent.h b/WebCore/dom/TextEvent.h
index a450bc0..f1d24e9 100644
--- a/WebCore/dom/TextEvent.h
+++ b/WebCore/dom/TextEvent.h
@@ -38,7 +38,8 @@ namespace WebCore {
InputTypeKeyboard, // any newline characters in the text are line breaks only, not paragraph separators.
InputTypeLineBreak, // any tab characters in the text are backtabs.
InputTypeBackTab,
- InputTypePaste
+ InputTypePaste,
+ InputTypeDrop,
};
static InputType selectInputType(bool isLineBreak, bool isBackTab);
@@ -46,6 +47,7 @@ namespace WebCore {
static PassRefPtr<TextEvent> create(PassRefPtr<AbstractView> view, const String& data, InputType = InputTypeKeyboard);
static PassRefPtr<TextEvent> createForPlainTextPaste(PassRefPtr<AbstractView> view, const String& data, bool shouldSmartReplace);
static PassRefPtr<TextEvent> createForFragmentPaste(PassRefPtr<AbstractView> view, PassRefPtr<DocumentFragment> data, bool shouldSmartReplace, bool shouldMatchStyle);
+ static PassRefPtr<TextEvent> createForDrop(PassRefPtr<AbstractView> view, const String& data);
virtual ~TextEvent();
@@ -58,6 +60,7 @@ namespace WebCore {
bool isLineBreak() const { return m_inputType == InputTypeLineBreak; }
bool isBackTab() const { return m_inputType == InputTypeBackTab; }
bool isPaste() const { return m_inputType == InputTypePaste; }
+ bool isDrop() const { return m_inputType == InputTypeDrop; }
bool shouldSmartReplace() const { return m_shouldSmartReplace; }
bool shouldMatchStyle() const { return m_shouldMatchStyle; }
@@ -65,9 +68,11 @@ namespace WebCore {
private:
TextEvent();
+
TextEvent(PassRefPtr<AbstractView>, const String& data, InputType = InputTypeKeyboard);
TextEvent(PassRefPtr<AbstractView>, const String& data, PassRefPtr<DocumentFragment>,
bool shouldSmartReplace, bool shouldMatchStyle);
+
InputType m_inputType;
String m_data;
diff --git a/WebCore/editing/Editor.cpp b/WebCore/editing/Editor.cpp
index 34d97f1..196384a 100644
--- a/WebCore/editing/Editor.cpp
+++ b/WebCore/editing/Editor.cpp
@@ -130,6 +130,11 @@ void Editor::handleInputMethodKeydown(KeyboardEvent* event)
bool Editor::handleTextEvent(TextEvent* event)
{
+ // Default event handling for Drag and Drop will be handled by DragController
+ // so we leave the event for it.
+ if (event->isDrop())
+ return false;
+
if (event->isPaste()) {
if (event->pastingFragment())
replaceSelectionWithFragment(event->pastingFragment(), false, event->shouldSmartReplace(), event->shouldMatchStyle());
@@ -762,14 +767,20 @@ bool Editor::dispatchCPPEvent(const AtomicString &eventType, ClipboardAccessPoli
return !noDefaultProcessing;
}
-Node* Editor::findEventTargetFromSelection() const
+Node* Editor::findEventTargetFrom(const VisibleSelection& selection) const
{
- Node* target = m_frame->selection()->start().element();
+ Node* target = selection.start().element();
if (!target)
target = m_frame->document()->body();
if (!target)
return 0;
return target->shadowAncestorNode();
+
+}
+
+Node* Editor::findEventTargetFromSelection() const
+{
+ return findEventTargetFrom(m_frame->selection()->selection());
}
void Editor::applyStyle(CSSStyleDeclaration* style, EditAction editingAction)
diff --git a/WebCore/editing/Editor.h b/WebCore/editing/Editor.h
index 13e6df5..06e7513 100644
--- a/WebCore/editing/Editor.h
+++ b/WebCore/editing/Editor.h
@@ -299,6 +299,7 @@ public:
void pasteAsFragment(PassRefPtr<DocumentFragment>, bool smartReplace, bool matchStyle);
void pasteAsPlainText(const String&, bool smartReplace);
+ Node* findEventTargetFrom(const VisibleSelection& selection) const;
private:
Frame* m_frame;
OwnPtr<DeleteButtonController> m_deleteButtonController;
diff --git a/WebCore/page/DragController.cpp b/WebCore/page/DragController.cpp
index d93a256..bbf4fed 100644
--- a/WebCore/page/DragController.cpp
+++ b/WebCore/page/DragController.cpp
@@ -63,6 +63,7 @@
#include "SelectionController.h"
#include "Settings.h"
#include "Text.h"
+#include "TextEvent.h"
#include "htmlediting.h"
#include "markup.h"
#include <wtf/CurrentTime.h>
@@ -363,6 +364,15 @@ static bool setSelectionToDragCaret(Frame* frame, VisibleSelection& dragCaret, R
return !frame->selection()->isNone() && frame->selection()->isContentEditable();
}
+bool DragController::dispatchTextInputEventFor(Frame* innerFrame, DragData* dragData)
+{
+ VisibleSelection dragCaret(m_page->dragCaretController()->selection());
+ String text = dragCaret.isContentRichlyEditable() ? "" : dragData->asPlainText();
+ Node* target = innerFrame->editor()->findEventTargetFrom(dragCaret);
+ ExceptionCode ec = 0;
+ return target->dispatchEvent(TextEvent::createForDrop(innerFrame->domWindow(), text), ec);
+}
+
bool DragController::concludeEditDrag(DragData* dragData)
{
ASSERT(dragData);
@@ -376,12 +386,13 @@ bool DragController::concludeEditDrag(DragData* dragData)
Frame* innerFrame = element->ownerDocument()->frame();
ASSERT(innerFrame);
+ if (!dispatchTextInputEventFor(innerFrame, dragData))
+ return true;
+
if (dragData->containsColor()) {
Color color = dragData->asColor();
if (!color.isValid())
return false;
- if (!innerFrame)
- return false;
RefPtr<Range> innerRange = innerFrame->selection()->toNormalizedRange();
RefPtr<CSSStyleDeclaration> style = m_documentUnderMouse->createCSSStyleDeclaration();
ExceptionCode ec;
diff --git a/WebCore/page/DragController.h b/WebCore/page/DragController.h
index 712f9ab..0e90a52 100644
--- a/WebCore/page/DragController.h
+++ b/WebCore/page/DragController.h
@@ -90,6 +90,7 @@ namespace WebCore {
static const float DragImageAlpha;
private:
+ bool dispatchTextInputEventFor(Frame*, DragData*);
bool canProcessDrag(DragData*);
bool concludeEditDrag(DragData*);
DragOperation dragEnteredOrUpdated(DragData*);
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list