diff --git a/mozilla/java/dist/mcp-test/src/test/java/cardemo/CarDemoTest.java b/mozilla/java/dist/mcp-test/src/test/java/cardemo/CarDemoTest.java index e5c324100ba..0d073dd2e7a 100755 --- a/mozilla/java/dist/mcp-test/src/test/java/cardemo/CarDemoTest.java +++ b/mozilla/java/dist/mcp-test/src/test/java/cardemo/CarDemoTest.java @@ -7,8 +7,11 @@ package cardemo; +import java.awt.Robot; +import java.awt.event.InputEvent; import org.mozilla.mcp.MCP; import org.mozilla.webclient.WebclientTestCase; +import org.w3c.dom.Element; /** * @@ -38,7 +41,21 @@ public class CarDemoTest extends WebclientTestCase { public void testCardemo() throws Exception { mcp.getRealizedVisibleBrowserWindow(); mcp.blockingLoad("http://webdev1.sun.com/jsf-ajax-cardemo/faces/chooseLocale.jsp"); - Thread.currentThread().sleep(10000); + Element germanButton = mcp.getElementInCurrentPageById("j_id_id73:Germany"); + assertNotNull(germanButton); + String clientX = germanButton.getAttribute("clientX"); + String clientY = germanButton.getAttribute("clientY"); + assertNotNull(clientX); + assertNotNull(clientY); + int x = Integer.valueOf(clientX).intValue(); + int y = Integer.valueOf(clientY).intValue(); + Robot robot = new Robot(); + + robot.mouseMove(x, y); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + + Thread.currentThread().sleep(30000); } } diff --git a/mozilla/java/dom/jni/Makefile.in b/mozilla/java/dom/jni/Makefile.in index 8ef80c6a0ea..1a1022b9e8e 100644 --- a/mozilla/java/dom/jni/Makefile.in +++ b/mozilla/java/dom/jni/Makefile.in @@ -28,6 +28,7 @@ REQUIRES = xpcom \ javadom \ string \ embed_base \ + layout \ webBrowser_core \ webshell \ windowwatcher \ diff --git a/mozilla/java/dom/jni/javaDOMGlobals.h b/mozilla/java/dom/jni/javaDOMGlobals.h index 9d00f2a3a9c..1923b052ca6 100644 --- a/mozilla/java/dom/jni/javaDOMGlobals.h +++ b/mozilla/java/dom/jni/javaDOMGlobals.h @@ -107,5 +107,13 @@ class JavaDOMGlobals { static nsString* GetUnicode(JNIEnv *env, jstring str); }; + +#if defined(XP_UNIX) || defined(XP_MAC) || defined(XP_BEOS) + +#define DOM_ITOA(intVal, buf, radix) sprintf(buf, "%d", intVal) +#else +#include +#define DOM_ITOA(intVal, buf, radix) itoa(intVal, buf, radix) +#endif #endif /* __JavaDOMGlobals_h__ */ diff --git a/mozilla/java/dom/jni/org_mozilla_dom_ElementImpl.cpp b/mozilla/java/dom/jni/org_mozilla_dom_ElementImpl.cpp index 89486c8affb..4a5db867b82 100644 --- a/mozilla/java/dom/jni/org_mozilla_dom_ElementImpl.cpp +++ b/mozilla/java/dom/jni/org_mozilla_dom_ElementImpl.cpp @@ -20,6 +20,10 @@ */ #include "prlog.h" +#include "nsCOMPtr.h" +#include "nsIDOMDocument.h" +#include "nsIDOMNSDocument.h" +#include "nsIBoxObject.h" #include "nsIDOMElement.h" #include "nsIDOMAttr.h" #include "nsIDOMNodeList.h" @@ -27,6 +31,11 @@ #include "javaDOMGlobals.h" #include "org_mozilla_dom_ElementImpl.h" +static PRBool isInterceptableAttr(nsString *attrName); +static jstring handleInterceptableAttr(nsIDOMElement *element, + nsString *attrName, + JNIEnv *env, + jobject jthis); /* * Class: org_mozilla_dom_ElementImpl @@ -36,6 +45,7 @@ JNIEXPORT jstring JNICALL Java_org_mozilla_dom_ElementImpl_getAttribute (JNIEnv *env, jobject jthis, jstring jname) { + jstring jattr = nsnull; nsIDOMElement* element = (nsIDOMElement*) env->GetLongField(jthis, JavaDOMGlobals::nodePtrFID); if (!element || !jname) { @@ -48,21 +58,28 @@ JNIEXPORT jstring JNICALL Java_org_mozilla_dom_ElementImpl_getAttribute if (!cname) return NULL; - nsString attr; - nsresult rv = element->GetAttribute(*cname, attr); - nsMemory::Free(cname); - - if (NS_FAILED(rv)) { - JavaDOMGlobals::ThrowException(env, - "Element.getAttribute: failed", rv); - return NULL; + // Special case intercepts + if (isInterceptableAttr(cname)) { + jattr = handleInterceptableAttr(element, cname, env, jthis); } - - jstring jattr = env->NewString((jchar*) attr.get(), attr.Length()); - if (!jattr) { - JavaDOMGlobals::ThrowException(env, - "Element.getAttribute: NewString failed"); - return NULL; + else { + nsString attr; + nsresult rv = element->GetAttribute(*cname, attr); + nsMemory::Free(cname); + + if (NS_FAILED(rv)) { + JavaDOMGlobals::ThrowException(env, + "Element.getAttribute: failed", rv); + jattr = NULL; + } + else { + jattr = env->NewString((jchar*) attr.get(), attr.Length()); + if (!jattr) { + JavaDOMGlobals::ThrowException(env, + "Element.getAttribute: NewString failed"); + jattr = NULL; + } + } } return jattr; @@ -768,3 +785,81 @@ JNIEXPORT jboolean JNICALL Java_org_mozilla_dom_ElementImpl_hasAttributeNS return (hasAttr == PR_TRUE) ? JNI_TRUE : JNI_FALSE; } + +static PRBool isInterceptableAttr(nsString *attrName) +{ + PRBool result = PR_FALSE; + if (attrName->Equals(NS_LITERAL_STRING("clientX")) || + attrName->Equals(NS_LITERAL_STRING("clientY")) || + attrName->Equals(NS_LITERAL_STRING("screenX")) || + attrName->Equals(NS_LITERAL_STRING("screenY")) + ) { + result = PR_TRUE; + } + return result; +} + +static jstring handleInterceptableAttr(nsIDOMElement *element, + nsString *attrName, + JNIEnv *env, + jobject jthis) +{ + if (nsnull == element || + nsnull == attrName || + nsnull == env || + nsnull == jthis) { + return nsnull; + } + + jstring result = nsnull; + nsCOMPtr ownerDocument = nsnull; + nsCOMPtr nsDocument = nsnull; + nsCOMPtr boxObject = nsnull; + nsresult rv = NS_OK; + PRInt32 coord = 0; + PRBool hasValue = PR_FALSE; + const PRInt32 bufLen = 20; + char buf[bufLen]; + memset(buf, 0, bufLen); + + rv = element->GetOwnerDocument(getter_AddRefs(ownerDocument)); + if (NS_SUCCEEDED(rv)){ + nsDocument = do_QueryInterface(ownerDocument, &rv); + if (NS_SUCCEEDED(rv)) { + rv = nsDocument->GetBoxObjectFor(element, + getter_AddRefs(boxObject)); + if (NS_SUCCEEDED(rv)) { + if (attrName->Equals(NS_LITERAL_STRING("clientX"))) { + rv = boxObject->GetX(&coord); + if (NS_SUCCEEDED(rv)) { + hasValue = PR_TRUE; + } + } + else if (attrName->Equals(NS_LITERAL_STRING("clientY"))) { + rv = boxObject->GetY(&coord); + if (NS_SUCCEEDED(rv)) { + hasValue = PR_TRUE; + } + } + else if (attrName->Equals(NS_LITERAL_STRING("screenX"))) { + rv = boxObject->GetScreenX(&coord); + if (NS_SUCCEEDED(rv)) { + hasValue = PR_TRUE; + } + } + else if (attrName->Equals(NS_LITERAL_STRING("screenY"))) { + rv = boxObject->GetScreenY(&coord); + if (NS_SUCCEEDED(rv)) { + hasValue = PR_TRUE; + } + } + } + } + } + if (hasValue) { + DOM_ITOA(coord, buf, 10); + result = env->NewStringUTF(buf); + } + + return result; +} diff --git a/mozilla/java/webclient/build-tests.xml b/mozilla/java/webclient/build-tests.xml index 0f99c85213b..351f22aa5db 100644 --- a/mozilla/java/webclient/build-tests.xml +++ b/mozilla/java/webclient/build-tests.xml @@ -66,6 +66,7 @@ + @@ -103,6 +104,7 @@ + diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/mcp/MCP.java b/mozilla/java/webclient/classes_spec/org/mozilla/mcp/MCP.java index 88b98f5be6a..52e607aa800 100755 --- a/mozilla/java/webclient/classes_spec/org/mozilla/mcp/MCP.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/mcp/MCP.java @@ -18,11 +18,14 @@ import java.util.logging.Logger; import org.mozilla.webclient.BrowserControl; import org.mozilla.webclient.BrowserControlCanvas; import org.mozilla.webclient.BrowserControlFactory; +import org.mozilla.webclient.CurrentPage2; import org.mozilla.webclient.DocumentLoadEvent; import org.mozilla.webclient.EventRegistration2; import org.mozilla.webclient.Navigation2; import org.mozilla.webclient.PageInfoListener; import org.mozilla.webclient.WebclientEvent; +import org.w3c.dom.Document; +import org.w3c.dom.Element; /** * @@ -47,6 +50,7 @@ public class MCP { private Navigation2 navigation = null; private EventRegistration2 eventRegistration = null; private PageInfoListener pageInfoListener = null; + private CurrentPage2 currentPage = null; private Frame frame = null; private int x = 0; private int y = 0; @@ -103,6 +107,24 @@ public class MCP { return eventRegistration; } + private CurrentPage2 getCurrentPage() { + if (null == currentPage) { + try { + currentPage = (CurrentPage2) + getBrowserControl().queryInterface(BrowserControl.CURRENT_PAGE_NAME); + } + catch (Throwable th) { + if (LOGGER.isLoggable(Level.SEVERE)) { + LOGGER.throwing(this.getClass().getName(), "getCurrentPage", + th); + LOGGER.severe("Unable to obtain CurrentPage2 reference from BrowserControl"); + } + } + + } + return currentPage; + } + private PageInfoListener getPageInfoListener() { if (null == pageInfoListener) { pageInfoListener = new PageInfoListenerImpl(this); @@ -162,6 +184,14 @@ public class MCP { return frame; } + public Element getElementInCurrentPageById(String id) { + Element result = null; + Document dom = getCurrentPage().getDOM(); + result = dom.getElementById(id); + + return result; + } + public void blockingLoad(String url) { Navigation2 nav = getNavigation(); synchronized (this) { diff --git a/mozilla/java/webclient/test/automated/src/classes/org/mozilla/webclient/DOMTest.java b/mozilla/java/webclient/test/automated/src/classes/org/mozilla/webclient/DOMTest.java index b214c8cd08d..facf4ba3fea 100644 --- a/mozilla/java/webclient/test/automated/src/classes/org/mozilla/webclient/DOMTest.java +++ b/mozilla/java/webclient/test/automated/src/classes/org/mozilla/webclient/DOMTest.java @@ -1,5 +1,5 @@ /* - * $Id: DOMTest.java,v 1.2 2005-02-14 02:16:18 edburns%acm.org Exp $ + * $Id: DOMTest.java,v 1.3 2007-03-06 03:28:47 edburns%acm.org Exp $ */ /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- @@ -39,6 +39,7 @@ import java.io.File; import java.io.FileInputStream; import org.w3c.dom.Document; +import org.w3c.dom.Element; import org.w3c.dom.Node; // DOMTest.java @@ -127,10 +128,30 @@ public class DOMTest extends WebclientTestCase { Document dom = currentPage.getDOM(); assertNotNull(dom); - Node node = dom.getElementById("HistoryTest1.html"); - assertNotNull(node); - assertEquals(1, node.getNodeType()); - node = node.getFirstChild(); + Element element = dom.getElementById("HistoryTest1.html"); + assertNotNull(element); + assertEquals(1, element.getNodeType()); + + String strX = element.getAttribute("clientX"); + String strY = element.getAttribute("clientY"); + assertNotNull(strX); + assertNotNull(strY); + int x, y; + x = Integer.valueOf(strX).intValue(); + assertEquals(8, x); + y = Integer.valueOf(strY).intValue(); + assertEquals(103, y); + + strX = element.getAttribute("screenX"); + strY = element.getAttribute("screenY"); + assertNotNull(strX); + assertNotNull(strY); + x = Integer.valueOf(strX).intValue(); + assertEquals(8, x); + y = Integer.valueOf(strY).intValue(); + assertEquals(102, y); + + Node node = element.getFirstChild(); assertEquals("next", node.getNodeValue()); frame.setVisible(false);