summaryrefslogtreecommitdiffstats
path: root/dom/tests/mochitest/whatwg/test_postMessage.html
blob: a21abb9a0065f9e2a40fb7ab244401015159afd9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<!DOCTYPE html>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=postMessage
-->
<head>
  <title>Basic postMessage tests</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>        
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=postMessage">Mozilla Bug 387706</a>
<p id="display"></p>
<div id="content" style="display: none"></div>

<iframe src="http://mochi.test:8888/tests/dom/tests/mochitest/whatwg/postMessage_helper.html" 
        name="otherSameDomain"></iframe>
<iframe src="http://example.org:8000/tests/dom/tests/mochitest/whatwg/postMessage_helper.html"
        name="otherCrossDomain"></iframe>


<pre id="test">
<script class="testbody" type="application/javascript">
/** Test for Bug 387706 **/

SimpleTest.waitForExplicitFinish();

/** Variable for receivers to attempt to get. */
window.privateVariable = 17;

/** For sentinel finish, if necessary in deficient browsers. */
var finished = false;

/** Ends testing if it isn't already done. */
function finish()
{
  if (!finished)
  {
    finished = true;
    SimpleTest.finish();
  }
}

/** Receives MessageEvents. */
function messageReceiver(evt)
{
  try
  {
    ok(evt instanceof MessageEvent, "umm, how did we get this?");
    is(evt.lastEventId, "",
       "postMessage creates events with empty lastEventId");
    is(evt.type, "message", "expected events of type 'message'");
    ok(evt.isTrusted === true, "should have been a trusted event");
  
    var data = evt.data;
  
    // Check for the message we send to ourselves; it can't be
    // counted as a test, and it's conceptually distinct from
    // the other cases, so just return after handling it.
    if (data === "post-to-self")
    {
      respondToSelf(evt);
      return;
    }

    switch (evt.data)
    {
      case "post-to-self-response":
        receiveSelf(evt);
        break;
  
      case "post-to-other-same-domain-response":
        receiveOtherSameDomain(evt);
        break;
  
      case "post-to-other-cross-domain-response":
        receiveOtherCrossDomain(evt);
        
        // All the tests have executed, so we're done.
        finish();
        break;
  
      default:
        ok(false, "unexpected message: " + evt.data);
        finish();
        break;
    }
  }
  catch (e)
  {
    ok(false, "error processing event with data '" + evt.data + "': " + e);
    finish();
  }
}


/******************
 * SELF-RESPONDER *
 ******************/

function respondToSelf(evt)
{
  is(evt.origin, "http://mochi.test:8888", "event has wrong origin");
  is(evt.source, window, "we posted this message!");
  
  evt.source.postMessage("post-to-self-response", evt.origin);
}


/*************
 * RECEIVERS *
 *************/

function receiveSelf(evt)
{
  is(evt.origin, "http://mochi.test:8888", "event has wrong origin");
  is(evt.source, window, "we posted this message!");

  window.frames.otherSameDomain.postMessage("post-to-other-same-domain",
                                            "http://mochi.test:8888");
}

function receiveOtherSameDomain(evt)
{
  is(evt.origin, "http://mochi.test:8888",
     "same-domain response event has wrong origin");
  is(evt.source, window.frames.otherSameDomain,
     "wrong source for same-domain message!");

  window.frames.otherCrossDomain.postMessage("post-to-other-cross-domain",
                                            "http://example.org:8000");
}

function receiveOtherCrossDomain(evt)
{
  is(evt.origin, "http://example.org:8000",
     "same-domain response event has wrong origin");

  // can't use |is| here, because ok tries to get properties on its arguments
  // for creating a formatted logging message
  ok(evt.source === window.frames.otherCrossDomain,
     "wrong source for cross-domain message!");
}


/**************
 * TEST SETUP *
 **************/

function start()
{
  window.postMessage("post-to-self", "http://mochi.test:8888");
}

window.addEventListener("load", start);
window.addEventListener("message", messageReceiver);

</script>
</pre>
</body>
</html>