After working with developers inside and outside Microsoft, it seems there are 
several types of paste that make sense in various scenarios. For instance, 
1- if pasting into a rich document, it could be important to maintain source 
styling information. 
2- When pasting into a wiki from an external source, it might make more sense 
to maintain destination styling instead. 
3- When copying from a wiki and pasting back into that same wiki, it makes 
sense to maintain any special formatting on that text (inline styles) but 
otherwise to use the theme (style sheets). 

So this is a complex problem to solve. From what I can tell, Firefox removes 
the document's head (and therefore style sheets) on copy, so 2 and 3 work, but 
1 doesn't. Chrome inlines a certain set of styles on copy, and removes the 
head, so 1 and 2 work, but 3 doesn't. IE maintains the head on copy, so all 3 
can work, only by using non-standard paste APIs that require the user to allow 
clipboard access. We have 3 execCommand args available- paste (for 1), 
ms-PasteTextOnly (for 2), and ms-PasteContentOnly (which maintains the shape of 
html markup but not styles, somewhat like 3).

In addition, the return value of getData('text/html') also varies. In Firefox, 
it returns only the data between <startfragment> and <endfragment>. This again 
makes sense for 2 and 3 above. In Chrome, it returns everything in the 
clipboard item, which includes the head, body, and the <startfragment> and 
<endfragment>, which means cleanup is required to actually put it in the DOM. 
IE doesn't support this at all yet, so whenever a developer wants to change the 
pasted text before it shows up in the DOM, they can't*.

We need a unified story.

One possibility would be to do something similar to Firefox, but also include a 
text/css clipboard item, which contains styles relevant to what is copied and 
is available on paste via getData('text/css'). Another solution might be to 
build a document fragment during paste and make that available as a clipboard 
item that contains styles and is easier to insert into the DOM. Thoughts?

Ben Peters


* there is actually a way to do this, but it's a hack and we're trying to solve 
it. Currently several implementations actually move the focus to a hidden 
iframe, allow the paste to run, clean up the new DOM, and then move it to where 
the paste happened. This causes issues because the focus is moving around, and 
it's generally ugly.

Reply via email to