@@ -0,0 +1,79 @@
|
||||
/** URL parse / join for summon (about:, file:, http:, https:). */
|
||||
|
||||
var BARE_SUMMON_SCHEMES = {
|
||||
http: true,
|
||||
https: true,
|
||||
file: true,
|
||||
about: true
|
||||
}
|
||||
|
||||
function bareSummonTrim(s) {
|
||||
return String(s == null ? '' : s).trim()
|
||||
}
|
||||
|
||||
function bareSummonParseUrl(raw) {
|
||||
var s = bareSummonTrim(raw)
|
||||
if (!s) return null
|
||||
if (s.indexOf('://') < 0 && s.indexOf(':') > 0) {
|
||||
var sch0 = s.slice(0, s.indexOf(':')).toLowerCase()
|
||||
if (sch0 === 'about') {
|
||||
return {
|
||||
href: 'about:' + s.slice(s.indexOf(':') + 1),
|
||||
protocol: 'about:',
|
||||
host: '',
|
||||
hostname: '',
|
||||
port: '',
|
||||
pathname: s.slice(s.indexOf(':') + 1) || 'blank',
|
||||
search: '',
|
||||
hash: '',
|
||||
origin: 'about:'
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
var u = new URL(s)
|
||||
return {
|
||||
href: u.href,
|
||||
protocol: u.protocol,
|
||||
host: u.host,
|
||||
hostname: u.hostname,
|
||||
port: u.port,
|
||||
pathname: u.pathname || '/',
|
||||
search: u.search,
|
||||
hash: u.hash,
|
||||
origin: u.origin
|
||||
}
|
||||
} catch (e) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
function bareSummonResolveUrl(ref, base) {
|
||||
var r = bareSummonTrim(ref)
|
||||
if (!r) return bareSummonParseUrl(base)
|
||||
if (/^javascript:/i.test(r)) return null
|
||||
if (r.charAt(0) === '#') {
|
||||
var b0 = bareSummonParseUrl(base)
|
||||
if (!b0) return null
|
||||
b0.hash = r
|
||||
b0.href = b0.href.split('#')[0] + r
|
||||
return b0
|
||||
}
|
||||
if (/^about:/i.test(r)) return bareSummonParseUrl(r)
|
||||
try {
|
||||
var u = base ? new URL(r, String(base)) : new URL(r)
|
||||
return bareSummonParseUrl(u.href)
|
||||
} catch (e2) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
function bareSummonUrlOk(u) {
|
||||
if (!u || !u.protocol) return false
|
||||
var p = u.protocol.replace(/:$/, '')
|
||||
return !!BARE_SUMMON_SCHEMES[p]
|
||||
}
|
||||
|
||||
function bareSummonIsHttp(u) {
|
||||
return u && (u.protocol === 'http:' || u.protocol === 'https:')
|
||||
}
|
||||
Reference in New Issue
Block a user