qt-bugs@ issue : 38642 bugs.kde.org number : 71084 applied: no author: Lubos Lunak Hello, start Mozilla, go e.g. to http://kde.org, start KWrite (or basically any Qt app that accepts text drops), select 'Conquer your Desktop!', and try to drag&drop it onto KWrite. The only text pasted should be 'm'. I don't know much the related mimetype and encoding stuff, so I'm unsure whose fault this actually is. The text drag is provided as a lot of text/something targets, to list some text/_moz_htmlinfo, text/x-moz-url, text/unicode and similar. The problem is, Kate uses QTextDrag::decode() with no subtype specified, probably with the intention that as Kate is a text editor, it can accept any text pasted. And since the first target provided by mozilla is text/x-moz-url, (which moreover seems to be encoded as 16bit unicode), the text dropped is completely wrong. You can easily see all targets provided by Mozilla with see_mime.patch applied. Solution #1: Say that Kate (any pretty much everybody else expecting text) should say "plain" as the subtype. In such case, I suggest you drop the QTextDrag::decode() variant with no subtype specified, and stress more the fact that not specifying a subtype can result in a lot of rubbish. It's simply too tempting to leave the subtype empty and try to accept anything. Solution #2: When trying to accept anything, try to get useful data. Which means either sorting the subtypes available somehow, checking only the ones Qt knows. To me, #1 seems to be a better choice, or possibly at least something like the attached QTextDrag patch, which simply always tries first "plain" subtype if none is specified. With this patch, Mozilla even works (that's irony, of course, Mozilla still pastes the text/plain text as HTML, but at least now it pastes something where it's easy to point at the offender). --- src/kernel/qdragobject.cpp.sav 2004-01-06 19:24:35.000000000 +0100 +++ src/kernel/qdragobject.cpp 2004-01-06 19:47:01.000000000 +0100 @@ -844,6 +844,16 @@ bool QTextDrag::decode( const QMimeSourc { if(!e) return FALSE; + + // when subtype is not specified, try text/plain first, otherwise this may read + // things like text/x-moz-url even though better targets are available + if( subtype.isNull()) { + QCString subtmp = "plain"; + if( decode( e, str, subtmp )) { + subtype = subtmp; + return true; + } + } if ( e->cacheType == QMimeSource::Text ) { str = *e->cache.txt.str;