mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-27 06:43:32 +00:00
8a1d360c1a
The Async Clipboard API now allows using arbitrary promises for passing write data, potentially enabling websites to delay writing data to an arbitrary future, which may surprise the user. This patch introduces a solution: a new write request will automatically cancel any previous pending request. To implement that, this patch introduces a new method to nsIClipboard, new XPCOM interfaces, and new IPC to efficiently track individual write requests. Additionally, a new helper base class, ClipboardSetDataHelper, is introduced in widget to facilitate platform code sharing. Differential Revision: https://phabricator.services.mozilla.com/D174090
172 lines
6.5 KiB
Plaintext
172 lines
6.5 KiB
Plaintext
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* 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 "nsISupports.idl"
|
|
#include "nsITransferable.idl"
|
|
#include "nsIClipboardOwner.idl"
|
|
|
|
%{C++
|
|
#include "mozilla/MozPromise.h"
|
|
|
|
using DataFlavorsPromise = mozilla::MozPromise<nsTArray<nsCString>, nsresult, true>;
|
|
%}
|
|
|
|
interface nsIArray;
|
|
|
|
native AsyncGetDataPromise(RefPtr<mozilla::GenericPromise>);
|
|
native AsyncDataFlavorsPromise(RefPtr<DataFlavorsPromise>);
|
|
|
|
[scriptable, builtinclass, uuid(801e2318-c8fa-11ed-afa1-0242ac120002)]
|
|
interface nsIAsyncSetClipboardData : nsISupports {
|
|
/**
|
|
* Provide the data for the set request.
|
|
*
|
|
* @param aTransferable
|
|
* The transferable contains the data to be written.
|
|
* @param aOwner [optional]
|
|
* The owner of the transferable.
|
|
*/
|
|
void setData(in nsITransferable aTransferable, [optional] in nsIClipboardOwner aOwner);
|
|
|
|
/**
|
|
* Abort the request to set data.
|
|
*
|
|
* @param aReason
|
|
* The reason for the abort, can not be NS_OK.
|
|
*/
|
|
void abort(in nsresult aReason);
|
|
};
|
|
|
|
[scriptable, uuid(78f7c18e-c8fa-11ed-afa1-0242ac120002)]
|
|
interface nsIAsyncSetClipboardDataCallback : nsISupports
|
|
{
|
|
/**
|
|
* Indicates that the clipboard asyncSetData request has either succeeded or
|
|
* been canceled.
|
|
*
|
|
* @param aResult
|
|
* The result of the request. NS_OK if successful, or another value
|
|
* that indicates the reason for failure or cancellation.
|
|
*/
|
|
void onComplete(in nsresult aResult);
|
|
};
|
|
|
|
[scriptable, builtinclass, uuid(ceaa0047-647f-4b8e-ad1c-aff9fa62aa51)]
|
|
interface nsIClipboard : nsISupports
|
|
{
|
|
const long kSelectionClipboard = 0;
|
|
const long kGlobalClipboard = 1;
|
|
const long kFindClipboard = 2;
|
|
// Used to cache current selection on (nsClipboard) for macOS service menu.
|
|
const long kSelectionCache = 3;
|
|
|
|
%{ C++
|
|
static const uint32_t kClipboardTypeCount = kSelectionCache + 1;
|
|
%}
|
|
|
|
/**
|
|
* Given a transferable, set the data on the native clipboard
|
|
*
|
|
* @param aTransferable The transferable
|
|
* @param anOwner The owner of the transferable
|
|
* @param aWhichClipboard Specifies the clipboard to which this operation applies.
|
|
* @result NS_Ok if no errors
|
|
*/
|
|
|
|
void setData ( in nsITransferable aTransferable, in nsIClipboardOwner anOwner,
|
|
in long aWhichClipboard ) ;
|
|
|
|
/**
|
|
* Requests setting data to the native clipboard. The acutal set occur
|
|
* when the data is provided by calling nsIAsyncSetClipboardData::setData().
|
|
* The result will be notified by nsIClipboardCallback. A new set request
|
|
* will cancel any prior pending requests, if any exist.
|
|
*
|
|
* @param aWhichClipboard
|
|
* Specifies the clipboard to which this operation applies.
|
|
* @param aCallback [optional]
|
|
* The callback object that will be notified upon completion.
|
|
* @return nsIAsyncSetClipboardData
|
|
* The write request object. The actual write will occur when the
|
|
* data is provided by calling nsIAsyncSetClipboardData::setData().
|
|
*/
|
|
nsIAsyncSetClipboardData asyncSetData(in long aWhichClipboard,
|
|
[optional] in nsIAsyncSetClipboardDataCallback aCallback);
|
|
|
|
/**
|
|
* Filters the flavors aTransferable can import (see
|
|
* `nsITransferable::flavorsTransferableCanImport`) and gets the data for the
|
|
* first flavor. That data is set for aTransferable.
|
|
*
|
|
* @param aTransferable The transferable
|
|
* @param aWhichClipboard Specifies the clipboard to which this operation applies.
|
|
* @result NS_OK if no errors
|
|
*/
|
|
|
|
void getData ( in nsITransferable aTransferable, in long aWhichClipboard ) ;
|
|
|
|
/**
|
|
* This empties the clipboard and notifies the clipboard owner.
|
|
* This empties the "logical" clipboard. It does not clear the native clipboard.
|
|
*
|
|
* @param aWhichClipboard Specifies the clipboard to which this operation applies.
|
|
* @result NS_OK if successful.
|
|
*/
|
|
|
|
void emptyClipboard ( in long aWhichClipboard ) ;
|
|
|
|
/**
|
|
* This provides a way to give correct UI feedback about, for instance, a paste
|
|
* should be allowed. It does _NOT_ actually retreive the data and should be a very
|
|
* inexpensive call. All it does is check if there is data on the clipboard matching
|
|
* any of the flavors in the given list.
|
|
*
|
|
* @param aFlavorList An array of ASCII strings.
|
|
* @param aWhichClipboard Specifies the clipboard to which this operation applies.
|
|
* @outResult - if data is present matching one of
|
|
* @result NS_OK if successful.
|
|
*/
|
|
boolean hasDataMatchingFlavors ( in Array<ACString> aFlavorList,
|
|
in long aWhichClipboard ) ;
|
|
|
|
/**
|
|
* Allows clients to determine if the implementation supports the concept of a
|
|
* separate clipboard.
|
|
*
|
|
* @param aWhichClipboard Specifies the clipboard to which this operation applies.
|
|
* @outResult true if the implementaion supports specific clipboard type.
|
|
* @result NS_OK if successful.
|
|
*/
|
|
[infallible]
|
|
boolean isClipboardTypeSupported(in long aWhichClipboard);
|
|
|
|
/**
|
|
* Filters the flavors aTransferable can import (see
|
|
* `nsITransferable::flavorsTransferableCanImport`) and gets the data for the
|
|
* first flavor. That data is set for aTransferable.
|
|
*
|
|
* @param aTransferable The transferable
|
|
* @param aWhichClipboard Specifies the clipboard to which this operation applies.
|
|
* @return MozPromise The returned promise will resolve when the data is ready or reject
|
|
* if any error occurs.
|
|
*/
|
|
[noscript, notxpcom, nostdcall]
|
|
AsyncGetDataPromise asyncGetData(in nsITransferable aTransferable, in long aWhichClipboard);
|
|
|
|
/**
|
|
* Check if there is data on the clipboard matching each of the flavors in the
|
|
* given list.
|
|
*
|
|
* @param aFlavorList An array of ASCII strings.
|
|
* @param aWhichClipboard Specifies the clipboard to which this operation applies.
|
|
* @return MozPromise The returned promise will resolve with the list of matched flavors
|
|
* when the check is completed or reject if any error occurs.
|
|
*/
|
|
[noscript, notxpcom, nostdcall]
|
|
AsyncDataFlavorsPromise asyncHasDataMatchingFlavors(in Array<ACString> aFlavorList, in long aWhichClipboard);
|
|
};
|