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);
+ }
+}