mirror of
https://github.com/microsoft/vscode.git
synced 2026-05-03 23:06:49 +01:00
Compute diff and dirtyDiff on a private editor worker
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
})();
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user