PassRefPtr<DocumentFragment> fragmentFromHTML(Document* doc, IDataObject* data) { if (!doc || !data) return 0; STGMEDIUM store; String html; String srcURL; if (SUCCEEDED(data->GetData(htmlFormat(), &store))) { //MS HTML Format parsing char* data = (char*)GlobalLock(store.hGlobal); SIZE_T dataSize = ::GlobalSize(store.hGlobal); String cf_html(UTF8Encoding().decode(data, dataSize)); GlobalUnlock(store.hGlobal); ReleaseStgMedium(&store); if (PassRefPtr<DocumentFragment> fragment = fragmentFromCF_HTML(doc, cf_html)) return fragment; } if (SUCCEEDED(data->GetData(texthtmlFormat(), &store))) { //raw html UChar* data = (UChar*)GlobalLock(store.hGlobal); html = String(data); GlobalUnlock(store.hGlobal); ReleaseStgMedium(&store); return createFragmentFromMarkup(doc, html, srcURL); } return 0; }
PassRefPtr<DocumentFragment> Pasteboard::documentFragment(Frame* frame, PassRefPtr<Range> context, bool allowPlainText, bool& chosePlainText) { chosePlainText = false; if (::IsClipboardFormatAvailable(HTMLClipboardFormat) && ::OpenClipboard(m_owner)) { // get data off of clipboard HANDLE cbData = ::GetClipboardData(HTMLClipboardFormat); if (cbData) { SIZE_T dataSize = ::GlobalSize(cbData); String cf_html(UTF8Encoding().decode((char*)GlobalLock(cbData), dataSize)); GlobalUnlock(cbData); CloseClipboard(); PassRefPtr<DocumentFragment> fragment = fragmentFromCF_HTML(frame->document(), cf_html); if (fragment) return fragment; } else CloseClipboard(); } if (allowPlainText && IsClipboardFormatAvailable(CF_UNICODETEXT)) { chosePlainText = true; if (OpenClipboard(m_owner)) { HANDLE cbData = GetClipboardData(CF_UNICODETEXT); if (cbData) { UChar* buffer = (UChar*)GlobalLock(cbData); String str(buffer); GlobalUnlock(cbData); CloseClipboard(); RefPtr<DocumentFragment> fragment = createFragmentFromText(context.get(), str); if (fragment) return fragment.release(); } else CloseClipboard(); } } if (allowPlainText && ::IsClipboardFormatAvailable(CF_TEXT)) { chosePlainText = true; if (::OpenClipboard(m_owner)) { HANDLE cbData = ::GetClipboardData(CF_TEXT); if (cbData) { char* buffer = (char*)GlobalLock(cbData); String str(buffer); GlobalUnlock(cbData); CloseClipboard(); RefPtr<DocumentFragment> fragment = createFragmentFromText(context.get(), str); if (fragment) return fragment.release(); } else CloseClipboard(); } } return 0; }