From 78eac1c12be10847d491db7bb38d259d3ffcbd5e Mon Sep 17 00:00:00 2001 From: Leon van Kammen Date: Tue, 23 Jan 2024 16:45:07 +0000 Subject: [PATCH] unknown href links now open in browsertab (incl. from iframe) --- src/3rd/js/aframe/index.js | 1 - src/3rd/js/plugin/matrix/matrix.js | 8 ++++---- src/3rd/js/three/navigator.js | 10 +++++----- src/3rd/js/three/xrf/href.js | 22 ++++++++++++++-------- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/3rd/js/aframe/index.js b/src/3rd/js/aframe/index.js index 7588903..a4edc1a 100644 --- a/src/3rd/js/aframe/index.js +++ b/src/3rd/js/aframe/index.js @@ -64,7 +64,6 @@ window.AFRAME.registerComponent('xrf', { let url = opts.xrf.string let isLocal = url.match(/^#/) let hasPos = url.match(/pos=/) - if( !isLocal && !url.match(/^http/) ) return // dont fade/load for custom protocol handlers if( isLocal && hasPos ){ // local teleports only let fastFadeMs = 200 diff --git a/src/3rd/js/plugin/matrix/matrix.js b/src/3rd/js/plugin/matrix/matrix.js index 4a74d16..c219105 100644 --- a/src/3rd/js/plugin/matrix/matrix.js +++ b/src/3rd/js/plugin/matrix/matrix.js @@ -89,6 +89,7 @@ window.matrix = (opts) => new Proxy({ }, connect(opts){ + this.createLink() // ensure link if( opts.selectedWebcam == this.profile.name ) this.useWebcam = true if( opts.selectedChatnetwork == this.profile.name ) this.useChat = 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 let parts = url.replace(this.profile.protocol,'').split("/") if( parts[0] == 'r' ){ // room - let server = parts.split("/")[1].replace(/:.*/,'') - let channel = parts.split("/")[1].replace(/.*:/,'') + let server = parts[1].replace(/:.*/,'') + let channel = parts[1].replace(/.*:/,'') $connections.show() $connections.selectedChatnetwork = this.profile.name $connections.selectedScene = this.profile.name @@ -241,7 +242,7 @@ window.matrix = (opts) => new Proxy({ return false }, - t0nkr0nst0nreateLink(opts){ + createLink(opts){ let hash = document.location.hash if( !this.link ){ const meeting = network.getMeetingFromUrl(document.location.href) @@ -258,7 +259,6 @@ window.matrix = (opts) => new Proxy({ let href = mesh.userData.href let isLocal = href[0] == '#' let isTeleport = href.match(/(pos=|http:)/) - console.log("href detected") if( isLocal && !isTeleport && this.client && this.useScene ){ console.log("sending href") this.yhref.set( document.location.hash ) diff --git a/src/3rd/js/three/navigator.js b/src/3rd/js/three/navigator.js index ad84d70..5e13036 100644 --- a/src/3rd/js/three/navigator.js +++ b/src/3rd/js/three/navigator.js @@ -8,19 +8,19 @@ xrf.navigator.to = (url,flags,loader,data) => { return new Promise( (resolve,reject) => { let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url) - if( !file || (!data && xrf.model.file == file) ){ // we're already loaded - if( hash == document.location.hash.substr(1) ) return // block duplicate calls - hashbus.pub( url, xrf.model, flags ) // and eval local URI XR fragments + if( (!file && hash) || (!data && xrf.model.file == file) ){ // we're already loaded + if( hash == document.location.hash.substr(1) ) return // block duplicate calls + hashbus.pub( url, xrf.model, flags ) // and eval local URI XR fragments xrf.navigator.updateHash(hash) return resolve(xrf.model) } - if( xrf.model && xrf.model.scene ) xrf.model.scene.visible = false if( !loader ){ 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 ) } + if( xrf.model && xrf.model.scene ) xrf.model.scene.visible = false // force relative path for files which dont include protocol or relative path if( dir ) dir = dir[0] == '.' || dir.match("://") ? dir : `.${dir}` diff --git a/src/3rd/js/three/xrf/href.js b/src/3rd/js/three/xrf/href.js index d4c1031..0dd22d0 100644 --- a/src/3rd/js/three/xrf/href.js +++ b/src/3rd/js/three/xrf/href.js @@ -40,19 +40,25 @@ xrf.frag.href = function(v, opts){ .emit('href',{click:true,mesh,xrf:v}) // let all listeners agree .then( () => { 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 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) if( !e.nocommit && !document.location.hash.match(lastPos) ) xrf.navigator.to(`#${lastPos}`) 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 ) }