| Index: third_party/WebKit/LayoutTests/external/wpt/mixed-content/generic/common.js
|
| diff --git a/third_party/WebKit/LayoutTests/external/wpt/mixed-content/generic/common.js b/third_party/WebKit/LayoutTests/external/wpt/mixed-content/generic/common.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..36427a4669fa09fec01c1d15210ab7cfa57b176e
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/external/wpt/mixed-content/generic/common.js
|
| @@ -0,0 +1,398 @@
|
| +/**
|
| + * @fileoverview Utilities for mixed-content in Web Platform Tests.
|
| + * @author burnik@google.com (Kristijan Burnik)
|
| + * Disclaimer: Some methods of other authors are annotated in the corresponding
|
| + * method's JSDoc.
|
| + */
|
| +
|
| +/**
|
| + * Normalizes the target port for use in a URL. For default ports, this is the
|
| + * empty string (omitted port), otherwise it's a colon followed by the port
|
| + * number. Ports 80, 443 and an empty string are regarded as default ports.
|
| + * @param {number} targetPort The port to use
|
| + * @return {string} The port portion for using as part of a URL.
|
| + */
|
| +function getNormalizedPort(targetPort) {
|
| + return ([80, 443, ""].indexOf(targetPort) >= 0) ? "" : ":" + targetPort;
|
| +}
|
| +
|
| +/**
|
| + * Creates a GUID.
|
| + * See: https://en.wikipedia.org/wiki/Globally_unique_identifier
|
| + * Original author: broofa (http://www.broofa.com/)
|
| + * Sourced from: http://stackoverflow.com/a/2117523/4949715
|
| + * @return {string} A pseudo-random GUID.
|
| + */
|
| +function guid() {
|
| + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
| + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
| + return v.toString(16);
|
| + });
|
| +}
|
| +
|
| +/**
|
| + * Initiates a new XHR via GET.
|
| + * @param {string} url The endpoint URL for the XHR.
|
| + * @param {string} responseType Optional - how should the response be parsed.
|
| + * Default is "json".
|
| + * See: https://xhr.spec.whatwg.org/#dom-xmlhttprequest-responsetype
|
| + * @return {Promise} A promise wrapping the success and error events.
|
| + */
|
| +function xhrRequest(url, responseType) {
|
| + return new Promise(function(resolve, reject) {
|
| + var xhr = new XMLHttpRequest();
|
| + xhr.open('GET', url, true);
|
| + xhr.responseType = responseType || "json";
|
| +
|
| + xhr.addEventListener("error", function() {
|
| + reject(Error("Network Error"));
|
| + });
|
| +
|
| + xhr.addEventListener("load", function() {
|
| + if (xhr.status != 200)
|
| + return reject(Error(xhr.statusText));
|
| +
|
| + resolve(xhr.response);
|
| + });
|
| +
|
| + xhr.send();
|
| + });
|
| +}
|
| +
|
| +/**
|
| + * Sets attributes on a given DOM element.
|
| + * @param {DOMElement} element The element on which to set the attributes.
|
| + * @param {object} An object with keys (serving as attribute names) and values.
|
| + */
|
| +function setAttributes(el, attrs) {
|
| + attrs = attrs || {}
|
| + for (var attr in attrs)
|
| + el.setAttribute(attr, attrs[attr]);
|
| +}
|
| +
|
| +
|
| +/**
|
| + * Binds to success and error events of an object wrapping them into a promise
|
| + * available through {@code element.eventPromise}. The success event
|
| + * resolves and error event rejects.
|
| + * @param {object} element An object supporting events on which to bind the
|
| + * promise.
|
| + * @param {string} resolveEventName [="load"] The event name to bind resolve to.
|
| + * @param {string} rejectEventName [="error"] The event name to bind reject to.
|
| + */
|
| +function bindEvents(element, resolveEventName, rejectEventName) {
|
| + element.eventPromise = new Promise(function(resolve, reject) {
|
| + element.addEventListener(resolveEventName || "load", resolve);
|
| + element.addEventListener(rejectEventName || "error",
|
| + function(e) { e.preventDefault(); reject(); } );
|
| + });
|
| +}
|
| +
|
| +/**
|
| + * Creates a new DOM element.
|
| + * @param {string} tagName The type of the DOM element.
|
| + * @param {object} attrs A JSON with attributes to apply to the element.
|
| + * @param {DOMElement} parent Optional - an existing DOM element to append to
|
| + * If not provided, the returned element will remain orphaned.
|
| + * @param {boolean} doBindEvents Optional - Whether to bind to load and error
|
| + * events and provide the promise wrapping the events via the element's
|
| + * {@code eventPromise} property. Default value evaluates to false.
|
| + * @return {DOMElement} The newly created DOM element.
|
| + */
|
| +function createElement(tagName, attrs, parent, doBindEvents) {
|
| + var element = document.createElement(tagName);
|
| +
|
| + if (doBindEvents)
|
| + bindEvents(element);
|
| +
|
| + // We set the attributes after binding to events to catch any
|
| + // event-triggering attribute changes. E.g. form submission.
|
| + //
|
| + // But be careful with images: unlike other elements they will start the load
|
| + // as soon as the attr is set, even if not in the document yet, and sometimes
|
| + // complete it synchronously, so the append doesn't have the effect we want.
|
| + // So for images, we want to set the attrs after appending, whereas for other
|
| + // elements we want to do it before appending.
|
| + var isImg = (tagName == "img");
|
| + if (!isImg)
|
| + setAttributes(element, attrs);
|
| +
|
| + if (parent)
|
| + parent.appendChild(element);
|
| +
|
| + if (isImg)
|
| + setAttributes(element, attrs);
|
| +
|
| + return element;
|
| +}
|
| +
|
| +function createRequestViaElement(tagName, attrs, parent) {
|
| + return createElement(tagName, attrs, parent, true).eventPromise;
|
| +}
|
| +
|
| +/**
|
| + * Creates a new empty iframe and appends it to {@code document.body} .
|
| + * @param {string} name The name and ID of the new iframe.
|
| + * @param {boolean} doBindEvents Whether to bind load and error events.
|
| + * @return {DOMElement} The newly created iframe.
|
| + */
|
| +function createHelperIframe(name, doBindEvents) {
|
| + return createElement("iframe",
|
| + {"name": name, "id": name},
|
| + document.body,
|
| + doBindEvents);
|
| +}
|
| +
|
| +/**
|
| + * Creates a new iframe, binds load and error events, sets the src attribute and
|
| + * appends it to {@code document.body} .
|
| + * @param {string} url The src for the iframe.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaIframe(url) {
|
| + return createRequestViaElement("iframe", {"src": url}, document.body);
|
| +}
|
| +
|
| +/**
|
| + * Creates a new image, binds load and error events, sets the src attribute and
|
| + * appends it to {@code document.body} .
|
| + * @param {string} url The src for the image.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaImage(url) {
|
| + return createRequestViaElement("img", {"src": url}, document.body);
|
| +}
|
| +
|
| +/**
|
| + * Initiates a new XHR GET request to provided URL.
|
| + * @param {string} url The endpoint URL for the XHR.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaXhr(url) {
|
| + return xhrRequest(url);
|
| +}
|
| +
|
| +/**
|
| + * Initiates a new GET request to provided URL via the Fetch API.
|
| + * @param {string} url The endpoint URL for the Fetch.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaFetch(url) {
|
| + return fetch(url);
|
| +}
|
| +
|
| +/**
|
| + * Creates a new Worker, binds message and error events wrapping them into.
|
| + * {@code worker.eventPromise} and posts an empty string message to start
|
| + * the worker.
|
| + * @param {string} url The endpoint URL for the worker script.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaWorker(url) {
|
| + var worker = new Worker(url);
|
| + bindEvents(worker, "message", "error");
|
| + worker.postMessage('');
|
| +
|
| + return worker.eventPromise;
|
| +}
|
| +
|
| +/**
|
| + * Sets the href attribute on a navigable DOM element and performs a navigation
|
| + * by clicking it. To avoid navigating away from the current execution
|
| + * context, a target attribute is set to point to a new helper iframe.
|
| + * @param {DOMElement} navigableElement The navigable DOMElement
|
| + * @param {string} url The href for the navigable element.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaNavigable(navigableElement, url) {
|
| + var iframe = createHelperIframe(guid(), true);
|
| + setAttributes(navigableElement,
|
| + {"href": url,
|
| + "target": iframe.name});
|
| + navigableElement.click();
|
| +
|
| + return iframe.eventPromise;
|
| +}
|
| +
|
| +/**
|
| + * Creates a new anchor element, appends it to {@code document.body} and
|
| + * performs the navigation.
|
| + * @param {string} url The URL to navigate to.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaAnchor(url) {
|
| + var a = createElement("a", {"innerHTML": "Link to resource"}, document.body);
|
| +
|
| + return requestViaNavigable(a, url);
|
| +}
|
| +
|
| +/**
|
| + * Creates a new area element, appends it to {@code document.body} and performs
|
| + * the navigation.
|
| + * @param {string} url The URL to navigate to.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaArea(url) {
|
| + var area = createElement("area", {}, document.body);
|
| +
|
| + return requestViaNavigable(area, url);
|
| +}
|
| +
|
| +/**
|
| + * Creates a new script element, sets the src to url, and appends it to
|
| + * {@code document.body}.
|
| + * @param {string} url The src URL.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaScript(url) {
|
| + return createRequestViaElement("script", {"src": url}, document.body);
|
| +}
|
| +
|
| +/**
|
| + * Creates a new form element, sets attributes, appends it to
|
| + * {@code document.body} and submits the form.
|
| + * @param {string} url The URL to submit to.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaForm(url) {
|
| + var iframe = createHelperIframe(guid());
|
| + var form = createElement("form",
|
| + {"action": url,
|
| + "method": "POST",
|
| + "target": iframe.name},
|
| + document.body);
|
| + bindEvents(iframe);
|
| + form.submit();
|
| +
|
| + return iframe.eventPromise;
|
| +}
|
| +
|
| +/**
|
| + * Creates a new link element for a stylesheet, binds load and error events,
|
| + * sets the href to url and appends it to {@code document.head}.
|
| + * @param {string} url The URL for a stylesheet.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaLinkStylesheet(url) {
|
| + return createRequestViaElement("link",
|
| + {"rel": "stylesheet", "href": url},
|
| + document.head);
|
| +}
|
| +
|
| +/**
|
| + * Creates a new link element for a prefetch, binds load and error events, sets
|
| + * the href to url and appends it to {@code document.head}.
|
| + * @param {string} url The URL of a resource to prefetch.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaLinkPrefetch(url) {
|
| + // TODO(kristijanburnik): Check if prefetch should support load and error
|
| + // events. For now we assume it's not specified.
|
| + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ
|
| + return createRequestViaElement("link",
|
| + {"rel": "prefetch", "href": url},
|
| + document.head);
|
| +}
|
| +
|
| +/**
|
| + * Creates a new media element with a child source element, binds loadeddata and
|
| + * error events, sets attributes and appends to document.body.
|
| + * @param {string} type The type of the media element (audio/video/picture).
|
| + * @param {object} media_attrs The attributes for the media element.
|
| + * @param {object} source_attrs The attributes for the child source element.
|
| + * @return {DOMElement} The newly created media element.
|
| + */
|
| +function createMediaElement(type, media_attrs, source_attrs) {
|
| + var mediaElement = createElement(type, {});
|
| + var sourceElement = createElement("source", {}, mediaElement);
|
| +
|
| + mediaElement.eventPromise = new Promise(function(resolve, reject) {
|
| + mediaElement.addEventListener("loadeddata", resolve);
|
| + // Notice that the source element will raise the error.
|
| + sourceElement.addEventListener("error", reject);
|
| + });
|
| +
|
| + setAttributes(mediaElement, media_attrs);
|
| + setAttributes(sourceElement, source_attrs);
|
| + document.body.appendChild(mediaElement);
|
| +
|
| + return mediaElement;
|
| +}
|
| +
|
| +/**
|
| + * Creates a new video element, binds loadeddata and error events, sets
|
| + * attributes and source URL and appends to {@code document.body}.
|
| + * @param {string} url The URL of the video.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaVideo(url) {
|
| + return createMediaElement("video",
|
| + {},
|
| + {type: "video/mp4", src: url}).eventPromise;
|
| +}
|
| +
|
| +/**
|
| + * Creates a new audio element, binds loadeddata and error events, sets
|
| + * attributes and source URL and appends to {@code document.body}.
|
| + * @param {string} url The URL of the audio.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaAudio(url) {
|
| + return createMediaElement("audio",
|
| + {},
|
| + {type: "audio/mpeg", src: url}).eventPromise;
|
| +}
|
| +
|
| +/**
|
| + * Creates a new picture element, binds loadeddata and error events, sets
|
| + * attributes and source URL and appends to {@code document.body}. Also
|
| + * creates new image element appending it to the picture
|
| + * @param {string} url The URL of the image for the source and image elements.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaPicture(url) {
|
| + var picture = createMediaElement("picture", {}, {"srcset": url,
|
| + "type": "image/png"});
|
| + return createRequestViaElement("img", {"src": url}, picture);
|
| +}
|
| +
|
| +/**
|
| + * Creates a new object element, binds load and error events, sets the data to
|
| + * url, and appends it to {@code document.body}.
|
| + * @param {string} url The data URL.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaObject(url) {
|
| + return createRequestViaElement("object", {"data": url}, document.body);
|
| +}
|
| +
|
| +/**
|
| + * Creates a new WebSocket pointing to {@code url} and sends a message string
|
| + * "echo". The {@code message} and {@code error} events are triggering the
|
| + * returned promise resolve/reject events.
|
| + * @param {string} url The URL for WebSocket to connect to.
|
| + * @return {Promise} The promise for success/error events.
|
| + */
|
| +function requestViaWebSocket(url) {
|
| + return new Promise(function(resolve, reject) {
|
| + var websocket = new WebSocket(url);
|
| +
|
| + websocket.addEventListener("message", function(e) {
|
| + resolve(JSON.parse(e.data));
|
| + });
|
| +
|
| + websocket.addEventListener("open", function(e) {
|
| + websocket.send("echo");
|
| + });
|
| +
|
| + websocket.addEventListener("error", function(e) {
|
| + reject(e)
|
| + });
|
| + });
|
| +}
|
| +
|
| +// SanityChecker does nothing in release mode. See sanity-checker.js for debug
|
| +// mode.
|
| +function SanityChecker() {}
|
| +SanityChecker.prototype.checkScenario = function() {};
|
| +SanityChecker.prototype.setFailTimeout = function(test, timeout) {};
|
|
|