1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.javascript.host;
16
17 import java.util.ArrayList;
18 import java.util.List;
19
20 import org.htmlunit.WebDriverTestCase;
21 import org.htmlunit.junit.BrowserRunner;
22 import org.htmlunit.junit.annotation.Alerts;
23 import org.junit.Test;
24 import org.junit.runner.RunWith;
25 import org.openqa.selenium.By;
26 import org.openqa.selenium.WebDriver;
27
28
29
30
31
32
33 @RunWith(BrowserRunner.class)
34 public class MessageChannelTest extends WebDriverTestCase {
35
36
37
38
39 @Test
40 @Alerts("Message back from the IFrame, Hello from the main page!")
41 public void test() throws Exception {
42 final String html = DOCTYPE_HTML
43 + "<html><body>\n"
44 + "<p>My body</p>\n"
45 + "<iframe src='" + URL_SECOND + "' width='480' height='320'></iframe>\n"
46 + "</body>\n"
47 + "<script>\n"
48 + " if (window.MessageChannel) {\n"
49 + " var channel = new MessageChannel();\n"
50 + " var para = document.querySelector('p');\n"
51 + " var ifr = document.querySelector('iframe');\n"
52 + " var otherWindow = ifr.contentWindow;\n"
53 + " function iframeLoaded() {\n"
54 + " otherWindow.postMessage('Hello from the main page!', '*', [channel.port2]);\n"
55 + " }\n"
56 + " ifr.addEventListener('load', iframeLoaded, false);\n"
57 + " function handleMessage(e) {\n"
58 + " para.innerHTML = e.data;\n"
59 + " }\n"
60 + " channel.port1.onmessage = handleMessage;\n"
61 + " }\n"
62 + "</script></html>";
63
64 final String html2 = DOCTYPE_HTML
65 + "<html><body>\n"
66 + " <p>iFrame body</p>\n"
67 + "</body>\n"
68 + "<script>\n"
69 + " if (window.MessageChannel) {\n"
70 + " var para = document.querySelector('p');\n"
71 + " onmessage = function(e) {\n"
72 + " para.innerHTML = e.data;\n"
73 + " e.ports[0].postMessage('Message back from the IFrame');\n"
74 + " }\n"
75 + " }\n"
76 + "</script></html>";
77
78 getMockWebConnection().setResponse(URL_SECOND, html2);
79 final WebDriver driver = loadPage2(html);
80 final List<String> actual = new ArrayList<>();
81 actual.add(driver.findElement(By.tagName("p")).getText());
82 driver.switchTo().frame(0);
83 actual.add(driver.findElement(By.tagName("p")).getText());
84 assertEquals(getExpectedAlerts(), actual);
85 }
86
87 }