diff options
Diffstat (limited to 'dom/browser-element/mochitest/browserElement_TopBarrier.js')
-rw-r--r-- | dom/browser-element/mochitest/browserElement_TopBarrier.js | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/dom/browser-element/mochitest/browserElement_TopBarrier.js b/dom/browser-element/mochitest/browserElement_TopBarrier.js new file mode 100644 index 000000000..3bd68854c --- /dev/null +++ b/dom/browser-element/mochitest/browserElement_TopBarrier.js @@ -0,0 +1,81 @@ +/* Any copyright is dedicated to the public domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Test that an <iframe mozbrowser> is a window.{top,parent,frameElement} barrier. +"use strict"; + +SimpleTest.waitForExplicitFinish(); +browserElementTestHelpers.setEnabledPref(true); +browserElementTestHelpers.addPermission(); + +var iframe; +function runTest() { + iframe = document.createElement('iframe'); + iframe.addEventListener('mozbrowserloadend', function() { + try { + outerIframeLoaded(); + } catch(e) { + dump("Got error: " + e + '\n'); + } + }); + iframe.setAttribute('mozbrowser', 'true'); + iframe.src = 'data:text/html,Outer iframe <iframe id="inner-iframe"></iframe>'; + // For kicks, this test uses a display:none iframe. This shouldn't make a + // difference in anything. + iframe.style.display = 'none'; + document.body.appendChild(iframe); +} + +var numMsgReceived = 0; +function outerIframeLoaded() { + // If you're changing the amount of is() calls in injectedScript, + // also change the number in waitForMessages accordingly + var injectedScript = + "data:,function is(a, b, desc) { \ + if (a == b) { \ + sendAsyncMessage('test:test-pass', desc); \ + } else { \ + sendAsyncMessage('test:test-fail', desc + ' ' + a + ' != ' + b); \ + } \ + } \ + is(content.window.top, content.window, 'top'); \ + is(content.window.content, content.window, 'content'); \ + is(content.window.parent, content.window, 'parent'); \ + is(content.window.frameElement, null, 'frameElement'); \ + var innerIframe = content.document.getElementById('inner-iframe'); \ + var innerWindow = innerIframe.contentWindow; \ + is(innerWindow.top, content.window, 'inner top'); \ + is(innerWindow.content, content.window, 'inner content'); \ + is(innerWindow.parent, content.window, 'inner parent'); \ + is(innerWindow.frameElement, innerIframe, 'inner frameElement');" + + var mm = SpecialPowers.getBrowserFrameMessageManager(iframe); + + function onRecvTestPass(msg) { + numMsgReceived++; + ok(true, msg.json); + } + mm.addMessageListener('test:test-pass', onRecvTestPass); + + function onRecvTestFail(msg) { + numMsgReceived++; + ok(false, msg.json); + } + mm.addMessageListener('test:test-fail', onRecvTestFail); + + mm.loadFrameScript(injectedScript, /* allowDelayedLoad = */ false); + + // 8 is the number of is() calls in injectedScript + waitForMessages(8); +} + +function waitForMessages(num) { + if (numMsgReceived < num) { + SimpleTest.executeSoon(function() { waitForMessages(num); }); + return; + } + + SimpleTest.finish(); +} + +addEventListener('testready', runTest); |