|
|
|
@ -23,8 +23,14 @@ html { |
|
|
|
</head> |
|
|
|
<body> |
|
|
|
${'<'}script type="module"> |
|
|
|
let frame = undefined |
|
|
|
let frame = undefined |
|
|
|
addEventListener('message', event => { |
|
|
|
const isChild = ( |
|
|
|
frame !== undefined && event.source == frame.contentWindow |
|
|
|
) |
|
|
|
if (isChild) { |
|
|
|
parent.postMessage(event.data, '*') |
|
|
|
} else { |
|
|
|
let isNew = false |
|
|
|
const d = event.data |
|
|
|
if (Array.isArray(d) && d[0] === 'srcdoc') { |
|
|
|
@ -34,12 +40,13 @@ addEventListener('message', event => { |
|
|
|
frame.sandbox = "allow-scripts allow-top-navigation" |
|
|
|
} |
|
|
|
frame.srcdoc = d[1] |
|
|
|
} else if (frame !== undefined) { |
|
|
|
frame.postMessage(event.data) |
|
|
|
} |
|
|
|
if (isNew) { |
|
|
|
document.body.appendChild(frame) |
|
|
|
} |
|
|
|
} else if (frame !== undefined) { |
|
|
|
frame.contentWindow.postMessage(event.data, '*') |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
${'</'}script> |
|
|
|
</body> |
|
|
|
@ -81,10 +88,16 @@ export class FileGroupPage extends HTMLElement { |
|
|
|
this.initEditFrame() |
|
|
|
this.initViewFrame() |
|
|
|
this.editing = this.editing |
|
|
|
addEventListener('message', this.handleMessage) |
|
|
|
} |
|
|
|
|
|
|
|
disconnectedCallback() { |
|
|
|
removeEventListener('message', this.handleMessage) |
|
|
|
} |
|
|
|
|
|
|
|
initEditFrame() { |
|
|
|
const frame = document.createElement('iframe') |
|
|
|
frame.classList.add('edit') |
|
|
|
if (this.csp !== undefined) { |
|
|
|
frame.sandbox = "allow-same-origin allow-scripts allow-top-navigation" |
|
|
|
const url = new URL( |
|
|
|
@ -100,12 +113,16 @@ export class FileGroupPage extends HTMLElement { |
|
|
|
frame.addEventListener('load', () => { |
|
|
|
this.displayEdit() |
|
|
|
}) |
|
|
|
frame.addEventListener('message', message => { |
|
|
|
this.handleEditMessage(message) |
|
|
|
}) |
|
|
|
this.editFrame = frame |
|
|
|
this.shadowRoot.append(frame) |
|
|
|
} |
|
|
|
|
|
|
|
initViewFrame() { |
|
|
|
const frame = document.createElement('iframe') |
|
|
|
frame.classList.add('view') |
|
|
|
if (this.csp !== undefined) { |
|
|
|
frame.sandbox = "allow-same-origin allow-scripts allow-top-navigation" |
|
|
|
const url = new URL( |
|
|
|
@ -125,22 +142,50 @@ export class FileGroupPage extends HTMLElement { |
|
|
|
this.shadowRoot.append(frame) |
|
|
|
} |
|
|
|
|
|
|
|
displayView() { |
|
|
|
let doc = 'view here' |
|
|
|
displayView(doc) { |
|
|
|
const msg = ['srcdoc', doc] |
|
|
|
this.viewFrame.contentWindow.postMessage( |
|
|
|
msg, '*' |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
displayEdit() { |
|
|
|
let doc = 'edit here' |
|
|
|
async displayEdit() { |
|
|
|
const doc = await this.editorBuild.build() |
|
|
|
const msg = ['srcdoc', doc] |
|
|
|
this.viewFrame.contentWindow.postMessage( |
|
|
|
this.editFrame.contentWindow.postMessage( |
|
|
|
msg, '*' |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
handleMessage = event => { |
|
|
|
const editWin = this.editFrame?.contentWindow |
|
|
|
const viewWin = this.viewFrame?.contentWindow |
|
|
|
if (editWin && event.source == editWin) { |
|
|
|
this.handleEditMessage(event) |
|
|
|
} else if (viewWin && event.source == viewWin) { |
|
|
|
this.handleViewMessage(event) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
async handleViewMessage(event) { |
|
|
|
} |
|
|
|
|
|
|
|
async handleEditMessage(event) { |
|
|
|
if (Array.isArray(event.data)) { |
|
|
|
if (event.data[0] === 'ready') { |
|
|
|
this.editFrame.contentWindow.postMessage( |
|
|
|
['doc', this.body], '*' |
|
|
|
) |
|
|
|
} else if (event.data[0] === 'html') { |
|
|
|
const html = event.data[1] |
|
|
|
this.displayView(html) |
|
|
|
} else if (event.data[0] === 'save') { |
|
|
|
const doc = event.data[1] |
|
|
|
this.body = doc |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
set body(value) { |
|
|
|
try { |
|
|
|
localStorage.setItem(this.path, value) |
|
|
|
@ -168,6 +213,11 @@ export class FileGroupPage extends HTMLElement { |
|
|
|
} else { |
|
|
|
classes.add('viewing') |
|
|
|
classes.remove('editing') |
|
|
|
if (this.editFrame) { |
|
|
|
this.editFrame.contentWindow.postMessage( |
|
|
|
['request-html'], '*' |
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|