summaryrefslogtreecommitdiffstats
path: root/dom/base/test/test_x-frame-options.html
blob: d8586e7974b775e665c0b2b605695e918b9d31fa (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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
<!DOCTYPE HTML>
<html>
<head>
  <title>Test for X-Frame-Options response header</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<div id="content" style="display: none">

</div>

<iframe style="width:100%;height:300px;" id="harness"></iframe>
<script class="testbody" type="text/javascript">

var path = "/tests/dom/base/test/";

var testFramesLoaded = async function() {
  var harness = document.getElementById("harness").contentDocument;

  // iframe from same origin, no X-F-O header - should load
  var frame = harness.getElementById("control1");
  await SpecialPowers.spawn(frame, [], () => {
    var test1 = this.content.document.getElementById("test").textContent;
    Assert.equal(test1, "control1", "test control1");
  });

  // iframe from different origin, no X-F-O header - should load
  frame = harness.getElementById("control2");
  await SpecialPowers.spawn(frame, [], () => {
    var test2 = this.content.document.getElementById("test").textContent;
    Assert.equal(test2, "control2", "test control2");
  });

  // iframe from same origin, X-F-O: DENY - should not load
  frame = harness.getElementById("deny");
  await SpecialPowers.spawn(frame, [], () => {
    var test3 = this.content.document.getElementById("test");
    Assert.equal(test3, null, "test deny");
  });

  // iframe from same origin, X-F-O: SAMEORIGIN - should load
  frame = harness.getElementById("sameorigin1");
  await SpecialPowers.spawn(frame, [], () => {
    var test4 = this.content.document.getElementById("test").textContent;
    Assert.equal(test4, "sameorigin1", "test sameorigin1");
  });

  // iframe from different origin, X-F-O: SAMEORIGIN - should not load
  frame = harness.getElementById("sameorigin2");
  await SpecialPowers.spawn(frame, [], () => {
    var test5 = this.content.document.getElementById("test");
    Assert.equal(test5, null, "test sameorigin2");
  });

  // iframe from different origin, X-F-O: SAMEORIGIN, SAMEORIGIN - should not load
  frame = harness.getElementById("sameorigin5");
  await SpecialPowers.spawn(frame, [], () => {
    var test6 = this.content.document.getElementById("test");
    Assert.equal(test6, null, "test sameorigin5");
  });

  // iframe from same origin, X-F-O: SAMEORIGIN, SAMEORIGIN - should load
  frame = harness.getElementById("sameorigin6");
  await SpecialPowers.spawn(frame, [], () => {
    var test7 = this.content.document.getElementById("test").textContent;
    Assert.equal(test7, "sameorigin6", "test sameorigin6");
  });

  // iframe from same origin, X-F-O: SAMEORIGIN,SAMEORIGIN, SAMEORIGIN - should load
  frame = harness.getElementById("sameorigin7");
  await SpecialPowers.spawn(frame, [], () => {
    var test8 = this.content.document.getElementById("test").textContent;
    Assert.equal(test8, "sameorigin7", "test sameorigin7");
  });

  // iframe from same origin, X-F-O: SAMEORIGIN,SAMEORIGIN, SAMEORIGIN - should not load
  frame = harness.getElementById("sameorigin8");
  await SpecialPowers.spawn(frame, [], () => {
    var test9 = this.content.document.getElementById("test");
    Assert.equal(test9, null, "test sameorigin8");
  });

  // iframe from same origin, X-F-O: DENY,SAMEORIGIN - should not load
  frame = harness.getElementById("mixedpolicy");
  await SpecialPowers.spawn(frame, [], () => {
    var test10 = this.content.document.getElementById("test");
    Assert.equal(test10, null, "test mixedpolicy");
  });

  // iframe from different origin, allow-from: this origin - should load
  frame = harness.getElementById("allow-from-allow");
  await SpecialPowers.spawn(frame, [], () => {
    var test11 = this.content.document.getElementById("test").textContent;
    Assert.equal(test11, "allow-from-allow", "test allow-from-allow");
  });

  // iframe from different origin, with allow-from: other - should load as we no longer support allow-from (Bug 1301529)
  frame = harness.getElementById("allow-from-deny");
  await SpecialPowers.spawn(frame, [], () => {
    var test12 = this.content.document.getElementById("test");
    Assert.notEqual(test12, null, "test allow-from-deny");
  });

  // iframe from different origin, X-F-O: SAMEORIGIN, multipart - should not load
  frame = harness.getElementById("sameorigin-multipart");
  await SpecialPowers.spawn(frame, [], () => {
    var test13 = this.content.document.getElementById("test");
    Assert.equal(test13, null, "test sameorigin-multipart");
  });

  // iframe from same origin, X-F-O: SAMEORIGIN, multipart - should load
  frame = harness.getElementById("sameorigin-multipart2");
  await SpecialPowers.spawn(frame, [], () => {
    var test14 = this.content.document.getElementById("test").textContent;
    Assert.equal(test14, "sameorigin-multipart2", "test sameorigin-multipart2");
  });


  // frames from bug 836132 tests, no longer supported allow-from
  {
    frame = harness.getElementById("allow-from-allow-1");
    var theTestResult = frame.contentDocument.getElementById("test");
    isnot(theTestResult, null, "test afa1 should have been allowed");
    if(theTestResult) {
      is(theTestResult.textContent, "allow-from-allow-1", "test allow-from-allow-1");
    }
  }
  // Verify allow-from no longer works
  for (var i = 1; i<=14; i++) {
    frame = harness.getElementById("allow-from-deny-" + i);
    var theTestResult = frame.contentDocument.getElementById("test");
    isnot(theTestResult, null, "test allow-from-deny-" + i);
  }

  // call tests to check principal comparison, e.g. a document can open a window
  // to a data: or javascript: document which frames an
  // X-Frame-Options: SAMEORIGIN document and the frame should load
  testFrameInJSURI();
};

// test that a document can be framed under a javascript: URL opened by the
// same site as the frame
// We can't set a load event listener before calling document.open/document.write, because those will remove such listeners.  So we need to define a function that the new window will be able to call.
function frameInJSURILoaded(win) {
  var test = win.document.getElementById("sameorigin3")
                .contentDocument.getElementById("test");
  ok(test != null, "frame under javascript: URL should have loaded.");
  win.close();

  testFrameNotLoadedInDataURI();
}

var testFrameInJSURI = function() {
  var html = '<iframe id="sameorigin3" src="http://mochi.test:8888/tests/dom/base/test/file_x-frame-options_page.sjs?testid=sameorigin3&xfo=sameorigin"></iframe>';
  var win = window.open();
  win.location.href = "javascript:document.open(); onload = opener.frameInJSURILoaded.bind(null, window); document.write('"+html+"');document.close();";
};

// test an iframe with X-FRAME-OPTIONS shouldn't be loaded in a cross-origin window,
var testFrameNotLoadedInDataURI = function() {
  // In this case we load two iframes, one is sameorigin4, which will have X-FRAME-OPTIONS,
  // the other is postmessage, which won't get the XFO header.
  // And because now window is navigated to a data: URI, which is considered as cross origin,
  // So win.onload won't be fired, so we use the iframe 'postmessage' to know the iframes
  // have been loaded.
  var html = `<iframe id="sameorigin4" src="http://mochi.test:8888/tests/dom/base/test/file_x-frame-options_page.sjs?testid=sameorigin4&xfo=sameorigin"></iframe>
              <iframe id="postmessage" src="http://mochi.test:8888/tests/dom/base/test/file_x-frame-options_page.sjs?testid=postmessage"></iframe>`;
  var win = window.open();
  window.onmessage = function(evt) {
    var iframe = SpecialPowers.wrap(win).document.getElementById("sameorigin4");
    var test = iframe.contentDocument.getElementById("test");
    ok(test == null, "frame under data: URL should have blocked.");
    win.close();

    SimpleTest.finish();
  };
  win.location.href = "data:text/html,"+html;
};

SimpleTest.waitForExplicitFinish();

// load the test harness
SpecialPowers.pushPrefEnv({
  "set": [["security.data_uri.block_toplevel_data_uri_navigations", false],]
}, function() {
  document.getElementById("harness").src = "file_x-frame-options_main.html";
});

</script>
</pre>

</body>
</html>