getContext('worker') returns a CanvasTransferableRenderingContext and sets /inhibited canvas/ mode /inhibited canvas/ mode (disables the toBlob* and toDataURL* methods, height/width resetting) interface CanvasTransferableRenderingContext { attribute unsigned long height; attribute unsigned long width; DOMString toDataURL(optional DOMString type, any... arguments); DOMString toDataURLHD(optional DOMString type, any... arguments); void toBlob(FileCallback? _callback, optional DOMString type, any... arguments); void toBlobHD(FileCallback? _callback, optional DOMString type, any... arguments); object? getContext(DOMString contextId, any... arguments); boolean supportsContext(DOMString contextId, any... arguments); }; CanvasTransferableRenderingContext implements Transferable; CanvasTransferableRenderingContext's "neutering" behaviour is to make all the attribute and methods start throwing on getting/setting and invocation respectively. CanvasTransferableRenderingContext.getContext, when it is invoked, neuters the CanvasTransferableRenderingContext. XHR gets a new responseType 'image' which, in the main thread, returns an HTMLImageElement, and in workers, returns an opaque Image object In the worker thread: * CanvasRenderingContext2D.canvas returns an Image object representing the canvas * Anything that takes an HTMLImageElement is extended to also take an Image * CanvasRenderingContext2D.draw*FocusRing() methods can't be invoked * scrollPathIntoView() has no effect * anything derived from computed CSS values uses defaults