зеркало из https://github.com/mozilla/gecko-dev.git
181 строка
6.5 KiB
XML
181 строка
6.5 KiB
XML
<?xml version="1.0"?>
|
|
<?xml-stylesheet type="text/css" href="chrome://global/skin/"?>
|
|
<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
|
|
<!--
|
|
https://bugzilla.mozilla.org/show_bug.cgi?id=624883
|
|
-->
|
|
<window title="Mozilla Bug 624883"
|
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
|
|
|
<!-- test results are displayed in the html:body -->
|
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
|
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=624883"
|
|
target="_blank">Mozilla Bug 624883</a>
|
|
</body>
|
|
|
|
<!-- test code goes here -->
|
|
<iframe type="content" onload="startTest()" src="file_viewsource_forbidden_in_iframe.html"></iframe>
|
|
|
|
<script type="application/javascript">
|
|
<![CDATA[
|
|
|
|
const Ci = Components.interfaces;
|
|
const Cu = Components.utils;
|
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
|
|
// We create a promise that will resolve with the error message
|
|
// on a network error page load and reject on any other load.
|
|
function createNetworkErrorMessagePromise(frame) {
|
|
return new Promise(function(resolve, reject) {
|
|
|
|
// Error pages do not fire "load" events, so use a progressListener.
|
|
var originalDocumentURI = frame.contentDocument.documentURI;
|
|
var progressListener = {
|
|
onLocationChange: function(aWebProgress, aRequest, aLocation, aFlags) {
|
|
// Make sure nothing other than an error page is loaded.
|
|
if (!(aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_ERROR_PAGE)) {
|
|
reject("location change was not to an error page");
|
|
}
|
|
},
|
|
|
|
onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
|
|
// Wait until the documentURI changes (from about:blank) this should
|
|
// be the error page URI.
|
|
var documentURI = frame.contentDocument.documentURI;
|
|
if (documentURI == originalDocumentURI) {
|
|
return;
|
|
}
|
|
|
|
aWebProgress.removeProgressListener(progressListener,
|
|
Ci.nsIWebProgress.NOTIFY_ALL);
|
|
var matchArray = /about:neterror\?.*&d=([^&]*)/.exec(documentURI);
|
|
if (!matchArray) {
|
|
reject("no network error message found in URI")
|
|
return;
|
|
}
|
|
|
|
var errorMsg = matchArray[1];
|
|
resolve(decodeURIComponent(errorMsg));
|
|
},
|
|
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
|
|
Ci.nsISupportsWeakReference])
|
|
};
|
|
|
|
frame.contentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
.getInterface(Ci.nsIWebNavigation)
|
|
.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
.getInterface(Ci.nsIWebProgress)
|
|
.addProgressListener(progressListener,
|
|
Ci.nsIWebProgress.NOTIFY_LOCATION |
|
|
Ci.nsIWebProgress.NOTIFY_STATE_REQUEST);
|
|
});
|
|
}
|
|
|
|
function startTest() {
|
|
// Get a reference message that we know will be an unknown protocol message,
|
|
// so we can use it for comparisons in the test cases.
|
|
var refIframe = window[0].document.getElementById("refIframe");
|
|
var refErrorPromise = createNetworkErrorMessagePromise(refIframe);
|
|
|
|
refErrorPromise.then(
|
|
function(msg) {
|
|
window.refErrorMsg = msg;
|
|
var testIframe = window[0].document.getElementById("testIframe");
|
|
|
|
// Run test cases on load of "about:blank", so that the URI always changes
|
|
// and we can detect this in our Promise.
|
|
testIframe.onload = runNextTestCase;
|
|
testIframe.src = "about:blank";
|
|
},
|
|
function(reason) {
|
|
ok(false, "Could not get reference error message", reason);
|
|
SimpleTest.finish();
|
|
})
|
|
.catch(function(e) {
|
|
ok(false, "Unexpected exception thrown getting reference error message", exception);
|
|
});
|
|
|
|
refIframe.src = "wibble://example.com";
|
|
}
|
|
|
|
function runTestCase(testCase) {
|
|
var testIframe = window[0].document.getElementById("testIframe");
|
|
var expectedErrorMsg = window.refErrorMsg.replace("wibble", testCase.expectedProtocolList);
|
|
|
|
var testErrorPromise = createNetworkErrorMessagePromise(testIframe);
|
|
testErrorPromise.then(
|
|
function(actualErrorMsg) {
|
|
is(actualErrorMsg, expectedErrorMsg, testCase.desc);
|
|
testIframe.src = "about:blank";
|
|
},
|
|
function(reason) {
|
|
ok(false, testCase.desc, reason);
|
|
testIframe.src = "about:blank";
|
|
})
|
|
.catch(function(e) {
|
|
ok(false, testCase.desc + " - unexpected exception thrown", exception);
|
|
});
|
|
|
|
testIframe.src = testCase.protocols + "://example.com/!/";
|
|
}
|
|
|
|
var testCaseIndex = -1;
|
|
testCases = [
|
|
{
|
|
desc: "Test 1: view-source should not be allowed in an iframe",
|
|
protocols: "view-source:http",
|
|
expectedProtocolList: "view-source, http"
|
|
},
|
|
{
|
|
desc: "Test 2: feed:view-source should not be allowed in an iframe",
|
|
protocols: "feed:view-source:http",
|
|
expectedProtocolList: "feed, view-source, http"
|
|
},
|
|
{
|
|
desc: "Test 3: jar:view-source should not be allowed in an iframe",
|
|
protocols: "jar:view-source:http",
|
|
expectedProtocolList: "jar, view-source, http"
|
|
},
|
|
{
|
|
desc: "Test 4: pcast:view-source should not be allowed in an iframe",
|
|
protocols: "pcast:view-source:http",
|
|
expectedProtocolList: "pcast, view-source, http"
|
|
},
|
|
{
|
|
desc: "Test 5: pcast:feed:view-source should not be allowed in an iframe",
|
|
protocols: "pcast:feed:view-source:http",
|
|
expectedProtocolList: "pcast, feed, view-source, http"
|
|
},
|
|
{
|
|
desc: "Test 6: if invalid protocol first should report before view-source",
|
|
protocols: "wibble:view-source:http",
|
|
// Nothing after the invalid protocol gets set as a proper nested URI,
|
|
// so the list stops there.
|
|
expectedProtocolList: "wibble"
|
|
},
|
|
{
|
|
desc: "Test 7: if view-source first should report before invalid protocol",
|
|
protocols: "view-source:wibble:http",
|
|
expectedProtocolList: "view-source, wibble"
|
|
}
|
|
];
|
|
|
|
function runNextTestCase() {
|
|
++testCaseIndex;
|
|
if (testCaseIndex == testCases.length) {
|
|
SimpleTest.finish();
|
|
return;
|
|
}
|
|
|
|
runTestCase(testCases[testCaseIndex]);
|
|
}
|
|
|
|
]]>
|
|
</script>
|
|
</window>
|