Bug 1816740 [5/6] - convert nsIFilePicker::capture* to a proper enum r=ipc-reviewers,karlt,mstange,handyman,nika

Convert the various capture* constants in nsIFilePicker into a proper
enum, and perform validation when passing it across IPC.

Additionally, unlike the previous two enums, reduce the size of
CaptureTarget to 8 bits. This is a workaround for its use with
nsAttrValue, which at present very specifically requires that parseable
enums' values fit within an `int16_t` -- and a `uint16_t` does not.

Differential Revision: https://phabricator.services.mozilla.com/D169854
This commit is contained in:
Ray Kraesig 2023-02-22 21:05:24 +00:00
parent fa4832237d
commit 7b51dc72b7
10 changed files with 43 additions and 23 deletions

View file

@ -181,10 +181,10 @@ static const nsAttrValue::EnumTable* kInputDefaultType =
&kInputTypeTable[ArrayLength(kInputTypeTable) - 2]; &kInputTypeTable[ArrayLength(kInputTypeTable) - 2];
static const nsAttrValue::EnumTable kCaptureTable[] = { static const nsAttrValue::EnumTable kCaptureTable[] = {
{"user", static_cast<int16_t>(nsIFilePicker::captureUser)}, {"user", nsIFilePicker::captureUser},
{"environment", static_cast<int16_t>(nsIFilePicker::captureEnv)}, {"environment", nsIFilePicker::captureEnv},
{"", static_cast<int16_t>(nsIFilePicker::captureDefault)}, {"", nsIFilePicker::captureDefault},
{nullptr, static_cast<int16_t>(nsIFilePicker::captureNone)}}; {nullptr, nsIFilePicker::captureNone}};
static const nsAttrValue::EnumTable* kCaptureDefault = &kCaptureTable[2]; static const nsAttrValue::EnumTable* kCaptureDefault = &kCaptureTable[2];
@ -831,7 +831,8 @@ nsresult HTMLInputElement::InitFilePicker(FilePickerType aType) {
const nsAttrValue* captureVal = const nsAttrValue* captureVal =
GetParsedAttr(nsGkAtoms::capture, kNameSpaceID_None); GetParsedAttr(nsGkAtoms::capture, kNameSpaceID_None);
if (captureVal) { if (captureVal) {
filePicker->SetCapture(captureVal->GetEnumValue()); filePicker->SetCapture(static_cast<nsIFilePicker::CaptureTarget>(
captureVal->GetEnumValue()));
} }
} }
} else { } else {

View file

@ -17,6 +17,13 @@ struct ParamTraits<nsIFilePicker::Mode>
nsIFilePicker::Mode, nsIFilePicker::Mode::modeOpen, nsIFilePicker::Mode, nsIFilePicker::Mode::modeOpen,
nsIFilePicker::Mode::modeGetFolder> {}; nsIFilePicker::Mode::modeGetFolder> {};
template <>
struct ParamTraits<nsIFilePicker::CaptureTarget>
: public ContiguousEnumSerializerInclusive<
nsIFilePicker::CaptureTarget,
nsIFilePicker::CaptureTarget::captureNone,
nsIFilePicker::CaptureTarget::captureEnv> {};
template <> template <>
struct ParamTraits<nsIFilePicker::ResultCode> struct ParamTraits<nsIFilePicker::ResultCode>
: public ContiguousEnumSerializerInclusive< : public ContiguousEnumSerializerInclusive<

View file

@ -242,7 +242,7 @@ mozilla::ipc::IPCResult FilePickerParent::RecvOpen(
nsTArray<nsString>&& aFilters, nsTArray<nsString>&& aFilterNames, nsTArray<nsString>&& aFilters, nsTArray<nsString>&& aFilterNames,
nsTArray<nsString>&& aRawFilters, const nsString& aDisplayDirectory, nsTArray<nsString>&& aRawFilters, const nsString& aDisplayDirectory,
const nsString& aDisplaySpecialDirectory, const nsString& aOkButtonLabel, const nsString& aDisplaySpecialDirectory, const nsString& aOkButtonLabel,
const int16_t& aCapture) { const nsIFilePicker::CaptureTarget& aCapture) {
if (!CreateFilePicker()) { if (!CreateFilePicker()) {
Unused << Send__delete__(this, void_t(), nsIFilePicker::returnCancel); Unused << Send__delete__(this, void_t(), nsIFilePicker::returnCancel);
return IPC_OK(); return IPC_OK();

View file

@ -42,7 +42,7 @@ class FilePickerParent : public PFilePickerParent {
nsTArray<nsString>&& aFilters, nsTArray<nsString>&& aFilterNames, nsTArray<nsString>&& aFilters, nsTArray<nsString>&& aFilterNames,
nsTArray<nsString>&& aRawFilters, const nsString& aDisplayDirectory, nsTArray<nsString>&& aRawFilters, const nsString& aDisplayDirectory,
const nsString& aDisplaySpecialDirectory, const nsString& aOkButtonLabel, const nsString& aDisplaySpecialDirectory, const nsString& aOkButtonLabel,
const int16_t& aCapture); const nsIFilePicker::CaptureTarget& aCapture);
virtual void ActorDestroy(ActorDestroyReason aWhy) override; virtual void ActorDestroy(ActorDestroyReason aWhy) override;

View file

@ -11,6 +11,7 @@ include IPCBlob;
include "mozilla/dom/FilePickerMessageUtils.h"; include "mozilla/dom/FilePickerMessageUtils.h";
using struct mozilla::void_t from "mozilla/ipc/IPCCore.h"; using struct mozilla::void_t from "mozilla/ipc/IPCCore.h";
using nsIFilePicker::CaptureTarget from "nsIFilePicker.h";
using nsIFilePicker::ResultCode from "nsIFilePicker.h"; using nsIFilePicker::ResultCode from "nsIFilePicker.h";
namespace mozilla { namespace mozilla {
@ -43,7 +44,7 @@ parent:
nsString defaultExtension, nsString[] filters, nsString[] filterNames, nsString defaultExtension, nsString[] filters, nsString[] filterNames,
nsString[] rawFilters, nsString displayDirectory, nsString[] rawFilters, nsString displayDirectory,
nsString displaySpecialDirectory, nsString okButtonLabel, nsString displaySpecialDirectory, nsString okButtonLabel,
int16_t capture); CaptureTarget capture);
child: child:
async __delete__(MaybeInputData data, ResultCode result); async __delete__(MaybeInputData data, ResultCode result);

View file

@ -245,12 +245,16 @@ NS_IMETHODIMP nsBaseFilePicker::AppendRawFilter(const nsAString& aFilter) {
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP nsBaseFilePicker::GetCapture(int16_t* aCapture) { NS_IMETHODIMP nsBaseFilePicker::GetCapture(
*aCapture = 0; nsIFilePicker::CaptureTarget* aCapture) {
*aCapture = nsIFilePicker::CaptureTarget::captureNone;
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP nsBaseFilePicker::SetCapture(int16_t aCapture) { return NS_OK; } NS_IMETHODIMP nsBaseFilePicker::SetCapture(
nsIFilePicker::CaptureTarget aCapture) {
return NS_OK;
}
// Set the filter index // Set the filter index
NS_IMETHODIMP nsBaseFilePicker::GetFilterIndex(int32_t* aFilterIndex) { NS_IMETHODIMP nsBaseFilePicker::GetFilterIndex(int32_t* aFilterIndex) {

View file

@ -31,8 +31,8 @@ class nsBaseFilePicker : public nsIFilePicker {
NS_IMETHOD Open(nsIFilePickerShownCallback* aCallback) override; NS_IMETHOD Open(nsIFilePickerShownCallback* aCallback) override;
NS_IMETHOD AppendFilters(int32_t filterMask) override; NS_IMETHOD AppendFilters(int32_t filterMask) override;
NS_IMETHOD AppendRawFilter(const nsAString& aFilter) override; NS_IMETHOD AppendRawFilter(const nsAString& aFilter) override;
NS_IMETHOD GetCapture(int16_t* aCapture) override; NS_IMETHOD GetCapture(nsIFilePicker::CaptureTarget* aCapture) override;
NS_IMETHOD SetCapture(int16_t aCapture) override; NS_IMETHOD SetCapture(nsIFilePicker::CaptureTarget aCapture) override;
NS_IMETHOD GetFilterIndex(int32_t* aFilterIndex) override; NS_IMETHOD GetFilterIndex(int32_t* aFilterIndex) override;
NS_IMETHOD SetFilterIndex(int32_t aFilterIndex) override; NS_IMETHOD SetFilterIndex(int32_t aFilterIndex) override;
NS_IMETHOD GetFiles(nsISimpleEnumerator** aFiles) override; NS_IMETHOD GetFiles(nsISimpleEnumerator** aFiles) override;

View file

@ -54,13 +54,13 @@ nsFilePickerProxy::AppendFilter(const nsAString& aTitle,
} }
NS_IMETHODIMP NS_IMETHODIMP
nsFilePickerProxy::GetCapture(int16_t* aCapture) { nsFilePickerProxy::GetCapture(nsIFilePicker::CaptureTarget* aCapture) {
*aCapture = mCapture; *aCapture = mCapture;
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsFilePickerProxy::SetCapture(int16_t aCapture) { nsFilePickerProxy::SetCapture(nsIFilePicker::CaptureTarget aCapture) {
mCapture = aCapture; mCapture = aCapture;
return NS_OK; return NS_OK;
} }

View file

@ -37,8 +37,8 @@ class nsFilePickerProxy : public nsBaseFilePicker,
nsIFilePicker::Mode aMode) override; nsIFilePicker::Mode aMode) override;
NS_IMETHOD AppendFilter(const nsAString& aTitle, NS_IMETHOD AppendFilter(const nsAString& aTitle,
const nsAString& aFilter) override; const nsAString& aFilter) override;
NS_IMETHOD GetCapture(int16_t* aCapture) override; NS_IMETHOD GetCapture(nsIFilePicker::CaptureTarget* aCapture) override;
NS_IMETHOD SetCapture(int16_t aCapture) override; NS_IMETHOD SetCapture(nsIFilePicker::CaptureTarget aCapture) override;
NS_IMETHOD GetDefaultString(nsAString& aDefaultString) override; NS_IMETHOD GetDefaultString(nsAString& aDefaultString) override;
NS_IMETHOD SetDefaultString(const nsAString& aDefaultString) override; NS_IMETHOD SetDefaultString(const nsAString& aDefaultString) override;
NS_IMETHOD GetDefaultExtension(nsAString& aDefaultExtension) override; NS_IMETHOD GetDefaultExtension(nsAString& aDefaultExtension) override;
@ -74,7 +74,7 @@ class nsFilePickerProxy : public nsBaseFilePicker,
nsString mFile; nsString mFile;
nsString mDefault; nsString mDefault;
nsString mDefaultExtension; nsString mDefaultExtension;
int16_t mCapture; nsIFilePicker::CaptureTarget mCapture;
bool mIPCActive; bool mIPCActive;

View file

@ -53,10 +53,12 @@ interface nsIFilePicker : nsISupports
// *.rm; *.rmvb; *.smil; *.webm; // *.rm; *.rmvb; *.smil; *.webm;
// *.wmv; *.xvid // *.wmv; *.xvid
const short captureNone = 0; // No capture target specified. cenum CaptureTarget: 8 {
const short captureDefault = 1; // Missing/invalid value default. captureNone = 0, // No capture target specified.
const short captureUser = 2; // "user" capture target specified. captureDefault = 1, // Missing/invalid value default.
const short captureEnv = 3; // "environment" capture target specified. captureUser = 2, // "user" capture target specified.
captureEnv = 3, // "environment" capture target specified.
};
/** /**
* Initialize the file picker widget. The file picker is not valid until this * Initialize the file picker widget. The file picker is not valid until this
@ -206,7 +208,12 @@ interface nsIFilePicker : nsISupports
*/ */
attribute AString okButtonLabel; attribute AString okButtonLabel;
attribute short capture; /**
* Implementation of HTMLInputElement's `capture` property.
*
* Not used by Firefox Desktop.
*/
attribute nsIFilePicker_CaptureTarget capture;
}; };
[scriptable, function, uuid(0d79adad-b244-49A5-9997-2a8cad93fc44)] [scriptable, function, uuid(0d79adad-b244-49A5-9997-2a8cad93fc44)]