~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to src/proxyWorker.js

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-09-20 22:44:35 UTC
  • mfrom: (4.1.1 sid)
  • Revision ID: package-import@ubuntu.com-20130920224435-apuwj4fsl3fqv1a6
Tags: 1.5.6~20130920~6010666-1
* New snapshot release
* Update the list of supported architectures to the same as libv8
  (Closes: #723129)
* emlibtool has been removed from upstream.
* Fix warning syntax-error-in-dep5-copyright
* Refresh of the patches

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
function EventListener() {
 
3
  this.listeners = {};
 
4
 
 
5
  this.addEventListener = function(event, func) {
 
6
    if (!this.listeners[event]) this.listeners[event] = [];
 
7
    this.listeners[event].push(func);
 
8
  };
 
9
 
 
10
  this.fireEvent = function(event) {
 
11
    event.preventDefault = function(){};
 
12
 
 
13
    if (event.type in this.listeners) {
 
14
      this.listeners[event.type].forEach(function(listener) {
 
15
        listener(event);
 
16
      });
 
17
    }
 
18
  };
 
19
};
 
20
 
 
21
var window = this;
 
22
var windowExtra = new EventListener();
 
23
for (var x in windowExtra) window[x] = windowExtra[x];
 
24
 
 
25
window.close = function() {
 
26
  postMessage({ target: 'window', method: 'close' });
 
27
};
 
28
 
 
29
var document = new EventListener();
 
30
 
 
31
document.createElement = function(what) {
 
32
  switch(what) {
 
33
    case 'canvas': {
 
34
      var canvas = new EventListener();
 
35
      canvas.ensureData = function() {
 
36
        if (!canvas.data || canvas.data.width !== canvas.width || canvas.data.height !== canvas.height) {
 
37
          canvas.data = {
 
38
            width: canvas.width,
 
39
            height: canvas.height,
 
40
            data: new Uint8Array(canvas.width*canvas.height*4)
 
41
          };
 
42
          postMessage({ target: 'canvas', op: 'resize', width: canvas.width, height: canvas.height });
 
43
        }
 
44
      };
 
45
      canvas.getContext = function(type) {
 
46
        assert(type == '2d');
 
47
        return {
 
48
          getImageData: function(x, y, w, h) {
 
49
            assert(x == 0 && y == 0 && w == canvas.width && h == canvas.height);
 
50
            canvas.ensureData();
 
51
            return {
 
52
              width: canvas.data.width,
 
53
              height: canvas.data.height,
 
54
              data: new Uint8Array(canvas.data.data) // TODO: can we avoid this copy?
 
55
            };
 
56
          },
 
57
          putImageData: function(image, x, y) {
 
58
            canvas.ensureData();
 
59
            assert(x == 0 && y == 0 && image.width == canvas.width && image.height == canvas.height);
 
60
            canvas.data.data.set(image.data); // TODO: can we avoid this copy?
 
61
            postMessage({ target: 'canvas', op: 'render', image: canvas.data });
 
62
          }
 
63
        };
 
64
      };
 
65
      canvas.boundingClientRect = {};
 
66
      canvas.getBoundingClientRect = function() {
 
67
        return {
 
68
          width: canvas.boundingClientRect.width,
 
69
          height: canvas.boundingClientRect.height,
 
70
          top: canvas.boundingClientRect.top,
 
71
          left: canvas.boundingClientRect.left,
 
72
          bottom: canvas.boundingClientRect.bottom,
 
73
          right: canvas.boundingClientRect.right
 
74
        };
 
75
      };
 
76
      return canvas;
 
77
    }
 
78
    default: throw 'document.createElement ' + what;
 
79
  }
 
80
};
 
81
 
 
82
var console = {
 
83
  log: function(x) {
 
84
    Module.printErr(x);
 
85
  }
 
86
};
 
87
 
 
88
Module.canvas = document.createElement('canvas');
 
89
 
 
90
Module.setStatus = function(){};
 
91
 
 
92
Module.print = function(x) {
 
93
  postMessage({ target: 'stdout', content: x });
 
94
};
 
95
Module.printErr = function(x) {
 
96
  postMessage({ target: 'stderr', content: x });
 
97
};
 
98
 
 
99
// buffer messages until the program starts to run
 
100
 
 
101
var messageBuffer = null;
 
102
 
 
103
function messageResender() {
 
104
  if (calledMain) {
 
105
    assert(messageBuffer && messageBuffer.length > 0);
 
106
    messageBuffer.forEach(function(message) {
 
107
      onmessage(message);
 
108
    });
 
109
    messageBuffer = null;
 
110
  } else {
 
111
    setTimeout(messageResender, 100);
 
112
  }
 
113
}
 
114
 
 
115
onmessage = function(message) {
 
116
  if (!calledMain) {
 
117
    if (!messageBuffer) {
 
118
      messageBuffer = [];
 
119
      setTimeout(messageResender, 100);
 
120
    }
 
121
    messageBuffer.push(message);
 
122
  }
 
123
  switch (message.data.target) {
 
124
    case 'document': {
 
125
      document.fireEvent(message.data.event);
 
126
      break;
 
127
    }
 
128
    case 'window': {
 
129
      window.fireEvent(message.data.event);
 
130
      break;
 
131
    }
 
132
    case 'canvas': {
 
133
      if (message.data.event) {
 
134
        Module.canvas.fireEvent(message.data.event);
 
135
      } else if (message.data.boundingClientRect) {
 
136
        Module.canvas.boundingClientRect = message.data.boundingClientRect;
 
137
      } else throw 'ey?';
 
138
      break;
 
139
    }
 
140
    default: throw 'wha? ' + message.data.target;
 
141
  }
 
142
};
 
143