summaryrefslogtreecommitdiff
path: root/browser/devtools/sourceeditor/test/browser_bug687580_drag_and_drop.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/devtools/sourceeditor/test/browser_bug687580_drag_and_drop.js')
-rw-r--r--browser/devtools/sourceeditor/test/browser_bug687580_drag_and_drop.js162
1 files changed, 162 insertions, 0 deletions
diff --git a/browser/devtools/sourceeditor/test/browser_bug687580_drag_and_drop.js b/browser/devtools/sourceeditor/test/browser_bug687580_drag_and_drop.js
new file mode 100644
index 000000000..6b493969b
--- /dev/null
+++ b/browser/devtools/sourceeditor/test/browser_bug687580_drag_and_drop.js
@@ -0,0 +1,162 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+let tempScope = {};
+Cu.import("resource:///modules/source-editor.jsm", tempScope);
+let SourceEditor = tempScope.SourceEditor;
+
+let testWin;
+let editor;
+
+function test()
+{
+ let component = Services.prefs.getCharPref(SourceEditor.PREFS.COMPONENT);
+ if (component != "orion") {
+ ok(true, "skip test for bug 687580: only applicable for Orion");
+ return; // Testing for the fix requires direct Orion API access.
+ }
+ waitForExplicitFinish();
+
+ const windowUrl = "data:application/vnd.mozilla.xul+xml,<?xml version='1.0'?>" +
+ "<window xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'" +
+ " title='test for bug 687580 - drag and drop' width='600' height='500'>" +
+ "<box flex='1'/></window>";
+ const windowFeatures = "chrome,titlebar,toolbar,centerscreen,resizable,dialog=no";
+
+ testWin = Services.ww.openWindow(null, windowUrl, "_blank", windowFeatures, null);
+ testWin.addEventListener("load", function onWindowLoad() {
+ testWin.removeEventListener("load", onWindowLoad, false);
+ waitForFocus(initEditor, testWin);
+ }, false);
+}
+
+function initEditor()
+{
+ let box = testWin.document.querySelector("box");
+
+ editor = new SourceEditor();
+ editor.init(box, {}, editorLoaded);
+}
+
+function editorLoaded()
+{
+ editor.focus();
+
+ let view = editor._view;
+ let model = editor._model;
+
+ let lineHeight = view.getLineHeight();
+ let editorHeight = view.getClientArea().height;
+ let linesPerPage = Math.floor(editorHeight / lineHeight);
+ let totalLines = 2 * linesPerPage;
+
+ let text = "foobarBug687580-";
+ for (let i = 0; i < totalLines; i++) {
+ text += "l" + i + "\n";
+ }
+
+ editor.setText(text);
+ editor.setCaretOffset(0);
+
+ let bottomPixel = view.getBottomPixel();
+
+ EventUtils.synthesizeKey("VK_DOWN", {shiftKey: true}, testWin);
+ EventUtils.synthesizeKey("VK_DOWN", {shiftKey: true}, testWin);
+ EventUtils.synthesizeKey("VK_DOWN", {shiftKey: true}, testWin);
+
+ let initialSelection = editor.getSelection();
+
+ let ds = Cc["@mozilla.org/widget/dragservice;1"].
+ getService(Ci.nsIDragService);
+
+ let target = view._clientDiv;
+ let targetWin = target.ownerDocument.defaultView;
+
+ let dataTransfer = null;
+
+ let onDragStart = function(aEvent) {
+ target.removeEventListener("dragstart", onDragStart, false);
+
+ dataTransfer = aEvent.dataTransfer;
+ ok(dataTransfer, "dragstart event fired");
+ ok(dataTransfer.types.contains("text/plain"),
+ "dataTransfer text/plain available");
+ let text = dataTransfer.getData("text/plain");
+ isnot(text.indexOf("foobarBug687580"), -1, "text/plain data is correct");
+
+ dataTransfer.dropEffect = "move";
+ };
+
+ let onDrop = executeSoon.bind(null, function() {
+ target.removeEventListener("drop", onDrop, false);
+
+ let selection = editor.getSelection();
+ is(selection.end - selection.start,
+ initialSelection.end - initialSelection.start,
+ "selection is correct");
+ is(editor.getText(0, 2), "l3", "drag and drop worked");
+
+ let offset = editor.getCaretOffset();
+ ok(offset > initialSelection.end, "new caret location");
+
+ let initialLength = initialSelection.end - initialSelection.start;
+ let dropText = editor.getText(offset - initialLength, offset);
+ isnot(dropText.indexOf("foobarBug687580"), -1, "drop text is correct");
+
+ editor.destroy();
+ testWin.close();
+ testWin = editor = null;
+
+ waitForFocus(finish, window);
+ });
+
+ executeSoon(function() {
+ ds.startDragSession();
+
+ target.addEventListener("dragstart", onDragStart, false);
+ target.addEventListener("drop", onDrop, false);
+
+ EventUtils.synthesizeMouse(target, 10, 10, {type: "mousedown"}, targetWin);
+
+ EventUtils.synthesizeMouse(target, 11, bottomPixel - 25, {type: "mousemove"},
+ targetWin);
+
+ EventUtils.synthesizeMouse(target, 12, bottomPixel - 15, {type: "mousemove"},
+ targetWin);
+
+ let clientX = 5;
+ let clientY = bottomPixel - 10;
+
+ let event = targetWin.document.createEvent("DragEvents");
+ event.initDragEvent("dragenter", true, true, targetWin, 0, 0, 0, clientX,
+ clientY, false, false, false, false, 0, null,
+ dataTransfer);
+ target.dispatchEvent(event);
+
+ event = targetWin.document.createEvent("DragEvents");
+ event.initDragEvent("dragover", true, true, targetWin, 0, 0, 0, clientX + 1,
+ clientY + 2, false, false, false, false, 0, null,
+ dataTransfer);
+ target.dispatchEvent(event);
+
+ EventUtils.synthesizeMouse(target, clientX + 2, clientY + 1,
+ {type: "mouseup"}, targetWin);
+
+ event = targetWin.document.createEvent("DragEvents");
+ event.initDragEvent("drop", true, true, targetWin, 0, 0, 0, clientX + 2,
+ clientY + 3, false, false, false, false, 0, null,
+ dataTransfer);
+ target.dispatchEvent(event);
+
+ event = targetWin.document.createEvent("DragEvents");
+ event.initDragEvent("dragend", true, true, targetWin, 0, 0, 0, clientX + 3,
+ clientY + 2, false, false, false, false, 0, null,
+ dataTransfer);
+ target.dispatchEvent(event);
+
+ ds.endDragSession(true);
+ });
+}