unknown href links now open in browsertab (incl. from iframe)

This commit is contained in:
Leon van Kammen 2024-01-23 16:45:07 +00:00
parent a170aabfb6
commit 78eac1c12b
4 changed files with 23 additions and 18 deletions

View file

@ -64,7 +64,6 @@ window.AFRAME.registerComponent('xrf', {
let url = opts.xrf.string let url = opts.xrf.string
let isLocal = url.match(/^#/) let isLocal = url.match(/^#/)
let hasPos = url.match(/pos=/) let hasPos = url.match(/pos=/)
if( !isLocal && !url.match(/^http/) ) return // dont fade/load for custom protocol handlers
if( isLocal && hasPos ){ if( isLocal && hasPos ){
// local teleports only // local teleports only
let fastFadeMs = 200 let fastFadeMs = 200

View file

@ -89,6 +89,7 @@ window.matrix = (opts) => new Proxy({
}, },
connect(opts){ connect(opts){
this.createLink() // ensure link
if( opts.selectedWebcam == this.profile.name ) this.useWebcam = true if( opts.selectedWebcam == this.profile.name ) this.useWebcam = true
if( opts.selectedChatnetwork == this.profile.name ) this.useChat = true if( opts.selectedChatnetwork == this.profile.name ) this.useChat = true
if( opts.selectedScene == this.profile.name ) this.useScene = true if( opts.selectedScene == this.profile.name ) this.useScene = true
@ -229,8 +230,8 @@ window.matrix = (opts) => new Proxy({
if( !url.match(this.profile.protocol) ) return if( !url.match(this.profile.protocol) ) return
let parts = url.replace(this.profile.protocol,'').split("/") let parts = url.replace(this.profile.protocol,'').split("/")
if( parts[0] == 'r' ){ // room if( parts[0] == 'r' ){ // room
let server = parts.split("/")[1].replace(/:.*/,'') let server = parts[1].replace(/:.*/,'')
let channel = parts.split("/")[1].replace(/.*:/,'') let channel = parts[1].replace(/.*:/,'')
$connections.show() $connections.show()
$connections.selectedChatnetwork = this.profile.name $connections.selectedChatnetwork = this.profile.name
$connections.selectedScene = this.profile.name $connections.selectedScene = this.profile.name
@ -241,7 +242,7 @@ window.matrix = (opts) => new Proxy({
return false return false
}, },
t0nkr0nst0nreateLink(opts){ createLink(opts){
let hash = document.location.hash let hash = document.location.hash
if( !this.link ){ if( !this.link ){
const meeting = network.getMeetingFromUrl(document.location.href) const meeting = network.getMeetingFromUrl(document.location.href)
@ -258,7 +259,6 @@ window.matrix = (opts) => new Proxy({
let href = mesh.userData.href let href = mesh.userData.href
let isLocal = href[0] == '#' let isLocal = href[0] == '#'
let isTeleport = href.match(/(pos=|http:)/) let isTeleport = href.match(/(pos=|http:)/)
console.log("href detected")
if( isLocal && !isTeleport && this.client && this.useScene ){ if( isLocal && !isTeleport && this.client && this.useScene ){
console.log("sending href") console.log("sending href")
this.yhref.set( document.location.hash ) this.yhref.set( document.location.hash )

View file

@ -8,19 +8,19 @@ xrf.navigator.to = (url,flags,loader,data) => {
return new Promise( (resolve,reject) => { return new Promise( (resolve,reject) => {
let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url) let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url)
if( !file || (!data && xrf.model.file == file) ){ // we're already loaded if( (!file && hash) || (!data && xrf.model.file == file) ){ // we're already loaded
if( hash == document.location.hash.substr(1) ) return // block duplicate calls if( hash == document.location.hash.substr(1) ) return // block duplicate calls
hashbus.pub( url, xrf.model, flags ) // and eval local URI XR fragments hashbus.pub( url, xrf.model, flags ) // and eval local URI XR fragments
xrf.navigator.updateHash(hash) xrf.navigator.updateHash(hash)
return resolve(xrf.model) return resolve(xrf.model)
} }
if( xrf.model && xrf.model.scene ) xrf.model.scene.visible = false
if( !loader ){ if( !loader ){
const Loader = xrf.loaders[ext] const Loader = xrf.loaders[ext]
if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext if( !Loader ) return reject('xrfragment: no loader passed to xrfragment for extension .'+ext)
loader = loader || new Loader().setPath( dir ) loader = loader || new Loader().setPath( dir )
} }
if( xrf.model && xrf.model.scene ) xrf.model.scene.visible = false
// force relative path for files which dont include protocol or relative path // force relative path for files which dont include protocol or relative path
if( dir ) dir = dir[0] == '.' || dir.match("://") ? dir : `.${dir}` if( dir ) dir = dir[0] == '.' || dir.match("://") ? dir : `.${dir}`

View file

@ -40,19 +40,25 @@ xrf.frag.href = function(v, opts){
.emit('href',{click:true,mesh,xrf:v}) // let all listeners agree .emit('href',{click:true,mesh,xrf:v}) // let all listeners agree
.then( () => { .then( () => {
let {urlObj,dir,file,hash,ext} = xrf.parseUrl(v.string) let {urlObj,dir,file,hash,ext} = xrf.parseUrl(v.string)
//if( !file.match(/\./) || file.match(/\.html/) ){
// debugger
// let inIframe
// try { inIframe = window.self !== window.top; } catch (e) { inIframe = true; }
// return inIframe ? window.parent.postMessage({ url: v.string }, '*') : window.open( v.string, '_blank')
//}
const flags = v.string[0] == '#' ? xrf.XRF.PV_OVERRIDE : undefined const flags = v.string[0] == '#' ? xrf.XRF.PV_OVERRIDE : undefined
let toFrag = xrf.URI.parse( v.string, xrf.XRF.NAVIGATOR | xrf.XRF.PV_OVERRIDE | xrf.XRF.METADATA ) let toFrag = xrf.URI.parse( v.string, xrf.XRF.NAVIGATOR | xrf.XRF.PV_OVERRIDE | xrf.XRF.METADATA )
// *TODO* support for multiple protocols
if( v.string[0] != '#' && !v.string.match(/^http/) ) return
// always commit current location in case of teleport (keep a trail of last positions before we navigate) // always commit current location in case of teleport (keep a trail of last positions before we navigate)
if( !e.nocommit && !document.location.hash.match(lastPos) ) xrf.navigator.to(`#${lastPos}`) if( !e.nocommit && !document.location.hash.match(lastPos) ) xrf.navigator.to(`#${lastPos}`)
xrf.navigator.to(v.string) // let's surf to HREF! xrf.navigator.to(v.string) // let's surf to HREF!
.catch( (e) => { // not something we can load
let inIframe
try { inIframe = window.self !== window.top; } catch (e) { inIframe = true; }
return inIframe ? window.parent.postMessage({ url: v.string }, '*') : window.open( v.string, '_blank')
// in case you're running in an iframe, then use this in the parent page:
//
// window.addEventListener("message", (e) => {
// if (e.data && e.data.url){
// window.open( e.data.url, '_blank')
// }
// },
// false,
// );
})
}) })
.catch( console.error ) .catch( console.error )
} }