diff --git a/test/functional/iframes.js b/test/functional/iframes.js new file mode 100644 index 0000000..c687fcf --- /dev/null +++ b/test/functional/iframes.js @@ -0,0 +1,82 @@ +"use strict"; + +const assert = require("assert"); +const utils = require("./lib/utils"); +const testServer = require("./lib/server"); + +describe("iFrames", function () { + + describe("HTMLIFrameElement.prototype.contentWindow property", function () { + + this.timeout = () => 20000; + + const standardsToBlock = utils.constants.svgBlockRule; + + const testHtml = ` + + + Test Page + + + + + `; + + let testScript = ""; + testScript += "let iframeWindow = document.getElementsByTagName('iframe')[0].contentWindow;\n"; + testScript += "return iframeWindow.SVGGraphicsElement.prototype.getBBox === iframeWindow.SVGTransformList.prototype.createSVGTransformFromMatrix;"; + + // If access to the child frame's SVGGraphicsElement.prototype.getBBox + // implementation is *not* blocked, then trying to call it + // will throw, since its being called without a context. + it("Can access w/o blocking", function (done) { + + const [server, url] = testServer.start(undefined, testHtml); + let driverReference; + + utils.promiseGetDriver() + .then(function (driver) { + driverReference = driver; + return driverReference.get(url); + }) + .then(() => driverReference.executeScript(testScript)) + .then(function (response) { + assert.equal(response, false, "When not blocking, SVGGraphicsElement.prototype.getBBox and SVGTransformList.prototype.createSVGTransformFromMatrix should reference different functions."); + driverReference.quit(); + testServer.stop(server); + done(); + }) + .catch(function (e) { + driverReference.quit(); + testServer.stop(server); + done(e); + }); + }); + + it("Can not access when blocking", function (done) { + + const [server, url] = testServer.start(undefined, testHtml); + let driverReference; + + utils.promiseGetDriver() + .then(function (driver) { + driverReference = driver; + return driverReference.get(url); + }) + .then(() => utils.promiseSetBlockingRules(driverReference, standardsToBlock)) + .then(() => driverReference.get(url)) + .then(() => driverReference.executeScript(testScript)) + .then(function (response) { + assert.equal(response, true, "When blocking, SVGGraphicsElement.prototype.getBBox and SVGTransformList.prototype.createSVGTransformFromMatrix should reference the same proxy object."); + driverReference.quit(); + testServer.stop(server); + done(); + }) + .catch(function (e) { + driverReference.quit(); + testServer.stop(server); + done(e); + }); + }); + }); +});