package org.jboss.tools.jsf.vpe.jsf.test.jbide;
import static org.jboss.tools.vpe.xulrunner.util.XPCOM.queryInterface;
import static org.junit.Assert.*;
import org.eclipse.core.resources.IFile;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.jboss.tools.jsf.vpe.jsf.test.JsfAllTests;
import org.jboss.tools.jst.web.ui.internal.editor.jspeditor.JSPMultiPageEditor;
import org.jboss.tools.vpe.base.test.TestUtil;
import org.jboss.tools.vpe.base.test.VpeTest;
import org.jboss.tools.vpe.editor.VpeController;
import org.jboss.tools.vpe.editor.VpeEditorPart;
import org.junit.Test;
import org.mozilla.interfaces.nsIDOMAbstractView;
import org.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMDocumentEvent;
import org.mozilla.interfaces.nsIDOMDocumentView;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMEvent;
import org.mozilla.interfaces.nsIDOMEventTarget;
import org.mozilla.interfaces.nsIDOMKeyEvent;
import org.mozilla.interfaces.nsIDOMNSEvent;
import org.mozilla.interfaces.nsIDOMNode;
import org.mozilla.interfaces.nsIDOMNodeList;
import org.mozilla.interfaces.nsIDOMWindowUtils;
import org.mozilla.interfaces.nsIInterfaceRequestor;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
@SuppressWarnings("restriction")
public class EditingSPecialSymbolsVPE_JBIDE3810 extends VpeTest {
private final static int clientX = 5;
private final static int clientY = 12;
private final static long delay = 2000;
public EditingSPecialSymbolsVPE_JBIDE3810() {
}
@Test
public void testEditingSPecialSymbolsVPE_JBIDE3810() throws Exception {
setException(null);
IFile file = (IFile) TestUtil.getComponentPath(
"JBIDE/3810/JBIDE3810.jsp", //$NON-NLS-1$
JsfAllTests.IMPORT_PROJECT_NAME);
IEditorInput editorInput = new FileEditorInput(file);
JSPMultiPageEditor part = openEditor(editorInput);
TestUtil.waitForIdle();
TestUtil.delay();
VpeController controller = TestUtil.getVpeController(part);
Mouse mouse = new Mouse(controller, delay);
mouse.click(clientX, clientY);
Keybord keybord = new Keybord(controller, delay);
keybord.pressBackSP();
mouse.click(clientX+2, clientY);
keybord.pressDel().pressDel();
compareVisualAndSourceTargets(part);
}
private class Keybord {
private nsIDOMDocumentEvent documentEvent;
private nsIDOMEventTarget eventTarget;
private nsIDOMAbstractView abstractView;
private long delay;
public Keybord(VpeController controller, long delay) {
this.delay = delay;
nsIDOMDocument idomDocument = controller.getXulRunnerEditor()
.getDOMDocument();
nsIDOMDocumentView documentView = queryInterface(idomDocument, nsIDOMDocumentView.class);
abstractView = documentView.getDefaultView();
documentEvent = queryInterface(idomDocument, nsIDOMDocumentEvent.class);
eventTarget = queryInterface(idomDocument, nsIDOMEventTarget.class);
}
public Keybord pressDel() {
nsIDOMEvent delEvent = documentEvent.createEvent("KeyboardEvent"); //$NON-NLS-1$
nsIDOMKeyEvent delKeyEvent = queryInterface(delEvent, nsIDOMKeyEvent.class);
delKeyEvent
.initKeyEvent("keypress", true, true, abstractView, false, //$NON-NLS-1$
false, false, false, nsIDOMKeyEvent.DOM_VK_DELETE,
0);
eventTarget.dispatchEvent(delKeyEvent);
TestUtil.waitForIdle();
TestUtil.delay();
return this;
}
public Keybord pressBackSP() {
nsIDOMEvent bsEvent = documentEvent.createEvent("KeyboardEvent"); //$NON-NLS-1$
nsIDOMKeyEvent bsKeyEvent = queryInterface(bsEvent, nsIDOMKeyEvent.class);
bsKeyEvent.initKeyEvent("keypress", true, true, abstractView, //$NON-NLS-1$
false, false, false, false,
nsIDOMKeyEvent.DOM_VK_BACK_SPACE, 0);
eventTarget.dispatchEvent(bsKeyEvent);
TestUtil.waitForIdle();
TestUtil.delay();
return this;
}
public Keybord pressLeft() {
nsIDOMEvent leftArrowEvent = documentEvent
.createEvent("KeyboardEvent"); //$NON-NLS-1$
nsIDOMKeyEvent leftArrowKeyEvent = queryInterface(leftArrowEvent, nsIDOMKeyEvent.class);
leftArrowKeyEvent.initKeyEvent("keypress", true, true, //$NON-NLS-1$
abstractView, false, false, false, false,
nsIDOMKeyEvent.DOM_VK_LEFT, 0);
eventTarget.dispatchEvent(leftArrowKeyEvent);
TestUtil.waitForIdle();
TestUtil.delay();
return this;
}
}
private class Mouse {
private long delay;
private nsIDOMWindowUtils windowUtils;
public Mouse(VpeController controller, long delay) {
this.delay = delay;
nsIDOMDocument idomDocument = controller.getXulRunnerEditor()
.getDOMDocument();
nsIDOMDocumentView documentView = queryInterface(idomDocument, nsIDOMDocumentView.class);
nsIDOMAbstractView abstractView = documentView.getDefaultView();
nsIInterfaceRequestor requestor = queryInterface(abstractView, nsIInterfaceRequestor.class);
nsIDOMWindowUtils windowUtils = (nsIDOMWindowUtils) requestor
.getInterface(nsIDOMWindowUtils.NS_IDOMWINDOWUTILS_IID);
this.windowUtils = windowUtils;
}
public Mouse click(int clientX, int clientY) {
windowUtils.sendMouseEvent("mousedown", clientX, clientY, 0, 1, //$NON-NLS-1$
nsIDOMNSEvent.MOUSEDOWN, true);
windowUtils.sendMouseEvent("mouseup", clientX, clientY, 0, 1, //$NON-NLS-1$
nsIDOMNSEvent.MOUSEUP, true);
TestUtil.delay();
return this;
}
}
@SuppressWarnings("deprecation")
private void compareVisualAndSourceTargets(JSPMultiPageEditor part) {
nsIDOMElement headElement = ((VpeEditorPart) part.getVisualEditor())
.getVisualEditor().getContentArea();
nsIDOMNodeList nodeList = headElement.getElementsByTagName("SPAN"); //$NON-NLS-1$
nsIDOMNode node = nodeList.item(0).getChildNodes().item(0);
String valueToCompare = node.getNodeValue();
assertEquals("\na\n", valueToCompare); //$NON-NLS-1$
IStructuredModel model = part.getSourceEditor().getModel();
IDOMModel sourceModel = (IDOMModel) model;
IDOMDocument sourceDocument = sourceModel.getDocument();
Node domNode = sourceDocument.getElementsByTagName("body").item(0); //$NON-NLS-1$
String sourceValueToCompare = ((Text) domNode.getChildNodes().item(0))
.getNodeValue();
assertEquals("\r\na\r\n", sourceValueToCompare); //$NON-NLS-1$
}
}