Chart.js: Investigate Offscreen Canvas Rendering

Created on 21 Mar 2018  Â·  3Comments  Â·  Source: chartjs/Chart.js

Per https://twitter.com/ebidel/status/975788240463585281 Chrome and Firefox are introducing an OffscreenCanvas than can be rendered from a web worker.

We should investigate and see if Chart.js can use this. If so, might be a good advanced topic in the documentation

documentation enhancement

Most helpful comment

I was wondering if there has been any progress on this? It would be great to be able to render charts in a web worker.

All 3 comments

I was wondering if there has been any progress on this? It would be great to be able to render charts in a web worker.

I've managed to do it, however there are few problems:

  • Chart.js expects Canvas which is an instance of HTMLElement.
    When you pass an OffscreenCanvas you'd have to add a proxy for some of it's methods and properties like getAttribute, setAttribute, classList, width, height, getBoundingClientRect, clientWidth and clientHeight.
  • Legend doesn't work
  • Events don't work

Example

let canvasElement = document.createElement('canvas')
canvasElement.width = 375
canvasElement.height = 200

if (canvasElement.transferControlToOffscreen) {
  const originalCanvasElement = canvasElement

  canvasElement = originalCanvasElement.transferControlToOffscreen()

  canvasElement.getAttribute = originalCanvasElement.getAttribute.bind(originalCanvasElement)
  canvasElement.setAttribute = originalCanvasElement.setAttribute.bind(originalCanvasElement)
  canvasElement.style = originalCanvasElement.style
  canvasElement.classList = originalCanvasElement.classList
  canvasElement.width = originalCanvasElement.width
  canvasElement.height = originalCanvasElement.height
  canvasElement.getBoundingClientRect = originalCanvasElement.getBoundingClientRect
  canvasElement.clientWidth = originalCanvasElement.clientWidth
  canvasElement.clientHeight = originalCanvasElement.clientHeight
}

new Chart(canvasElement)

More info: https://developers.google.com/web/updates/2018/08/offscreen-canvas#use_with_popular_libraries

I've managed to do it, however there are few problems:

  • Chart.js expects Canvas which is an instance of HTMLElement.
    When you pass an OffscreenCanvas you'd have to add a proxy for some of it's methods and properties like getAttribute, setAttribute, classList, width, height, getBoundingClientRect, clientWidth and clientHeight.
  • Legend doesn't work
  • Events don't work

Example

let canvasElement = document.createElement('canvas')
canvasElement.width = 375
canvasElement.height = 200

if (canvasElement.transferControlToOffscreen) {
  const originalCanvasElement = canvasElement

  canvasElement = originalCanvasElement.transferControlToOffscreen()

  canvasElement.getAttribute = originalCanvasElement.getAttribute.bind(originalCanvasElement)
  canvasElement.setAttribute = originalCanvasElement.setAttribute.bind(originalCanvasElement)
  canvasElement.style = originalCanvasElement.style
  canvasElement.classList = originalCanvasElement.classList
  canvasElement.width = originalCanvasElement.width
  canvasElement.height = originalCanvasElement.height
  canvasElement.getBoundingClientRect = originalCanvasElement.getBoundingClientRect
  canvasElement.clientWidth = originalCanvasElement.clientWidth
  canvasElement.clientHeight = originalCanvasElement.clientHeight
}

new Chart(canvasElement)

More info: https://developers.google.com/web/updates/2018/08/offscreen-canvas#use_with_popular_libraries

Add canvasElement.addEventListener = originalCanvasElement.addEventListener.bind(originalCanvasElement);

How I can use this with web worker because I want to update and re render existing chart in second thread

Was this page helpful?
0 / 5 - 0 ratings

Related issues

adriantombu picture adriantombu  Â·  3Comments

joebirkin picture joebirkin  Â·  3Comments

longboy picture longboy  Â·  3Comments

HeinPauwelyn picture HeinPauwelyn  Â·  3Comments

gabrieldesouza picture gabrieldesouza  Â·  3Comments