📄 clipboardwin.cpp
字号:
hr = dataObject->SetData(cfHDropFormat(), &medium, TRUE); }exit: if (FAILED(hr)) { if (fileDescriptor) GlobalFree(fileDescriptor); if (fileContent) GlobalFree(fileContent); if (hDropContent) GlobalFree(hDropContent); } return hr;}ClipboardWin::ClipboardWin(bool isForDragging, IDataObject* dataObject, ClipboardAccessPolicy policy) : Clipboard(policy, isForDragging) , m_dataObject(dataObject) , m_writableDataObject(0){}ClipboardWin::ClipboardWin(bool isForDragging, WCDataObject* dataObject, ClipboardAccessPolicy policy) : Clipboard(policy, isForDragging) , m_dataObject(dataObject) , m_writableDataObject(dataObject){}ClipboardWin::~ClipboardWin(){}static bool writeURL(WCDataObject *data, const KURL& url, String title, bool withPlainText, bool withHTML){ ASSERT(data); if (url.isEmpty()) return false; if (title.isEmpty()) { title = url.lastPathComponent(); if (title.isEmpty()) title = url.host(); } STGMEDIUM medium = {0}; medium.tymed = TYMED_HGLOBAL; medium.hGlobal = createGlobalData(url, title); bool success = false; if (medium.hGlobal && FAILED(data->SetData(urlWFormat(), &medium, TRUE))) ::GlobalFree(medium.hGlobal); else success = true; if (withHTML) { Vector<char> cfhtmlData; markupToCF_HTML(urlToMarkup(url, title), "", cfhtmlData); medium.hGlobal = createGlobalData(cfhtmlData); if (medium.hGlobal && FAILED(data->SetData(htmlFormat(), &medium, TRUE))) ::GlobalFree(medium.hGlobal); else success = true; } if (withPlainText) { medium.hGlobal = createGlobalData(url.string()); if (medium.hGlobal && FAILED(data->SetData(plainTextWFormat(), &medium, TRUE))) ::GlobalFree(medium.hGlobal); else success = true; } return success;}void ClipboardWin::clearData(const String& type){ //FIXME: Need to be able to write to the system clipboard <rdar://problem/5015941> ASSERT(isForDragging()); if (policy() != ClipboardWritable || !m_writableDataObject) return; ClipboardDataType dataType = clipboardTypeFromMIMEType(type); if (dataType == ClipboardDataTypeURL) { m_writableDataObject->clearData(urlWFormat()->cfFormat); m_writableDataObject->clearData(urlFormat()->cfFormat); } if (dataType == ClipboardDataTypeText) { m_writableDataObject->clearData(plainTextFormat()->cfFormat); m_writableDataObject->clearData(plainTextWFormat()->cfFormat); }}void ClipboardWin::clearAllData(){ //FIXME: Need to be able to write to the system clipboard <rdar://problem/5015941> ASSERT(isForDragging()); if (policy() != ClipboardWritable) return; m_writableDataObject = 0; WCDataObject::createInstance(&m_writableDataObject); m_dataObject = m_writableDataObject;}String ClipboardWin::getData(const String& type, bool& success) const{ success = false; if (policy() != ClipboardReadable || !m_dataObject) { return ""; } ClipboardDataType dataType = clipboardTypeFromMIMEType(type); if (dataType == ClipboardDataTypeText) return getPlainText(m_dataObject.get(), success); else if (dataType == ClipboardDataTypeURL) return getURL(m_dataObject.get(), success); return "";}bool ClipboardWin::setData(const String& type, const String& data){ // FIXME: Need to be able to write to the system clipboard <rdar://problem/5015941> ASSERT(isForDragging()); if (policy() != ClipboardWritable || !m_writableDataObject) return false; ClipboardDataType winType = clipboardTypeFromMIMEType(type); if (winType == ClipboardDataTypeURL) return WebCore::writeURL(m_writableDataObject.get(), KURL(data), String(), false, true); if (winType == ClipboardDataTypeText) { STGMEDIUM medium = {0}; medium.tymed = TYMED_HGLOBAL; medium.hGlobal = createGlobalData(data); if (!medium.hGlobal) return false; if (FAILED(m_writableDataObject->SetData(plainTextWFormat(), &medium, TRUE))) { ::GlobalFree(medium.hGlobal); return false; } return true; } return false;}static void addMimeTypesForFormat(HashSet<String>& results, FORMATETC& format){ // URL and Text are provided for compatibility with IE's model if (format.cfFormat == urlFormat()->cfFormat || format.cfFormat == urlWFormat()->cfFormat) { results.add("URL"); results.add("text/uri-list"); } if (format.cfFormat == plainTextWFormat()->cfFormat || format.cfFormat == plainTextFormat()->cfFormat) { results.add("Text"); results.add("text/plain"); }}// extensions beyond IE's APIHashSet<String> ClipboardWin::types() const{ HashSet<String> results; if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable) return results; if (!m_dataObject) return results; COMPtr<IEnumFORMATETC> itr; if (FAILED(m_dataObject->EnumFormatEtc(0, &itr))) return results; if (!itr) return results; FORMATETC data; while (SUCCEEDED(itr->Next(1, &data, 0))) { addMimeTypesForFormat(results, data); } return results;}void ClipboardWin::setDragImage(CachedImage* image, Node *node, const IntPoint &loc){ if (policy() != ClipboardImageWritable && policy() != ClipboardWritable) return; if (m_dragImage) m_dragImage->removeClient(this); m_dragImage = image; if (m_dragImage) m_dragImage->addClient(this); m_dragLoc = loc; m_dragImageElement = node;}void ClipboardWin::setDragImage(CachedImage* img, const IntPoint &loc){ setDragImage(img, 0, loc);}void ClipboardWin::setDragImageElement(Node *node, const IntPoint &loc){ setDragImage(0, node, loc);}DragImageRef ClipboardWin::createDragImage(IntPoint& loc) const{ HBITMAP result = 0; //FIXME: Need to be able to draw element <rdar://problem/5015942> if (m_dragImage) { result = createDragImageFromImage(m_dragImage->image()); loc = m_dragLoc; } return result;}static String imageToMarkup(const String& url){ String markup("<img src=\""); markup.append(url); markup.append("\"/>"); return markup;}static CachedImage* getCachedImage(Element* element){ // Attempt to pull CachedImage from element ASSERT(element); RenderObject* renderer = element->renderer(); if (!renderer || !renderer->isImage()) return 0; RenderImage* image = static_cast<RenderImage*>(renderer); if (image->cachedImage() && !image->cachedImage()->errorOccurred()) return image->cachedImage(); return 0;}static void writeImageToDataObject(IDataObject* dataObject, Element* element, const KURL& url){ // Shove image data into a DataObject for use as a file CachedImage* cachedImage = getCachedImage(element); if (!cachedImage || !cachedImage->image() || !cachedImage->isLoaded()) return; SharedBuffer* imageBuffer = cachedImage->image()->data(); if (!imageBuffer || !imageBuffer->size()) return; HGLOBAL imageFileDescriptor = createGlobalImageFileDescriptor(url.string(), element->getAttribute(altAttr), cachedImage); if (!imageFileDescriptor) return; HGLOBAL imageFileContent = createGlobalImageFileContent(imageBuffer); if (!imageFileContent) { GlobalFree(imageFileDescriptor); return; } String fileName = cachedImage->response().suggestedFilename(); HGLOBAL hDropContent = createGlobalHDropContent(url, fileName, imageBuffer); if (!hDropContent) { GlobalFree(hDropContent); return; } writeFileToDataObject(dataObject, imageFileDescriptor, imageFileContent, hDropContent);}void ClipboardWin::declareAndWriteDragImage(Element* element, const KURL& url, const String& title, Frame* frame){ // Order is important here for Explorer's sake if (!m_writableDataObject) return; WebCore::writeURL(m_writableDataObject.get(), url, title, true, false); writeImageToDataObject(m_writableDataObject.get(), element, url); AtomicString imageURL = element->getAttribute(srcAttr); if (imageURL.isEmpty()) return; String fullURL = frame->document()->completeURL(parseURL(imageURL)).string(); if (fullURL.isEmpty()) return; STGMEDIUM medium = {0}; medium.tymed = TYMED_HGLOBAL; ExceptionCode ec = 0; // Put img tag on the clipboard referencing the image Vector<char> data; markupToCF_HTML(imageToMarkup(fullURL), "", data); medium.hGlobal = createGlobalData(data); if (medium.hGlobal && FAILED(m_writableDataObject->SetData(htmlFormat(), &medium, TRUE))) ::GlobalFree(medium.hGlobal);}void ClipboardWin::writeURL(const KURL& kurl, const String& titleStr, Frame*){ if (!m_writableDataObject) return; WebCore::writeURL(m_writableDataObject.get(), kurl, titleStr, true, true); int estimatedSize = 0; String url = kurl.string(); HGLOBAL urlFileDescriptor = createGlobalUrlFileDescriptor(url, titleStr, estimatedSize); if (!urlFileDescriptor) return; HGLOBAL urlFileContent = createGlobalURLContent(url, estimatedSize); if (!urlFileContent) { GlobalFree(urlFileDescriptor); return; } writeFileToDataObject(m_writableDataObject.get(), urlFileDescriptor, urlFileContent, 0);}void ClipboardWin::writeRange(Range* selectedRange, Frame* frame){ ASSERT(selectedRange); if (!m_writableDataObject) return; STGMEDIUM medium = {0}; medium.tymed = TYMED_HGLOBAL; ExceptionCode ec = 0; Vector<char> data; markupToCF_HTML(createMarkup(selectedRange, 0, AnnotateForInterchange), selectedRange->startContainer(ec)->document()->url().string(), data); medium.hGlobal = createGlobalData(data); if (medium.hGlobal && FAILED(m_writableDataObject->SetData(htmlFormat(), &medium, TRUE))) ::GlobalFree(medium.hGlobal); String str = frame->selectedText(); replaceNewlinesWithWindowsStyleNewlines(str); replaceNBSPWithSpace(str); medium.hGlobal = createGlobalData(str); if (medium.hGlobal && FAILED(m_writableDataObject->SetData(plainTextWFormat(), &medium, TRUE))) ::GlobalFree(medium.hGlobal); medium.hGlobal = 0; if (frame->editor()->canSmartCopyOrDelete()) m_writableDataObject->SetData(smartPasteFormat(), &medium, TRUE);}bool ClipboardWin::hasData(){ if (!m_dataObject) return false; COMPtr<IEnumFORMATETC> itr; if (FAILED(m_dataObject->EnumFormatEtc(0, &itr))) return false; if (!itr) return false; FORMATETC data; if (SUCCEEDED(itr->Next(1, &data, 0))) { // There is at least one item in the IDataObject return true; } return false;}} // namespace WebCore
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -