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 cfhtml(UTF8Encoding().decode(static_cast<char*>(GlobalLock(cbData)), dataSize)); GlobalUnlock(cbData); ::CloseClipboard(); PassRefPtr<DocumentFragment> fragment = fragmentFromCFHTML(frame->document(), cfhtml); 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 = static_cast<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 = static_cast<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; }
PassRefPtr<DocumentFragment> fragmentFromHTML(Document* doc, IDataObject* data) { if (!doc || !data) return 0; bool success = false; String cfhtml = getFullCFHTML(data, success); if (success) { if (PassRefPtr<DocumentFragment> fragment = fragmentFromCFHTML(doc, cfhtml)) return fragment; } String html = getTextHTML(data, success); String srcURL; if (success) return createFragmentFromMarkup(doc, html, srcURL, FragmentScriptingNotAllowed); return 0; }