From cdbed1c7f3d80a5e539cf2d11547050d004cc3de Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 6 Nov 2019 17:07:30 +0100 Subject: [PATCH] bug5048: started implementing cross-window messaging infrastructure --- java/com.sap.sse.gwt/.gitignore | 3 +- java/com.sap.sse.gwt/.tmp/gwt-work/.gitignore | 1 + java/com.sap.sse.gwt/META-INF/MANIFEST.MF | 1 + java/com.sap.sse.gwt/Messaging.html | 48 +++++++++++++++++++ java/com.sap.sse.gwt/MessagingTest.html | 48 +++++++++++++++++++ java/com.sap.sse.gwt/WEB-INF/web.xml | 22 +++++++++ java/com.sap.sse.gwt/build.properties | 4 +- java/com.sap.sse.gwt/pom.xml | 13 ++++- .../src/com/sap/sse/gwt/Messaging.gwt.xml | 36 ++++++++++++++ .../src/com/sap/sse/gwt/MessagingTest.gwt.xml | 36 ++++++++++++++ .../gwt/client/messaging/MessageEvent.java | 34 +++++++++++++ .../gwt/client/messaging/MessageListener.java | 13 +++++ .../sse/gwt/client/messaging/MessagePort.java | 40 ++++++++++++++++ .../client/messaging/MessagingEntryPoint.java | 19 ++++++++ .../messaging/MessagingTestEntryPoint.java | 27 +++++++++++ 15 files changed, 341 insertions(+), 4 deletions(-) create mode 100755 java/com.sap.sse.gwt/.tmp/gwt-work/.gitignore create mode 100755 java/com.sap.sse.gwt/Messaging.html create mode 100755 java/com.sap.sse.gwt/MessagingTest.html create mode 100755 java/com.sap.sse.gwt/WEB-INF/web.xml create mode 100755 java/com.sap.sse.gwt/src/com/sap/sse/gwt/Messaging.gwt.xml create mode 100755 java/com.sap.sse.gwt/src/com/sap/sse/gwt/MessagingTest.gwt.xml create mode 100755 java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessageEvent.java create mode 100755 java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessageListener.java create mode 100755 java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagePort.java create mode 100755 java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagingEntryPoint.java create mode 100755 java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagingTestEntryPoint.java diff --git a/java/com.sap.sse.gwt/.gitignore b/java/com.sap.sse.gwt/.gitignore index f9bd68d3df9..f59d126925b 100644 --- a/java/com.sap.sse.gwt/.gitignore +++ b/java/com.sap.sse.gwt/.gitignore @@ -1,3 +1,2 @@ /bin/ -/bin/ -/bin/ +/com.sap.* \ No newline at end of file diff --git a/java/com.sap.sse.gwt/.tmp/gwt-work/.gitignore b/java/com.sap.sse.gwt/.tmp/gwt-work/.gitignore new file mode 100755 index 00000000000..f95ad98df00 --- /dev/null +++ b/java/com.sap.sse.gwt/.tmp/gwt-work/.gitignore @@ -0,0 +1 @@ +com.* \ No newline at end of file diff --git a/java/com.sap.sse.gwt/META-INF/MANIFEST.MF b/java/com.sap.sse.gwt/META-INF/MANIFEST.MF index 0282c686e74..2a5a6d559ef 100644 --- a/java/com.sap.sse.gwt/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.gwt/META-INF/MANIFEST.MF @@ -13,6 +13,7 @@ Require-Bundle: com.google.gwt.user;bundle-version="2.8.2";resolution:=optional, com.sap.sse.filestorage, com.sap.sse.security.common Bundle-ActivationPolicy: lazy +Web-ContextPath: /gwt-base Import-Package: com.sap.sse.security, javax.servlet;version="3.1.0", javax.servlet.descriptor;version="3.1.0", diff --git a/java/com.sap.sse.gwt/Messaging.html b/java/com.sap.sse.gwt/Messaging.html new file mode 100755 index 00000000000..502dc62e8d2 --- /dev/null +++ b/java/com.sap.sse.gwt/Messaging.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + Load this into an IFrame and create a MessagePort for that IFrame, then you can send and receive messages + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sse.gwt/MessagingTest.html b/java/com.sap.sse.gwt/MessagingTest.html new file mode 100755 index 00000000000..1b365793aaa --- /dev/null +++ b/java/com.sap.sse.gwt/MessagingTest.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + Messaging Test + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sse.gwt/WEB-INF/web.xml b/java/com.sap.sse.gwt/WEB-INF/web.xml new file mode 100755 index 00000000000..be4deebdc57 --- /dev/null +++ b/java/com.sap.sse.gwt/WEB-INF/web.xml @@ -0,0 +1,22 @@ + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + + dirAllowed + false + + + useFileMappedBuffer + false + + + + diff --git a/java/com.sap.sse.gwt/build.properties b/java/com.sap.sse.gwt/build.properties index 0b77f39a9ff..2b4f88cd4fb 100755 --- a/java/com.sap.sse.gwt/build.properties +++ b/java/com.sap.sse.gwt/build.properties @@ -2,7 +2,9 @@ source.. = src/,\ resources/ output.. = bin/ bin.includes = META-INF/,\ - . + .,\ + com.sap.sse.gwt.MessagingTest/,\ + com.sap.sse.gwt.Messaging/ src.includes = resources/,\ src/ diff --git a/java/com.sap.sse.gwt/pom.xml b/java/com.sap.sse.gwt/pom.xml index a0e69479afd..f54e89b9049 100644 --- a/java/com.sap.sse.gwt/pom.xml +++ b/java/com.sap.sse.gwt/pom.xml @@ -9,7 +9,18 @@ com.sap.sse.gwt eclipse-plugin - + + + com.google.elemental2 + elemental2-core + 1.0.0-RC1 + + + com.google.elemental2 + elemental2-dom + 1.0.0-RC1 + + diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/Messaging.gwt.xml b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/Messaging.gwt.xml new file mode 100755 index 00000000000..15bbfe1ae7c --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/Messaging.gwt.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/MessagingTest.gwt.xml b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/MessagingTest.gwt.xml new file mode 100755 index 00000000000..e4080cc00df --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/MessagingTest.gwt.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessageEvent.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessageEvent.java new file mode 100755 index 00000000000..be0362d3046 --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessageEvent.java @@ -0,0 +1,34 @@ +package com.sap.sse.gwt.client.messaging; + +import com.google.gwt.core.client.JavaScriptObject; +import com.sap.sse.gwt.client.StorageEvent; + +public class MessageEvent extends JavaScriptObject { + protected MessageEvent() { + super(); + } + + public static interface Handler { + void onStorageChange(StorageEvent event); + } + + public final native T getData() /*-{ + return this.data; + }-*/; + + public final native String getLastEventId() /*-{ + return this.lastEventId; + }-*/; + + public final native String getOrigin() /*-{ + return this.origin; + }-*/; + + public final MessagePort getSource() { + return getWindowSource().cast(); + } + + private final native JavaScriptObject getWindowSource() /*-{ + return this.source; + }-*/; +} diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessageListener.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessageListener.java new file mode 100755 index 00000000000..f9eec8a3ea8 --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessageListener.java @@ -0,0 +1,13 @@ +package com.sap.sse.gwt.client.messaging; + +import com.google.gwt.core.client.JavaScriptObject; + +public interface MessageListener { + default void onMessageReceived(JavaScriptObject jsMessageEvent) { + @SuppressWarnings("unchecked") + final MessageEvent messageEvent = (MessageEvent) jsMessageEvent.cast(); + this.onMessageReceived(messageEvent); + } + + void onMessageReceived(MessageEvent messageEvent); +} diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagePort.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagePort.java new file mode 100755 index 00000000000..67240da57d0 --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagePort.java @@ -0,0 +1,40 @@ +package com.sap.sse.gwt.client.messaging; + +import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.dom.client.IFrameElement; + +/** + * The handle to a {@code Window} in the DOM which can be used to post a message to and to register a message event + * listener on. + * + * @author Axel Uhl (d043530) + * + */ +public class MessagePort extends JavaScriptObject { + protected MessagePort() { + super(); + } + + public static final native MessagePort getGlobalWindow() /*-{ + return $wnd; + }-*/; + + public static final native MessagePort getCurrentWindow() /*-{ + return window; + }-*/; + + public static final native MessagePort getFromIframe(IFrameElement iframe) /*-{ + return iframe.contentWindow; + }-*/; + + public final native void postMessage(T message, String targetOrigin) /*-{ + this.postMessage(message, targetOrigin); + }-*/; + + public final native void addMessageListener(MessageListener listener) /*-{ + this.addEventListener("message", + function(messageEvent) { + listener.@com.sap.sse.gwt.client.messaging.MessageListener::onMessageReceived(Lcom/google/gwt/core/client/JavaScriptObject;)(messageEvent); + }); + }-*/; +} diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagingEntryPoint.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagingEntryPoint.java new file mode 100755 index 00000000000..f83285e2740 --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagingEntryPoint.java @@ -0,0 +1,19 @@ +package com.sap.sse.gwt.client.messaging; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; + +public class MessagingEntryPoint implements EntryPoint { + @Override + public void onModuleLoad() { + GWT.log("This is Messaging Entry Point"); + final MessagePort messagePort = MessagePort.getGlobalWindow(); + messagePort.addMessageListener(new MessageListener() { + @Override + public void onMessageReceived(MessageEvent messageEvent) { + GWT.log("Received "+messageEvent.getData()+" from origin "+messageEvent.getOrigin()); + messageEvent.getSource().postMessage("Response to "+messageEvent.getData(), "*"); + } + }); + } +} diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagingTestEntryPoint.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagingTestEntryPoint.java new file mode 100755 index 00000000000..af2efd81a31 --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/messaging/MessagingTestEntryPoint.java @@ -0,0 +1,27 @@ +package com.sap.sse.gwt.client.messaging; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.IFrameElement; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.RootPanel; + +public class MessagingTestEntryPoint implements EntryPoint { + + @Override + public void onModuleLoad() { + GWT.log("Hello World"); + final MessagePort localPort = MessagePort.getCurrentWindow(); + localPort.addMessageListener(messageEvent -> GWT.log("Received " + messageEvent.getData() + " from origin " + messageEvent.getOrigin())); + final IFrameElement iframe1 = Document.get().createIFrameElement(); + iframe1.setSrc("http://localhost:8888/gwt-base/Messaging.html"); + Document.get().getBody().appendChild(iframe1); + final Button button = new Button("Test"); + final MessagePort globalPort = MessagePort.getFromIframe(iframe1); + button.addClickHandler(e -> { + globalPort.postMessage("Hello iFrame!", "*"); + }); + RootPanel.get().add(button); + } +}