+        // The string might be "\r\n"-terminated but this is not necessarily
+        // the case (e.g. when dragging an URL from Firefox, it isn't).
+        if ( len > 1 && src[len - 1] == '\n' )
+        {
+            if ( len > 2 && src[len - 2] == '\r' )
+                len--;
+
+            len--;
+        }
+
+        m_url = wxString::FromUTF8(src, len);
+
+        return true;
+    }
+
+    // Must provide overloads to avoid hiding them (and warnings about it)
+    virtual size_t GetDataSize(const wxDataFormat&) const
+    {
+        return GetDataSize();
+    }
+    virtual bool GetDataHere(const wxDataFormat&, void *buf) const
+    {
+        return GetDataHere(buf);
+    }
+    virtual bool SetData(const wxDataFormat&, size_t len, const void *buf)
+    {
+        return SetData(len, buf);
+    }
+
+private:
+    wxString m_url;
+};
+
+wxURLDataObject::wxURLDataObject(const wxString& url) :
+    m_dobjURIList(new wxTextURIListDataObject(url)),
+    m_dobjText(new wxTextDataObject(url))
+{
+    // Use both URL-specific format and a plain text one to ensure that URLs
+    // can be pasted into any application.
+    Add(m_dobjURIList, true /* preferred */);
+    Add(m_dobjText);