/* globals module, URL */ import { hasDOM } from '@ember/-internals/browser-environment'; let nodeURL; let parsingNode; export default function installProtocolForURL(environment) { let protocol; if (hasDOM) { protocol = browserProtocolForURL.call(environment, 'foobar:baz'); } // Test to see if our DOM implementation parses // and normalizes URLs. if (protocol === 'foobar:') { // Swap in the method that doesn't do this test now that // we know it works. environment.protocolForURL = browserProtocolForURL; } else if (typeof URL === 'object') { // URL globally provided, likely from FastBoot's sandbox nodeURL = URL; environment.protocolForURL = nodeProtocolForURL; } else if (typeof require === 'function') { // Otherwise, we need to fall back to our own URL parsing. // Global `require` is shadowed by Ember's loader so we have to use the fully // qualified `module.require`. // tslint:disable-next-line:no-require-imports nodeURL = require('url'); environment.protocolForURL = nodeProtocolForURL; } else { throw new Error('Could not find valid URL parsing mechanism for URL Sanitization'); } } function browserProtocolForURL(url) { if (!parsingNode) { parsingNode = document.createElement('a'); } parsingNode.href = url; return parsingNode.protocol; } function nodeProtocolForURL(url) { let protocol = null; if (typeof url === 'string') { protocol = nodeURL.parse(url).protocol; } return protocol === null ? ':' : protocol; }