Compute diff and dirtyDiff on a private editor worker

This commit is contained in:
Alex Dima
2016-02-18 15:33:26 +01:00
parent 63604de6a9
commit 2345824184
16 changed files with 803 additions and 124 deletions

View File

@@ -24,9 +24,10 @@ class WebWorker implements IWorker {
private id:number;
private worker:any;
constructor(id:number, label:string, onMessageCallback:IWorkerCallback) {
constructor(moduleId:string, id:number, label:string, onMessageCallback:IWorkerCallback) {
this.id = id;
this.worker = new Worker(getWorkerUrl('workerMain.js', label));
this.postMessage(moduleId);
this.worker.onmessage = function (ev:any) {
onMessageCallback(ev.data);
};
@@ -60,7 +61,7 @@ class FrameWorker implements IWorker {
private _listeners: lifecycle.IDisposable[];
constructor(id: number, onMessageCallback:IWorkerCallback) {
constructor(moduleId:string, id: number, onMessageCallback:IWorkerCallback) {
this.id = id;
this._listeners = [];
@@ -68,6 +69,8 @@ class FrameWorker implements IWorker {
this.loaded = false;
this.beforeLoadMessages = [];
this.postMessage(moduleId);
this.iframe = <HTMLIFrameElement> document.createElement('iframe');
this.iframe.id = this.iframeId();
this.iframe.src = require.toUrl('./workerMainCompatibility.html');
@@ -121,13 +124,14 @@ class FrameWorker implements IWorker {
}
export class DefaultWorkerFactory implements IWorkerFactory {
public create(id:number, onMessageCallback:IWorkerCallback, onCrashCallback:()=>void = null):IWorker {
var result:IWorker = null;
try {
result = new WebWorker(id, 'service' + id, onMessageCallback);
} catch (e) {
result = new FrameWorker(id, onMessageCallback);
private static LAST_WORKER_ID = 0;
public create(moduleId:string, onMessageCallback:IWorkerCallback):IWorker {
var workerId = (++DefaultWorkerFactory.LAST_WORKER_ID);
if (typeof WebWorker !== 'undefined') {
return new WebWorker(moduleId, workerId, 'service' + workerId, onMessageCallback);
}
return result;
return new FrameWorker(moduleId, workerId, onMessageCallback);
}
}

View File

@@ -16,20 +16,28 @@
catchError: true
});
var beforeReadyMessages:any[] = [];
self.onmessage = (message) => beforeReadyMessages.push(message);
var loadCode = function(moduleId) {
require([moduleId], function(ws) {
var messageHandler = ws.create((msg:any) => {
(<any>self).postMessage(msg);
}, null);
// Note: not using a import-module statement here, because
// it would wrap above statements in the define call.
self.onmessage = (e) => messageHandler.onmessage(e.data);
while(beforeReadyMessages.length > 0) {
self.onmessage(beforeReadyMessages.shift());
}
});
};
require(['vs/base/common/worker/workerServer'], function(ws) {
var messageHandler = ws.create((msg:any) => {
(<any>self).postMessage(msg);
}, null);
self.onmessage = (e) => messageHandler.onmessage(e.data);
while(beforeReadyMessages.length > 0) {
self.onmessage(beforeReadyMessages.shift());
var isFirstMessage = true;
var beforeReadyMessages:MessageEvent[] = [];
self.onmessage = (message) => {
if (!isFirstMessage) {
beforeReadyMessages.push(message);
return;
}
});
isFirstMessage = false;
loadCode(message.data);
};
})();

View File

@@ -4,17 +4,6 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<script type="text/javascript">
var beforeReadyMessages = [];
var beforeReadyListener = function (message) {
beforeReadyMessages.push(message.data);
};
if (window.attachEvent) {
window.attachEvent('onmessage', beforeReadyListener);
} else {
window.onmessage = beforeReadyListener;
}
</script>
<script type="text/javascript" src="../../loader.js"></script>
<script>
require.config({
@@ -22,25 +11,47 @@
catchError: true
});
require(['vs/base/common/worker/workerServer'], function(ws) {
var workerServer = ws.create(function (msg) {
window.parent.postMessage(msg, '*');
});
window.isEmulatedWorker = true;
(function() {
var isFirstMessage = true;
var beforeReadyMessages = [];
var readyListener = function (ev) {
workerServer.onmessage(ev.data);
var loadCode = function(moduleId) {
require([moduleId], function(ws) {
var workerServer = ws.create(function (msg) {
window.parent.postMessage(msg, '*');
});
var readyListener = function (ev) {
workerServer.onmessage(ev.data);
};
if (window.attachEvent) {
window.detachEvent('onmessage', beforeReadyListener);
window.attachEvent('onmessage', readyListener);
} else {
window.onmessage = readyListener;
}
while(beforeReadyMessages.length > 0) {
readyListener({ data: beforeReadyMessages.shift() });
}
});
};
var beforeReadyListener = function (message) {
if (!isFirstMessage) {
beforeReadyMessages.push(message.data);
return;
}
isFirstMessage = false;
loadCode(message.data);
};
if (window.attachEvent) {
window.detachEvent('onmessage', beforeReadyListener);
window.attachEvent('onmessage', readyListener);
window.attachEvent('onmessage', beforeReadyListener);
} else {
window.onmessage = readyListener;
window.onmessage = beforeReadyListener;
}
while(beforeReadyMessages.length > 0) {
readyListener({ data: beforeReadyMessages.shift() });
}
});
})();
</script>
</head>
<body>