[whatwg] Canvas.cloneNode()

Michael A. Puls II shadow2531 at gmail.com
Thu Dec 10 07:34:48 PST 2009


On Wed, 09 Dec 2009 12:08:29 -0500, Ian Hickson <ian at hixie.ch> wrote:

> On Fri, 30 Oct 2009, OmegaJunior wrote:
>>
>> Since Last Call was announced and I just ran into this problem, hereby
>> this question:
>>
>> If an image is drawn on a Canvas element, and subsequently the
>> javascript function cloneNode(true) is executed for that element, should
>> the clone include a copy of the source canvas image, or should it show
>> an empty space?
>>
>> From my perspective (the web author), I'd prefer to have the canvas
>> image included when executing (the deep) cloneNode(true), and excluded
>> it when using (the shallow) cloneNode(false).
>
> The cloneNode() method just clones the node, not the node's state, so the
> bitmap isn't copied. You can easily draw one bitmap onto the other,
> though, using drawImage().
>
>
> On Sat, 14 Nov 2009, Michael A. Puls II wrote:
>>
>> I think it'd be cool if the clone showed the image. But, I'm pretty sure
>> cloneNode(true) is just supposed to create a new canvas element with the
>> same attributes and childNodes as the original. It's not supposed to
>> copy everything that's going on with the element being copied.
>>
>> There are some exceptions with state for certain elements. Perhaps that
>> can happen with canvas too.
>
> I'd rather keep these exceptions to an absolute minimum. cloneNode() is
> part of the DOM Core API, and it would be bad for nodes to clone
> differently based on whether it's an HTML-aware UA implementing the DOM
> Core API or not.

Thanks.

I don't know canvas stuff that well. What's the proper way to patch  
cloneNode to do a full copy?

I think something like the following, but maybe you know better.

(function() {
     var oldCloneNode = HTMLCanvasElement.prototype.cloneNode;
     HTMLCanvasElement.prototype.cloneNode = function(deep) {
         var copy = oldCloneNode.call(this, deep);
         var copy_ctx = copy.getContext("2d");
         copy_ctx.drawImage(this, 0, 0, this.width, this.height);
         return copy;
     };
})();

-- 
Michael


More information about the whatwg mailing list