/* * Copyright (C) 2001 Peter Kelly (pmk@post.com) * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de) * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) * Copyright (C) 2003-2020 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #pragma once #include "CachedResourceHandle.h" #include "DragActions.h" #include "DragImage.h" #include namespace WebCore { class CachedImage; class DataTransferItemList; class Document; class DragData; class DragImageLoader; class Element; class FileList; class File; class Pasteboard; class ScriptExecutionContext; enum class WebContentReadingPolicy : bool; class DataTransfer : public RefCounted { public: // https://html.spec.whatwg.org/multipage/dnd.html#drag-data-store-mode enum class StoreMode { Invalid, ReadWrite, Readonly, Protected }; static Ref create(); static Ref createForCopyAndPaste(const Document&, StoreMode, std::unique_ptr&&); static Ref createForInputEvent(const String& plainText, const String& htmlText); WEBCORE_EXPORT ~DataTransfer(); String dropEffect() const; void setDropEffect(const String&); String effectAllowed() const; void setEffectAllowed(const String&); DataTransferItemList& items(Document&); Vector types() const; Vector typesForItemList() const; FileList& files(Document*) const; FileList& files(Document&) const; void clearData(const String& type = String()); String getData(Document&, const String& type) const; String getDataForItem(Document&, const String& type) const; void setData(const String& type, const String& data); void setDataFromItemList(const String& type, const String& data); void setDragImage(Element&, int x, int y); void makeInvalidForSecurity() { m_storeMode = StoreMode::Invalid; } bool canReadTypes() const; bool canReadData() const; bool canWriteData() const; bool hasFileOfType(const String&); bool hasStringOfType(const String&); Pasteboard& pasteboard() { return *m_pasteboard; } void commitToPasteboard(Pasteboard&); #if ENABLE(DRAG_SUPPORT) static Ref createForDrag(const Document&); static Ref createForDragStartEvent(const Document&); static Ref createForDrop(const Document&, std::unique_ptr&&, OptionSet, bool draggingFiles); static Ref createForUpdatingDropTarget(const Document&, std::unique_ptr&&, OptionSet, bool draggingFiles); bool dropEffectIsUninitialized() const { return m_dropEffect == "uninitialized"; } OptionSet sourceOperationMask() const; OptionSet destinationOperationMask() const; void setSourceOperationMask(OptionSet); void setDestinationOperationMask(OptionSet); void setDragHasStarted() { m_shouldUpdateDragImage = true; } DragImageRef createDragImage(IntPoint& dragLocation) const; void updateDragImage(); RefPtr dragImageElement() const; void moveDragState(Ref&&); bool hasDragImage() const; #endif void didAddFileToItemList(); void updateFileList(ScriptExecutionContext*); private: enum class Type { CopyAndPaste, DragAndDropData, DragAndDropFiles, InputEvent }; DataTransfer(StoreMode, std::unique_ptr, Type = Type::CopyAndPaste, String&& effectAllowed = "uninitialized"_s); #if ENABLE(DRAG_SUPPORT) bool forDrag() const { return m_type == Type::DragAndDropData || m_type == Type::DragAndDropFiles; } bool forFileDrag() const { return m_type == Type::DragAndDropFiles; } #else bool forDrag() const { return false; } bool forFileDrag() const { return false; } #endif String readStringFromPasteboard(Document&, const String& lowercaseType, WebContentReadingPolicy) const; bool shouldSuppressGetAndSetDataToAvoidExposingFilePaths() const; enum class AddFilesType { No, Yes }; Vector types(AddFilesType) const; Vector> filesFromPasteboardAndItemList(ScriptExecutionContext*) const; String m_originIdentifier; StoreMode m_storeMode; std::unique_ptr m_pasteboard; std::unique_ptr m_itemList; mutable RefPtr m_fileList; #if ENABLE(DRAG_SUPPORT) Type m_type; String m_dropEffect; String m_effectAllowed; bool m_shouldUpdateDragImage; IntPoint m_dragLocation; CachedResourceHandle m_dragImage; RefPtr m_dragImageElement; std::unique_ptr m_dragImageLoader; #endif }; } // namespace WebCore