This patch implements the Clipboard custom format support at Web API level. Platform related implementation will be in P2, P3 and P4. It includes following modifications 1. Introduce kWebCustomFormatPrefix and kWebCustomFormatMapType in nsITransferable.idl to support custom format. kWebCustomFormatPrefix is a string used to identify and filter the custom format. kWebCustomFormatMapType is a type string in Gecko to represent the web custom format map type. 2. Introduce static method ClipboardItem::ParseMimeType() to validate if the passed-in string is a valid mime type or a valid custom format Notice that a valid mime type might not be a ClipboardItem supported type. Such as application/text is a valid type but not supported type. See https://www.w3.org/TR/clipboard-apis/#dom-clipboarditem-supports. 3. Update ClipboardItem implementation to support custom format. Adding mime type checking in ClipboardItem::Constructor, and throw TypeError once the mime type is not valid. Adding custom format count ClipboardItem::mCustomFormatCount for the maximum custom format number checking for clipboard.write(). 4. Update Clipboard(dom/events/Clipboard.h/.cpp) implementation to support custom format read/write Remove IsValidType() in Clipboard.cpp which is covered by ClipboardItem::ParseMimeType and done in ClipboardItem::Constructor() Update the DataTransfer implementation to support custom format. Update ClipboardGetCallbackForRead::OnSuccess() to support custom format can be saved in nsITransferable. 5. Update nsBaseClipboard implementation to support custom format read/write For custom format write(), directly passing the type string and data to SetNativeClipboardData(). The underlying nsIClipboard implementation will handle the type string conversion and custom format map construction according to the platform. This part will be done in P2, P3, and P4. For custom format read(), also directly passing the type string to underlying nsIClipboard implementation. The underlying nsIClipboard implementation will handle the type string conversion and get the data from system clipboard. This part will be done in P2, P3, and P4. Differential Revision: https://phabricator.services.mozilla.com/D271554
230 lines
8.6 KiB
Plaintext
230 lines
8.6 KiB
Plaintext
/*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "nsIArray.idl"
|
|
#include "nsISupports.idl"
|
|
#include "nsIFormatConverter.idl"
|
|
#include "nsIContentPolicy.idl"
|
|
|
|
interface nsICookieJarSettings;
|
|
interface nsIPrincipal;
|
|
interface nsIReferrerInfo;
|
|
|
|
%{ C++
|
|
|
|
// Internal formats must have their second part starting with 'x-moz-',
|
|
// for example text/x-moz-internaltype. These cannot be assigned by
|
|
// unprivileged content but all other types can.
|
|
#define kInternal_Mimetype_Prefix u"/x-moz-"_ns
|
|
|
|
// these probably shouldn't live here, but in some central repository shared
|
|
// by the entire app.
|
|
#define kTextMime "text/plain"
|
|
#define kRTFMime "text/rtf"
|
|
#define kMozTextInternal "text/x-moz-text-internal" // text data which isn't suppoed to be parsed by other apps.
|
|
#define kHTMLMime "text/html"
|
|
#define kPNGImageMime "image/png"
|
|
#define kJPEGImageMime "image/jpeg"
|
|
#define kJPGImageMime "image/jpg"
|
|
#define kGIFImageMime "image/gif"
|
|
#define kSVGImageMime "image/svg+xml"
|
|
#define kFileMime "application/x-moz-file"
|
|
|
|
#define kURLMime "text/x-moz-url" // data contains url\ntitle
|
|
#define kURLDataMime "text/x-moz-url-data" // data contains url only
|
|
#define kURLDescriptionMime "text/x-moz-url-desc" // data contains description
|
|
#define kURLPrivateMime "text/x-moz-url-priv" // same as kURLDataMime but for private uses
|
|
#define kNativeImageMime "application/x-moz-nativeimage"
|
|
#define kNativeHTMLMime "application/x-moz-nativehtml"
|
|
|
|
// These are used to indicate the context for a fragment of HTML source, such
|
|
// that some parent structure and style can be preserved. kHTMLContext
|
|
// contains the serialized ancestor elements, whereas kHTMLInfo are numbers
|
|
// identifying where in the context the fragment was from.
|
|
#define kHTMLContext "text/_moz_htmlcontext"
|
|
#define kHTMLInfo "text/_moz_htmlinfo"
|
|
|
|
// Holds the MIME type from the image request. This is used to ensure the
|
|
// local application handler for the request's MIME type accepts images with
|
|
// the given filename extension (from kFilePromiseDestFilename). When the
|
|
// image is dragged out, we replace the extension with a compatible extension.
|
|
#define kImageRequestMime "text/x-moz-requestmime"
|
|
|
|
// the source URL for a file promise
|
|
#define kFilePromiseURLMime "application/x-moz-file-promise-url"
|
|
// the destination filename for a file promise
|
|
#define kFilePromiseDestFilename "application/x-moz-file-promise-dest-filename"
|
|
// a dataless flavor used to interact with the OS during file drags
|
|
#define kFilePromiseMime "application/x-moz-file-promise"
|
|
// a synthetic flavor, put into the transferable once we know the destination directory of a file drag
|
|
#define kFilePromiseDirectoryMime "application/x-moz-file-promise-dir"
|
|
|
|
#define kCustomTypesMime "application/x-moz-custom-clipdata"
|
|
|
|
#define kPDFJSMime "application/pdfjs"
|
|
|
|
// The web custom format prefix
|
|
#define kWebCustomFormatPrefix "web "
|
|
|
|
// The web custom format map type
|
|
// This is used to query the web custom format map from clipboard.
|
|
#define kWebCustomFormatMapType "application/x-moz-web-custom-format-map"
|
|
%}
|
|
|
|
|
|
/**
|
|
* nsIFlavorDataProvider allows a flavor to 'promise' data later,
|
|
* supplying the data lazily.
|
|
*
|
|
* To use it, call setTransferData, passing the flavor string and
|
|
* a nsIFlavorDataProvider QI'd to nsISupports.
|
|
*
|
|
* When someone calls getTransferData later, if the data size is
|
|
* stored as 0, the nsISupports will be QI'd to nsIFlavorDataProvider,
|
|
* and its getFlavorData called.
|
|
*
|
|
*/
|
|
interface nsITransferable;
|
|
interface nsILoadContext;
|
|
|
|
[scriptable, uuid(7E225E5F-711C-11D7-9FAE-000393636592)]
|
|
interface nsIFlavorDataProvider : nsISupports
|
|
{
|
|
|
|
/**
|
|
* Retrieve the data from this data provider.
|
|
*
|
|
* @param aTransferable (in parameter) the transferable we're being called for.
|
|
* @param aFlavor (in parameter) the flavor of data to retrieve
|
|
* @param aData the data. Some variant of class in nsISupportsPrimitives.idl
|
|
*/
|
|
void getFlavorData(in nsITransferable aTransferable, in string aFlavor, out nsISupports aData);
|
|
};
|
|
|
|
|
|
[scriptable, builtinclass, uuid(97e0c418-1c1e-4106-bad1-9fcb11dff2fe)]
|
|
interface nsITransferable : nsISupports
|
|
{
|
|
/**
|
|
* Initializes a transferable object. This should be called on all
|
|
* transferable objects. Failure to do so will result in fatal assertions in
|
|
* debug builds.
|
|
*
|
|
* The load context is used to track whether the transferable is storing privacy-
|
|
* sensitive information.
|
|
*
|
|
* To get the appropriate load context in Javascript callers, one needs to get
|
|
* to the document that the transferable corresponds to, and then get the load
|
|
* context from the document like this:
|
|
*
|
|
* var loadContext = doc.defaultView.docShell
|
|
* .QueryInterface(Ci.nsILoadContext);
|
|
*
|
|
* In C++ callers, if you have the corresponding document, you can just call
|
|
* Document::GetLoadContext to get to the load context object.
|
|
*
|
|
* @param aContext the load context associated with the transferable object.
|
|
* This can be set to null if a load context is not available.
|
|
*/
|
|
void init(in nsILoadContext aContext);
|
|
|
|
/**
|
|
* Computes a list of flavors that the transferable can export, either
|
|
* through intrinsic knowledge or output data converters.
|
|
*/
|
|
Array<ACString> flavorsTransferableCanExport();
|
|
|
|
/**
|
|
* Given a flavor retrieve the data.
|
|
*
|
|
* @param aFlavor (in parameter) the flavor of data to retrieve
|
|
* @param aData the data. Some variant of class in nsISupportsPrimitives.idl
|
|
*/
|
|
[must_use] void getTransferData(in string aFlavor, out nsISupports aData);
|
|
|
|
/**
|
|
* Returns the first flavor which has data.
|
|
*
|
|
* @param aFlavor (out parameter) the flavor of data that was retrieved
|
|
* @param aData the data. Some variant of class in nsISupportsPrimitives.idl
|
|
*/
|
|
void getAnyTransferData(out ACString aFlavor, out nsISupports aData);
|
|
|
|
///////////////////////////////
|
|
// Setter part of interface
|
|
///////////////////////////////
|
|
|
|
/**
|
|
* Computes a list of flavors that the transferable can
|
|
* accept into it, either through intrinsic knowledge or input data converters.
|
|
*
|
|
*/
|
|
Array<ACString> flavorsTransferableCanImport();
|
|
|
|
/**
|
|
* Sets the data in the transferable with the specified flavor. The transferable
|
|
* will maintain its own copy the data, so it is not necessary to do that beforehand.
|
|
*
|
|
* @param aFlavor the flavor of data that is being set
|
|
* @param aData the data, either some variant of class in nsISupportsPrimitives.idl,
|
|
* an nsIFile, or an nsIFlavorDataProvider (see above)
|
|
*/
|
|
void setTransferData(in string aFlavor, in nsISupports aData);
|
|
|
|
/**
|
|
* Removes the data from all flavors.
|
|
*/
|
|
void clearAllData();
|
|
|
|
/**
|
|
* Add the data flavor, indicating that this transferable
|
|
* can receive this type of flavor
|
|
*
|
|
* @param aDataFlavor a new data flavor to handle
|
|
*/
|
|
void addDataFlavor ( in string aDataFlavor ) ;
|
|
|
|
/**
|
|
* Removes the data flavor matching the given one (string compare) and the data
|
|
* that goes along with it.
|
|
*
|
|
* @param aDataFlavor a data flavor to remove
|
|
*/
|
|
void removeDataFlavor ( in string aDataFlavor ) ;
|
|
|
|
attribute nsIFormatConverter converter;
|
|
|
|
/**
|
|
* Use of the SetIsPrivateData() method generated by isPrivateData attribute should
|
|
* be avoided as much as possible because the value set may not reflect the status
|
|
* of the context in which the transferable was created.
|
|
*/
|
|
[notxpcom, nostdcall] attribute boolean isPrivateData;
|
|
|
|
/**
|
|
* The principal associated with this transferable. This could be either the
|
|
* node principal of the source DOM node from which this transferable was
|
|
* created, or the principal of the global from which this transferable was
|
|
* created.
|
|
*/
|
|
[notxpcom, nostdcall] attribute nsIPrincipal dataPrincipal;
|
|
|
|
/**
|
|
* the contentPolicyType for this transferable.
|
|
*/
|
|
[notxpcom, nostdcall] attribute nsContentPolicyType contentPolicyType;
|
|
|
|
/**
|
|
* The cookieJarSettings of the source dom node this transferable was created
|
|
* from.
|
|
*/
|
|
[notxpcom, nostdcall] attribute nsICookieJarSettings cookieJarSettings;
|
|
|
|
/**
|
|
* Used for initializing the referrer when downloading a file promise.
|
|
*/
|
|
[notxpcom, nostdcall] attribute nsIReferrerInfo referrerInfo;
|
|
};
|