⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clipboardwin.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -