Backed out changeset 2450366cf7ca (bug 1891629) for causing win msix mochitest failures
[gecko.git] / widget / windows / nsClipboard.h
blobb0afb9ee40a0fdb52df2ed9f4ee395aadf7fc307
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef nsClipboard_h__
7 #define nsClipboard_h__
9 #include "nsBaseClipboard.h"
10 #include "nsIObserver.h"
11 #include "nsIURI.h"
13 #include <ole2.h>
14 #include <windows.h>
16 class nsITransferable;
17 class nsIWidget;
18 class nsIFile;
19 struct IDataObject;
21 /**
22 * Native Win32 Clipboard wrapper
25 class nsClipboard : public nsBaseClipboard, public nsIObserver {
26 virtual ~nsClipboard();
28 public:
29 nsClipboard();
31 NS_DECL_ISUPPORTS_INHERITED
33 // nsIObserver
34 NS_DECL_NSIOBSERVER
36 // Internal Native Routines
37 enum class MightNeedToFlush : bool { No, Yes };
38 static nsresult CreateNativeDataObject(nsITransferable* aTransferable,
39 IDataObject** aDataObj, nsIURI* aUri,
40 MightNeedToFlush* = nullptr);
41 static nsresult SetupNativeDataObject(nsITransferable* aTransferable,
42 IDataObject* aDataObj,
43 MightNeedToFlush* = nullptr);
44 static nsresult GetDataFromDataObject(IDataObject* aDataObject, UINT anIndex,
45 nsIWidget* aWindow,
46 nsITransferable* aTransferable);
47 static nsresult GetNativeDataOffClipboard(nsIWidget* aWindow, UINT aIndex,
48 UINT aFormat, void** aData,
49 uint32_t* aLen);
50 static nsresult GetNativeDataOffClipboard(IDataObject* aDataObject,
51 UINT aIndex, UINT aFormat,
52 const char* aMIMEImageFormat,
53 void** aData, uint32_t* aLen);
54 static nsresult GetGlobalData(HGLOBAL aHGBL, void** aData, uint32_t* aLen);
56 // This function returns the internal Windows clipboard format identifier
57 // for a given Mime string. The default is to map kHTMLMime ("text/html")
58 // to the clipboard format CF_HTML ("HTLM Format"), but it can also be
59 // registered as clipboard format "text/html" to support previous versions
60 // of Gecko.
61 static UINT GetFormat(const char* aMimeStr, bool aMapHTMLMime = true);
63 static UINT GetClipboardFileDescriptorFormatA();
64 static UINT GetClipboardFileDescriptorFormatW();
65 static UINT GetHtmlClipboardFormat();
66 static UINT GetCustomClipboardFormat();
68 protected:
69 // @param aDataObject must be non-nullptr.
70 static HRESULT FillSTGMedium(IDataObject* aDataObject, UINT aFormat,
71 LPFORMATETC pFE, LPSTGMEDIUM pSTM, DWORD aTymed);
73 // Implement the native clipboard behavior.
74 NS_IMETHOD SetNativeClipboardData(nsITransferable* aTransferable,
75 int32_t aWhichClipboard) override;
76 NS_IMETHOD GetNativeClipboardData(nsITransferable* aTransferable,
77 int32_t aWhichClipboard) override;
78 nsresult EmptyNativeClipboardData(int32_t aWhichClipboard) override;
79 mozilla::Result<int32_t, nsresult> GetNativeClipboardSequenceNumber(
80 int32_t aWhichClipboard) override;
81 mozilla::Result<bool, nsresult> HasNativeClipboardDataMatchingFlavors(
82 const nsTArray<nsCString>& aFlavorList, int32_t aWhichClipboard) override;
84 static bool IsInternetShortcut(const nsAString& inFileName);
85 static bool FindURLFromLocalFile(IDataObject* inDataObject, UINT inIndex,
86 void** outData, uint32_t* outDataLen);
87 static bool FindURLFromNativeURL(IDataObject* inDataObject, UINT inIndex,
88 void** outData, uint32_t* outDataLen);
89 static bool FindUnicodeFromPlainText(IDataObject* inDataObject, UINT inIndex,
90 void** outData, uint32_t* outDataLen);
91 static bool FindPlatformHTML(IDataObject* inDataObject, UINT inIndex,
92 void** outData, uint32_t* outStartOfData,
93 uint32_t* outDataLen);
95 static void ResolveShortcut(nsIFile* inFileName, nsACString& outURL);
96 static nsresult GetTempFilePath(const nsAString& aFileName,
97 nsAString& aFilePath);
98 static nsresult SaveStorageOrStream(IDataObject* aDataObject, UINT aIndex,
99 const nsAString& aFileName);
101 nsIWidget* mWindow;
104 #define SET_FORMATETC(fe, cf, td, asp, li, med) \
106 (fe).cfFormat = cf; \
107 (fe).ptd = td; \
108 (fe).dwAspect = asp; \
109 (fe).lindex = li; \
110 (fe).tymed = med; \
113 #endif // nsClipboard_h__