Index: third_party/WebKit/LayoutTests/external/wpt/mixed-content/generic/mixed-content-test-case.js |
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mixed-content/generic/mixed-content-test-case.js b/third_party/WebKit/LayoutTests/external/wpt/mixed-content/generic/mixed-content-test-case.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7f3a7bfa96782c9ab4d07a1a15ea27323a7108d1 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/external/wpt/mixed-content/generic/mixed-content-test-case.js |
@@ -0,0 +1,163 @@ |
+/** |
+ * @fileoverview Test case for mixed-content in Web Platform Tests. |
+ * @author burnik@google.com (Kristijan Burnik) |
+ */ |
+ |
+/** |
+ * MixedContentTestCase exercises all the tests for checking browser behavior |
+ * when resources regarded as mixed-content are requested. A single run covers |
+ * only a single scenario. |
+ * @param {object} scenario A JSON describing the test arrangement and |
+ * expectation(s). Refer to /mixed-content/spec.src.json for details. |
+ * @param {string} description The test scenario verbose description. |
+ * @param {SanityChecker} sanityChecker Instance of an object used to check the |
+ * running scenario. Useful in debug mode. See ./sanity-checker.js. |
+ * Run {@code ./tools/generate.py -h} for info on test generating modes. |
+ * @return {object} Object wrapping the start method used to run the test. |
+ */ |
+function MixedContentTestCase(scenario, description, sanityChecker) { |
+ var httpProtocol = "http"; |
+ var httpsProtocol = "https"; |
+ var wsProtocol = "ws"; |
+ var wssProtocol = "wss"; |
+ |
+ var sameOriginHost = location.hostname; |
+ var crossOriginHost = "{{domains[www1]}}"; |
+ |
+ // These values can evaluate to either empty strings or a ":port" string. |
+ var httpPort = getNormalizedPort(parseInt("{{ports[http][0]}}", 10)); |
+ var httpsPort = getNormalizedPort(parseInt("{{ports[https][0]}}", 10)); |
+ var wsPort = getNormalizedPort(parseInt("{{ports[ws][0]}}", 10)); |
+ var wssPort = getNormalizedPort(parseInt("{{ports[wss][0]}}", 10)); |
+ |
+ var resourcePath = "/mixed-content/generic/expect.py"; |
+ var wsResourcePath = "/stash_responder"; |
+ |
+ // Map all endpoints to scenario for use in the test. |
+ var endpoint = { |
+ "same-origin": |
+ location.origin + resourcePath, |
+ "same-host-https": |
+ httpsProtocol + "://" + sameOriginHost + httpsPort + resourcePath, |
+ "same-host-http": |
+ httpProtocol + "://" + sameOriginHost + httpPort + resourcePath, |
+ "cross-origin-https": |
+ httpsProtocol + "://" + crossOriginHost + httpsPort + resourcePath, |
+ "cross-origin-http": |
+ httpProtocol + "://" + crossOriginHost + httpPort + resourcePath, |
+ "same-host-wss": |
+ wssProtocol + "://" + sameOriginHost + wssPort + wsResourcePath, |
+ "same-host-ws": |
+ wsProtocol + "://" + sameOriginHost + wsPort + wsResourcePath, |
+ "cross-origin-wss": |
+ wssProtocol + "://" + crossOriginHost + wssPort + wsResourcePath, |
+ "cross-origin-ws": |
+ wsProtocol + "://" + crossOriginHost + wsPort + wsResourcePath |
+ }; |
+ |
+ // Mapping all the resource requesting methods to the scenario. |
+ var resourceMap = { |
+ "a-tag": requestViaAnchor, |
+ "area-tag": requestViaArea, |
+ "fetch-request": requestViaFetch, |
+ "form-tag": requestViaForm, |
+ "iframe-tag": requestViaIframe, |
+ "img-tag": requestViaImage, |
+ "script-tag": requestViaScript, |
+ "worker-request": requestViaWorker, |
+ "xhr-request": requestViaXhr, |
+ "audio-tag": requestViaAudio, |
+ "video-tag": requestViaVideo, |
+ "picture-tag": requestViaPicture, |
+ "object-tag": requestViaObject, |
+ "link-css-tag": requestViaLinkStylesheet, |
+ "link-prefetch-tag": requestViaLinkPrefetch, |
+ "websocket-request": requestViaWebSocket |
+ }; |
+ |
+ sanityChecker.checkScenario(scenario, resourceMap); |
+ |
+ // Mapping all expected MIME types to the scenario. |
+ var contentType = { |
+ "a-tag": "text/html", |
+ "area-tag": "text/html", |
+ "fetch-request": "application/json", |
+ "form-tag": "text/html", |
+ "iframe-tag": "text/html", |
+ "img-tag": "image/png", |
+ "script-tag": "text/javascript", |
+ "worker-request": "application/javascript", |
+ "xhr-request": "application/json", |
+ "audio-tag": "audio/mpeg", |
+ "video-tag": "video/mp4", |
+ "picture-tag": "image/png", |
+ "object-tag": "text/html", |
+ "link-css-tag": "text/css", |
+ "link-prefetch-tag": "text/html", |
+ "websocket-request": "application/json" |
+ }; |
+ |
+ var mixed_content_test = async_test(description); |
+ |
+ function runTest() { |
+ sanityChecker.setFailTimeout(mixed_content_test); |
+ |
+ var key = guid(); |
+ var value = guid(); |
+ // We use the same path for both HTTP/S and WS/S stash requests. |
+ var stash_path = encodeURIComponent("/mixed-content"); |
+ var announceResourceRequestUrl = endpoint['same-origin'] + |
+ "?action=put&key=" + key + |
+ "&value=" + value + |
+ "&path=" + stash_path; |
+ var assertResourceRequestUrl = endpoint['same-origin'] + |
+ "?action=take&key=" + key + |
+ "&path=" + stash_path; |
+ var resourceRequestUrl = endpoint[scenario.origin] + "?redirection=" + |
+ scenario.redirection + "&action=purge&key=" + key + |
+ "&path=" + stash_path + "&content_type=" + |
+ contentType[scenario.subresource]; |
+ |
+ xhrRequest(announceResourceRequestUrl) |
+ .then(function(response) { |
+ // Send out the real resource request. |
+ // This should tear down the key if it's not blocked. |
+ return resourceMap[scenario.subresource](resourceRequestUrl); |
+ }) |
+ .then(function() { |
+ mixed_content_test.step(function() { |
+ assert_equals("allowed", scenario.expectation, |
+ "The triggered event should match '" + |
+ scenario.expectation + "'."); |
+ }, "Check if success event was triggered."); |
+ |
+ // Send request to check if the key has been torn down. |
+ return xhrRequest(assertResourceRequestUrl); |
+ }, function(error) { |
+ mixed_content_test.step(function() { |
+ assert_equals("blocked", scenario.expectation, |
+ "The triggered event should match '" + |
+ scenario.expectation + "'."); |
+ // TODO(kristijanburnik): param "error" can be an event or error. |
+ // Map assertion by resource. |
+ // e.g.: assert_equals(e.type, "error"); |
+ }, "Check if error event was triggered."); |
+ |
+ // When requestResource fails, we also check the key state. |
+ return xhrRequest(assertResourceRequestUrl); |
+ }) |
+ .then(function(response) { |
+ // Now check if the value has been torn down. If it's still there, |
+ // we have blocked the request to mixed-content. |
+ mixed_content_test.step(function() { |
+ assert_equals(response.status, scenario.expectation, |
+ "The resource request should be '" + scenario.expectation + |
+ "'."); |
+ }, "Check if request was sent."); |
+ mixed_content_test.done(); |
+ }); |
+ |
+ } // runTest |
+ |
+ return {start: runTest}; |
+} // MixedContentTestCase |