mirror of
https://github.com/chinchang/web-maker.git
synced 2025-07-17 12:01:13 +02:00
render file preview iframe in subdomain
This commit is contained in:
1
preview/index.html
Normal file
1
preview/index.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Loading...
|
59
preview/service-worker.js
Normal file
59
preview/service-worker.js
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
const CACHE_NAME = 'webmaker-vfiles';
|
||||||
|
self.addEventListener('fetch', function(event) {
|
||||||
|
// console.log('fetch event', event.request.url, event.request);
|
||||||
|
event.respondWith(
|
||||||
|
caches.open(CACHE_NAME).then(function(cache) {
|
||||||
|
return cache
|
||||||
|
.match(event.request)
|
||||||
|
.then(response => {
|
||||||
|
// console.log('responding with ', response);
|
||||||
|
if (response !== undefined) {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
return fetch(event.request);
|
||||||
|
})
|
||||||
|
.catch(function(e) {
|
||||||
|
// Fall back to just fetch()ing the request if some unexpected error
|
||||||
|
// prevented the cached response from being valid.
|
||||||
|
console.warn(
|
||||||
|
'Couldn\'t serve response for "%s" from cache: %O',
|
||||||
|
event.request.url,
|
||||||
|
e
|
||||||
|
);
|
||||||
|
return fetch(event.request);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
);
|
||||||
|
// }
|
||||||
|
});
|
||||||
|
|
||||||
|
function getContentType(url) {
|
||||||
|
if (url.match(/\.html$/)) {
|
||||||
|
return 'text/html; charset=UTF-8';
|
||||||
|
} else if (url.match(/\.css$/)) {
|
||||||
|
return 'text/css; charset=UTF-8';
|
||||||
|
}
|
||||||
|
if (url.match(/\.js$/)) {
|
||||||
|
return 'application/javascript; charset=UTF-8';
|
||||||
|
}
|
||||||
|
return 'text/html; charset=UTF-8';
|
||||||
|
}
|
||||||
|
|
||||||
|
self.addEventListener('message', function(e) {
|
||||||
|
// console.log('message aya sw main', e.data);
|
||||||
|
caches.open(CACHE_NAME).then(function(cache) {
|
||||||
|
for (const url in e.data) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(e.data, url)) {
|
||||||
|
// console.log('Received data', url, e.data[url])
|
||||||
|
cache.put(
|
||||||
|
url,
|
||||||
|
new Response(e.data[url], {
|
||||||
|
headers: {
|
||||||
|
'Content-Type': getContentType(url)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
72
preview/talk.html
Normal file
72
preview/talk.html
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
Hello
|
||||||
|
|
||||||
|
<script>
|
||||||
|
if (
|
||||||
|
'serviceWorker' in navigator
|
||||||
|
) {
|
||||||
|
// Delay registration until after the page has loaded, to ensure that our
|
||||||
|
// precaching requests don't degrade the first visit experience.
|
||||||
|
// See https://developers.google.com/web/fundamentals/instant-and-offline/service-worker/registration
|
||||||
|
window.addEventListener('load', function () {
|
||||||
|
// Your service-worker.js *must* be located at the top-level directory relative to your site.
|
||||||
|
// It won't be able to control pages unless it's located at the same level or higher than them.
|
||||||
|
// *Don't* register service worker file in, e.g., a scripts/ sub-directory!
|
||||||
|
// See https://github.com/slightlyoff/ServiceWorker/issues/468
|
||||||
|
navigator.serviceWorker
|
||||||
|
.register('service-worker.js')
|
||||||
|
.then(function (reg) {
|
||||||
|
// updatefound is fired if service-worker.js changes.
|
||||||
|
reg.onupdatefound = function () {
|
||||||
|
// The updatefound event implies that reg.installing is set; see
|
||||||
|
// https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event
|
||||||
|
var installingWorker = reg.installing;
|
||||||
|
|
||||||
|
installingWorker.onstatechange = function () {
|
||||||
|
/* eslint-disable default-case */
|
||||||
|
switch (installingWorker.state) {
|
||||||
|
case 'installed':
|
||||||
|
if (navigator.serviceWorker.controller) {
|
||||||
|
// At this point, the old content will have been purged and the fresh content will
|
||||||
|
// have been added to the cache.
|
||||||
|
// It's the perfect time to display a "New content is available; please refresh."
|
||||||
|
// message in the page's interface.
|
||||||
|
console.log('New or updated content is available.');
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// At this point, everything has been precached.
|
||||||
|
// It's the perfect time to display a "Content is cached for offline use." message.
|
||||||
|
console.log('Content is now available offline!');
|
||||||
|
if (window.alertsService) {
|
||||||
|
window.alertsService.add(
|
||||||
|
'Web Maker is now ready to be used offline.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'redundant':
|
||||||
|
console.error(
|
||||||
|
'The installing service worker became redundant.'
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.catch(function (e) {
|
||||||
|
console.error('Error during service worker registration:', e);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
console.log('controller', navigator.serviceWorker.controller)
|
||||||
|
window.addEventListener('message', (e) => {
|
||||||
|
console.log(88, e.data);
|
||||||
|
navigator.serviceWorker.controller.postMessage(e.data);
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
@@ -244,8 +244,6 @@ export default class CodeEditor extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async initEditor() {
|
async initEditor() {
|
||||||
console.log('init editor');
|
|
||||||
|
|
||||||
this.editorReadyDeferred = deferred();
|
this.editorReadyDeferred = deferred();
|
||||||
await this.loadDeps();
|
await this.loadDeps();
|
||||||
|
|
||||||
|
@@ -226,7 +226,7 @@ export default class ContentWrapFiles extends Component {
|
|||||||
);
|
);
|
||||||
// Namespace all file paths to '/user' because thats what the service worker
|
// Namespace all file paths to '/user' because thats what the service worker
|
||||||
// recognizes.
|
// recognizes.
|
||||||
const files = linearizeFiles(assignFilePaths(duplicateFiles, '/user'));
|
const files = linearizeFiles(assignFilePaths(duplicateFiles, ''));
|
||||||
|
|
||||||
files.forEach(file => {
|
files.forEach(file => {
|
||||||
obj[file.path] = file.content || '';
|
obj[file.path] = file.content || '';
|
||||||
@@ -245,13 +245,16 @@ export default class ContentWrapFiles extends Component {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
navigator.serviceWorker.controller.postMessage(obj);
|
// navigator.serviceWorker.controller.postMessage(obj);
|
||||||
|
window.talkFrame.contentWindow.postMessage(obj, '*');
|
||||||
|
|
||||||
if (this.detachedWindow) {
|
if (this.detachedWindow) {
|
||||||
log('✉️ Sending message to detached window');
|
log('✉️ Sending message to detached window');
|
||||||
this.detachedWindow.postMessage({ contents: '/user/index.html' }, '*');
|
this.detachedWindow.postMessage({ contents: '/user/index.html' }, '*');
|
||||||
} else {
|
} else {
|
||||||
this.frame.src = '/user/index.html';
|
setTimeout(() => {
|
||||||
|
this.frame.src = 'https://preview.webmaker.com:8083/index.html';
|
||||||
|
}, 10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cleanupErrors() {
|
cleanupErrors() {
|
||||||
@@ -650,11 +653,15 @@ export default class ContentWrapFiles extends Component {
|
|||||||
<div class="demo-side" id="js-demo-side" style="">
|
<div class="demo-side" id="js-demo-side" style="">
|
||||||
<iframe
|
<iframe
|
||||||
ref={el => (this.frame = el)}
|
ref={el => (this.frame = el)}
|
||||||
src="/user/index.html"
|
src="https://preview.webmaker.com:8083/index.html"
|
||||||
frameborder="0"
|
frameborder="0"
|
||||||
id="demo-frame"
|
id="demo-frame"
|
||||||
allowfullscreen
|
allowfullscreen
|
||||||
/>
|
/>
|
||||||
|
<iframe
|
||||||
|
src="https://preview.webmaker.com:8083/talk.html"
|
||||||
|
id="talkFrame"
|
||||||
|
/>
|
||||||
<PreviewDimension ref={comp => (this.previewDimension = comp)} />
|
<PreviewDimension ref={comp => (this.previewDimension = comp)} />
|
||||||
<Console
|
<Console
|
||||||
logs={this.state.logs}
|
logs={this.state.logs}
|
||||||
|
Reference in New Issue
Block a user