From 2dee0aae3c8406a70ac89ed866b1a4999d44fc43 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Sat, 18 Aug 2018 21:06:32 -0700 Subject: [PATCH] Bug 1484496: Part 4b - Add intrinsic type information to most nsSimpleEnumerators. r=froydnj This allows JS callers to automatically get the correct types during interation, without having to explicitly specify them. Differential Revision: https://phabricator.services.mozilla.com/D3728 --HG-- extra : rebase_source : b708f382d8ea571d199c669bfed5b5a7ca9ffac4 extra : histedit_source : 7df6feb82088c8a5ca45dc28fe4d2b852c177fee --- .../dirprovider/DirectoryProvider.cpp | 2 +- .../migration/nsIEHistoryEnumerator.h | 5 ++++ docshell/base/nsDocShellEnumerator.h | 2 ++ dom/base/nsJSEnvironment.cpp | 8 ++++- dom/commandhandler/nsCommandGroup.cpp | 10 +++++++ dom/payments/PaymentRequestService.cpp | 6 ++++ .../base/nsPluginDirServiceProvider.cpp | 2 +- dom/workers/WorkerDebuggerManager.cpp | 5 ++++ extensions/cookie/nsPermissionManager.cpp | 4 +-- intl/strres/nsStringBundle.cpp | 5 ++++ js/xpconnect/src/XPCShellImpl.cpp | 6 ++-- js/xpconnect/src/XPCWrappedJSClass.cpp | 2 +- netwerk/base/nsLoadGroup.cpp | 2 +- netwerk/cookie/nsCookieService.cpp | 8 ++--- security/manager/ssl/PKCS11ModuleDB.cpp | 2 +- security/manager/ssl/nsNSSCertificate.h | 2 ++ security/manager/ssl/nsPKCS11Slot.cpp | 2 +- .../manager/ssl/nsSiteSecurityService.cpp | 4 +-- toolkit/profile/nsToolkitProfileService.cpp | 5 ++++ toolkit/xre/nsXREDirProvider.cpp | 8 ++--- uriloader/exthandler/HandlerService.js | 2 +- uriloader/exthandler/win/nsMIMEInfoWin.cpp | 2 +- widget/gtk/nsFilePicker.cpp | 2 +- widget/nsBaseFilePicker.cpp | 4 ++- widget/windows/nsFilePicker.cpp | 2 +- xpcom/components/nsCategoryManager.cpp | 5 ++++ xpcom/ds/nsArray.cpp | 14 ++++++++- xpcom/ds/nsArrayEnumerator.cpp | 29 +++++++++++++------ xpcom/ds/nsArrayEnumerator.h | 8 +++-- xpcom/ds/nsHashPropertyBag.cpp | 3 +- xpcom/ds/nsIArray.idl | 17 +++++++++-- xpcom/ds/nsIArrayExtensions.idl | 2 +- xpcom/ds/nsIMutableArray.idl | 2 +- xpcom/ds/nsISimpleEnumerator.idl | 3 +- xpcom/ds/nsObserverList.h | 2 ++ xpcom/ds/nsPersistentProperties.cpp | 2 +- xpcom/ds/nsSimpleEnumerator.cpp | 2 +- xpcom/ds/nsSimpleEnumerator.h | 2 ++ xpcom/ds/nsStringEnumerator.cpp | 8 +++++ xpcom/io/nsAppFileLocationProvider.cpp | 2 ++ xpcom/io/nsLocalFileUnix.cpp | 2 ++ xpcom/io/nsLocalFileWin.cpp | 4 +++ xpfe/appshell/nsAppShellWindowEnumerator.h | 2 ++ 43 files changed, 163 insertions(+), 48 deletions(-) diff --git a/browser/components/dirprovider/DirectoryProvider.cpp b/browser/components/dirprovider/DirectoryProvider.cpp index 1925dd736d37..4dde0ef92ee1 100644 --- a/browser/components/dirprovider/DirectoryProvider.cpp +++ b/browser/components/dirprovider/DirectoryProvider.cpp @@ -140,7 +140,7 @@ DirectoryProvider::GetFiles(const char *aKey, nsISimpleEnumerator* *aResult) nsCOMArray distroFiles; AppendDistroSearchDirs(dirSvc, distroFiles); - return NS_NewArrayEnumerator(aResult, distroFiles); + return NS_NewArrayEnumerator(aResult, distroFiles, NS_GET_IID(nsIFile)); } return NS_ERROR_FAILURE; diff --git a/browser/components/migration/nsIEHistoryEnumerator.h b/browser/components/migration/nsIEHistoryEnumerator.h index f38e94433e53..2e28c816d978 100644 --- a/browser/components/migration/nsIEHistoryEnumerator.h +++ b/browser/components/migration/nsIEHistoryEnumerator.h @@ -19,6 +19,11 @@ public: nsIEHistoryEnumerator(); + const nsID& DefaultInterface() override + { + return NS_GET_IID(nsIWritablePropertyBag2); + } + private: ~nsIEHistoryEnumerator() override; diff --git a/docshell/base/nsDocShellEnumerator.h b/docshell/base/nsDocShellEnumerator.h index 75115b6af202..94f5db6aa05b 100644 --- a/docshell/base/nsDocShellEnumerator.h +++ b/docshell/base/nsDocShellEnumerator.h @@ -46,6 +46,8 @@ public: // nsISimpleEnumerator NS_DECL_NSISIMPLEENUMERATOR + const nsID& DefaultInterface() override { return NS_GET_IID(nsIDocShell); } + public: nsresult GetEnumerationRootItem(nsIDocShellTreeItem** aEnumerationRootItem); nsresult SetEnumerationRootItem(nsIDocShellTreeItem* aEnumerationRootItem); diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index f5423ab28dd4..3863bcc22f6f 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -2938,7 +2938,13 @@ NS_IMETHODIMP nsJSArgArray::IndexOf(uint32_t startIndex, nsISupports *element, u return NS_ERROR_NOT_IMPLEMENTED; } -NS_IMETHODIMP nsJSArgArray::Enumerate(nsISimpleEnumerator **_retval) +NS_IMETHODIMP nsJSArgArray::ScriptedEnumerate(nsIJSIID* aElemIID, uint8_t aArgc, + nsISimpleEnumerator** aResult) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP nsJSArgArray::EnumerateImpl(const nsID& aEntryIID, nsISimpleEnumerator **_retval) { return NS_ERROR_NOT_IMPLEMENTED; } diff --git a/dom/commandhandler/nsCommandGroup.cpp b/dom/commandhandler/nsCommandGroup.cpp index 0431476a2a7c..a81e11daec33 100644 --- a/dom/commandhandler/nsCommandGroup.cpp +++ b/dom/commandhandler/nsCommandGroup.cpp @@ -23,6 +23,11 @@ public: NS_DECL_NSISIMPLEENUMERATOR + const nsID& DefaultInterface() override + { + return NS_GET_IID(nsISupportsCString); + } + protected: ~nsGroupsEnumerator() override; @@ -128,6 +133,11 @@ public: NS_DECL_NSISIMPLEENUMERATOR + const nsID& DefaultInterface() override + { + return NS_GET_IID(nsISupportsCString); + } + protected: ~nsNamedGroupEnumerator() override; diff --git a/dom/payments/PaymentRequestService.cpp b/dom/payments/PaymentRequestService.cpp index 4bb55af41958..a54b82f3989f 100644 --- a/dom/payments/PaymentRequestService.cpp +++ b/dom/payments/PaymentRequestService.cpp @@ -25,6 +25,12 @@ public: PaymentRequestEnumerator() : mIndex(0) {} + + const nsID& DefaultInterface() override + { + return NS_GET_IID(nsIPaymentRequest); + } + private: ~PaymentRequestEnumerator() override = default; uint32_t mIndex; diff --git a/dom/plugins/base/nsPluginDirServiceProvider.cpp b/dom/plugins/base/nsPluginDirServiceProvider.cpp index abd76237c68a..15372a2ad807 100644 --- a/dom/plugins/base/nsPluginDirServiceProvider.cpp +++ b/dom/plugins/base/nsPluginDirServiceProvider.cpp @@ -62,7 +62,7 @@ nsPluginDirServiceProvider::GetPLIDDirectories(nsISimpleEnumerator **aEnumerator GetPLIDDirectoriesWithRootKey(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER, dirs); GetPLIDDirectoriesWithRootKey(nsIWindowsRegKey::ROOT_KEY_LOCAL_MACHINE, dirs); - return NS_NewArrayEnumerator(aEnumerator, dirs); + return NS_NewArrayEnumerator(aEnumerator, dirs, NS_GET_IID(nsIFile)); } nsresult diff --git a/dom/workers/WorkerDebuggerManager.cpp b/dom/workers/WorkerDebuggerManager.cpp index f5c10af60711..f928ec79f34b 100644 --- a/dom/workers/WorkerDebuggerManager.cpp +++ b/dom/workers/WorkerDebuggerManager.cpp @@ -90,6 +90,11 @@ public: NS_DECL_NSISIMPLEENUMERATOR + const nsID& DefaultInterface() override + { + return NS_GET_IID(nsIWorkerDebugger); + } + private: ~WorkerDebuggerEnumerator() override = default; }; diff --git a/extensions/cookie/nsPermissionManager.cpp b/extensions/cookie/nsPermissionManager.cpp index 865d1f1b219a..06596bcd49fc 100644 --- a/extensions/cookie/nsPermissionManager.cpp +++ b/extensions/cookie/nsPermissionManager.cpp @@ -2611,7 +2611,7 @@ NS_IMETHODIMP nsPermissionManager::GetEnumerator(nsISimpleEnumerator **aEnum) } } - return NS_NewArrayEnumerator(aEnum, array); + return NS_NewArrayEnumerator(aEnum, array, NS_GET_IID(nsIPermission)); } NS_IMETHODIMP nsPermissionManager::GetAllForURI(nsIURI* aURI, nsISimpleEnumerator **aEnum) @@ -2660,7 +2660,7 @@ nsPermissionManager::GetAllForPrincipal(nsIPrincipal* aPrincipal, } } - return NS_NewArrayEnumerator(aEnum, array); + return NS_NewArrayEnumerator(aEnum, array, NS_GET_IID(nsIPermission)); } NS_IMETHODIMP nsPermissionManager::Observe(nsISupports *aSubject, const char *aTopic, const char16_t *someData) diff --git a/intl/strres/nsStringBundle.cpp b/intl/strres/nsStringBundle.cpp index 660fee757a0c..3ff3722550b3 100644 --- a/intl/strres/nsStringBundle.cpp +++ b/intl/strres/nsStringBundle.cpp @@ -271,6 +271,11 @@ public: : mStringMap(aStringMap) {} + const nsID& DefaultInterface() override + { + return NS_GET_IID(nsIPropertyElement); + } + protected: virtual ~StringMapEnumerator() = default; diff --git a/js/xpconnect/src/XPCShellImpl.cpp b/js/xpconnect/src/XPCShellImpl.cpp index 7bc3eb2c9b10..74e9dfc5aef9 100644 --- a/js/xpconnect/src/XPCShellImpl.cpp +++ b/js/xpconnect/src/XPCShellImpl.cpp @@ -1513,7 +1513,7 @@ XPCShellDirProvider::GetFiles(const char* prop, nsISimpleEnumerator* *result) if (NS_SUCCEEDED(rv)) dirs.AppendObject(file); - return NS_NewArrayEnumerator(result, dirs); + return NS_NewArrayEnumerator(result, dirs, NS_GET_IID(nsIFile)); } else if (!strcmp(prop, NS_APP_PREFS_DEFAULTS_DIR_LIST)) { nsCOMArray dirs; nsCOMPtr appDir; @@ -1524,7 +1524,7 @@ XPCShellDirProvider::GetFiles(const char* prop, nsISimpleEnumerator* *result) NS_SUCCEEDED(appDir->AppendNative(NS_LITERAL_CSTRING("preferences"))) && NS_SUCCEEDED(appDir->Exists(&exists)) && exists) { dirs.AppendObject(appDir); - return NS_NewArrayEnumerator(result, dirs); + return NS_NewArrayEnumerator(result, dirs, NS_GET_IID(nsIFile)); } return NS_ERROR_FAILURE; } else if (!strcmp(prop, NS_APP_PLUGINS_DIR_LIST)) { @@ -1549,7 +1549,7 @@ XPCShellDirProvider::GetFiles(const char* prop, nsISimpleEnumerator* *result) } } } - return NS_NewArrayEnumerator(result, dirs); + return NS_NewArrayEnumerator(result, dirs, NS_GET_IID(nsIFile)); } return NS_ERROR_FAILURE; } diff --git a/js/xpconnect/src/XPCWrappedJSClass.cpp b/js/xpconnect/src/XPCWrappedJSClass.cpp index ce21054975a8..7087d07b8ee1 100644 --- a/js/xpconnect/src/XPCWrappedJSClass.cpp +++ b/js/xpconnect/src/XPCWrappedJSClass.cpp @@ -398,7 +398,7 @@ nsXPCWrappedJSClass::BuildPropertyEnumerator(XPCCallContext& ccx, return NS_ERROR_FAILURE; } - return NS_NewArrayEnumerator(aEnumerate, propertyArray); + return NS_NewArrayEnumerator(aEnumerate, propertyArray, NS_GET_IID(nsIProperty)); } /***************************************************************************/ diff --git a/netwerk/base/nsLoadGroup.cpp b/netwerk/base/nsLoadGroup.cpp index 40b9154fda10..75d8c9570f65 100644 --- a/netwerk/base/nsLoadGroup.cpp +++ b/netwerk/base/nsLoadGroup.cpp @@ -654,7 +654,7 @@ nsLoadGroup::GetRequests(nsISimpleEnumerator * *aRequests) requests.AppendObject(e->mKey); } - return NS_NewArrayEnumerator(aRequests, requests); + return NS_NewArrayEnumerator(aRequests, requests, NS_GET_IID(nsIRequest)); } NS_IMETHODIMP diff --git a/netwerk/cookie/nsCookieService.cpp b/netwerk/cookie/nsCookieService.cpp index b22a46a86d10..bffcd71c362f 100644 --- a/netwerk/cookie/nsCookieService.cpp +++ b/netwerk/cookie/nsCookieService.cpp @@ -2493,7 +2493,7 @@ nsCookieService::GetEnumerator(nsISimpleEnumerator **aEnumerator) } } - return NS_NewArrayEnumerator(aEnumerator, cookieList); + return NS_NewArrayEnumerator(aEnumerator, cookieList, NS_GET_IID(nsICookie2)); } NS_IMETHODIMP @@ -2518,7 +2518,7 @@ nsCookieService::GetSessionEnumerator(nsISimpleEnumerator **aEnumerator) } } - return NS_NewArrayEnumerator(aEnumerator, cookieList); + return NS_NewArrayEnumerator(aEnumerator, cookieList, NS_GET_IID(nsICookie2)); } static nsresult @@ -4928,7 +4928,7 @@ nsCookieService::GetCookiesFromHost(const nsACString &aHost, cookieList.AppendObject(cookies[i]); } - return NS_NewArrayEnumerator(aEnumerator, cookieList); + return NS_NewArrayEnumerator(aEnumerator, cookieList, NS_GET_IID(nsICookie2)); } NS_IMETHODIMP @@ -4987,7 +4987,7 @@ nsCookieService::GetCookiesWithOriginAttributes( } } - return NS_NewArrayEnumerator(aEnumerator, cookies); + return NS_NewArrayEnumerator(aEnumerator, cookies, NS_GET_IID(nsICookie2)); } NS_IMETHODIMP diff --git a/security/manager/ssl/PKCS11ModuleDB.cpp b/security/manager/ssl/PKCS11ModuleDB.cpp index 0d9bf9ba2a7b..da9f9d6185a0 100644 --- a/security/manager/ssl/PKCS11ModuleDB.cpp +++ b/security/manager/ssl/PKCS11ModuleDB.cpp @@ -192,7 +192,7 @@ PKCS11ModuleDB::ListModules(nsISimpleEnumerator** _retval) } } - return array->Enumerate(_retval); + return array->Enumerate(_retval, NS_GET_IID(nsIPKCS11Module)); } NS_IMETHODIMP diff --git a/security/manager/ssl/nsNSSCertificate.h b/security/manager/ssl/nsNSSCertificate.h index 779ccefe0694..898d695b1fc2 100644 --- a/security/manager/ssl/nsNSSCertificate.h +++ b/security/manager/ssl/nsNSSCertificate.h @@ -128,6 +128,8 @@ class nsNSSCertListEnumerator : public nsSimpleEnumerator public: NS_DECL_NSISIMPLEENUMERATOR + const nsID& DefaultInterface() override { return NS_GET_IID(nsIX509Cert); } + explicit nsNSSCertListEnumerator(const mozilla::UniqueCERTCertList& certList); private: virtual ~nsNSSCertListEnumerator() {} diff --git a/security/manager/ssl/nsPKCS11Slot.cpp b/security/manager/ssl/nsPKCS11Slot.cpp index 644bc741bd51..157c8bd29f21 100644 --- a/security/manager/ssl/nsPKCS11Slot.cpp +++ b/security/manager/ssl/nsPKCS11Slot.cpp @@ -290,5 +290,5 @@ nsPKCS11Module::ListSlots(nsISimpleEnumerator** _retval) } } - return array->Enumerate(_retval); + return array->Enumerate(_retval, NS_GET_IID(nsIPKCS11Slot)); } diff --git a/security/manager/ssl/nsSiteSecurityService.cpp b/security/manager/ssl/nsSiteSecurityService.cpp index 3a9e81183b67..202ebdd65d28 100644 --- a/security/manager/ssl/nsSiteSecurityService.cpp +++ b/security/manager/ssl/nsSiteSecurityService.cpp @@ -473,7 +473,7 @@ SiteHPKPState::GetSha256Keys(nsISimpleEnumerator** aSha256Keys) return NS_ERROR_FAILURE; } } - return NS_NewArrayEnumerator(aSha256Keys, keys); + return NS_NewArrayEnumerator(aSha256Keys, keys, NS_GET_IID(nsIVariant)); } NS_IMETHODIMP @@ -1895,7 +1895,7 @@ nsSiteSecurityService::Enumerate(uint32_t aType, states.AppendObject(state); } - NS_NewArrayEnumerator(aEnumerator, states); + NS_NewArrayEnumerator(aEnumerator, states, NS_GET_IID(nsISiteSecurityState)); return NS_OK; } diff --git a/toolkit/profile/nsToolkitProfileService.cpp b/toolkit/profile/nsToolkitProfileService.cpp index ddedf99b0b75..16de4dbea5d9 100644 --- a/toolkit/profile/nsToolkitProfileService.cpp +++ b/toolkit/profile/nsToolkitProfileService.cpp @@ -149,6 +149,11 @@ private: public: NS_DECL_NSISIMPLEENUMERATOR + const nsID& DefaultInterface() override + { + return NS_GET_IID(nsIToolkitProfile); + } + explicit ProfileEnumerator(nsToolkitProfile *first) { mCurrent = first; } private: diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp index ee57e55bf4da..70370e68669d 100644 --- a/toolkit/xre/nsXREDirProvider.cpp +++ b/toolkit/xre/nsXREDirProvider.cpp @@ -854,7 +854,7 @@ nsXREDirProvider::GetFilesInternal(const char* aProperty, LoadDirsIntoArray(mAppBundleDirectories, kAppendNothing, directories); - rv = NS_NewArrayEnumerator(aResult, directories); + rv = NS_NewArrayEnumerator(aResult, directories, NS_GET_IID(nsIFile)); } else if (!strcmp(aProperty, NS_APP_PREFS_DEFAULTS_DIR_LIST)) { nsCOMArray directories; @@ -863,7 +863,7 @@ nsXREDirProvider::GetFilesInternal(const char* aProperty, LoadDirsIntoArray(mAppBundleDirectories, kAppendPrefDir, directories); - rv = NS_NewArrayEnumerator(aResult, directories); + rv = NS_NewArrayEnumerator(aResult, directories, NS_GET_IID(nsIFile)); } else if (!strcmp(aProperty, NS_APP_CHROME_DIR_LIST)) { // NS_APP_CHROME_DIR_LIST is only used to get default (native) icons @@ -878,7 +878,7 @@ nsXREDirProvider::GetFilesInternal(const char* aProperty, kAppendChromeDir, directories); - rv = NS_NewArrayEnumerator(aResult, directories); + rv = NS_NewArrayEnumerator(aResult, directories, NS_GET_IID(nsIFile)); } else if (!strcmp(aProperty, NS_APP_PLUGINS_DIR_LIST)) { nsCOMArray directories; @@ -908,7 +908,7 @@ nsXREDirProvider::GetFilesInternal(const char* aProperty, directories); } - rv = NS_NewArrayEnumerator(aResult, directories); + rv = NS_NewArrayEnumerator(aResult, directories, NS_GET_IID(nsIFile)); NS_ENSURE_SUCCESS(rv, rv); rv = NS_SUCCESS_AGGREGATE_RESULT; diff --git a/uriloader/exthandler/HandlerService.js b/uriloader/exthandler/HandlerService.js index ec9a053672f3..8c1cb6c1a8e3 100644 --- a/uriloader/exthandler/HandlerService.js +++ b/uriloader/exthandler/HandlerService.js @@ -217,7 +217,7 @@ HandlerService.prototype = { ); handlers.appendElement(handler); } - return handlers.enumerate(); + return handlers.enumerate(Ci.nsIHandlerInfo); }, // nsIHandlerService diff --git a/uriloader/exthandler/win/nsMIMEInfoWin.cpp b/uriloader/exthandler/win/nsMIMEInfoWin.cpp index 261d3a8d4696..bf65463b7570 100644 --- a/uriloader/exthandler/win/nsMIMEInfoWin.cpp +++ b/uriloader/exthandler/win/nsMIMEInfoWin.cpp @@ -167,7 +167,7 @@ nsMIMEInfoWin::GetEnumerator(nsISimpleEnumerator* *_retval) if (variant) properties.AppendObject(variant); - return NS_NewArrayEnumerator(_retval, properties); + return NS_NewArrayEnumerator(_retval, properties, NS_GET_IID(nsIVariant)); } static nsresult GetIconURLVariant(nsIFile* aApplication, nsIVariant* *_retval) diff --git a/widget/gtk/nsFilePicker.cpp b/widget/gtk/nsFilePicker.cpp index b990a6b751b8..5caa99b71bf6 100644 --- a/widget/gtk/nsFilePicker.cpp +++ b/widget/gtk/nsFilePicker.cpp @@ -346,7 +346,7 @@ nsFilePicker::GetFiles(nsISimpleEnumerator **aFiles) NS_ENSURE_ARG_POINTER(aFiles); if (mMode == nsIFilePicker::modeOpenMultiple) { - return NS_NewArrayEnumerator(aFiles, mFiles); + return NS_NewArrayEnumerator(aFiles, mFiles, NS_GET_IID(nsIFile)); } return NS_ERROR_FAILURE; diff --git a/widget/nsBaseFilePicker.cpp b/widget/nsBaseFilePicker.cpp index eae711a06b45..f22bc505dcdf 100644 --- a/widget/nsBaseFilePicker.cpp +++ b/widget/nsBaseFilePicker.cpp @@ -112,6 +112,8 @@ public: , mMode(aMode) {} + const nsID& DefaultInterface() override { return NS_GET_IID(nsIFile); } + NS_IMETHOD GetNext(nsISupports** aResult) override { @@ -283,7 +285,7 @@ NS_IMETHODIMP nsBaseFilePicker::GetFiles(nsISimpleEnumerator **aFiles) files.AppendObject(file); - return NS_NewArrayEnumerator(aFiles, files); + return NS_NewArrayEnumerator(aFiles, files, NS_GET_IID(nsIFile)); } // Set the display directory diff --git a/widget/windows/nsFilePicker.cpp b/widget/windows/nsFilePicker.cpp index da628ae88d21..0e1d15d9c2e8 100644 --- a/widget/windows/nsFilePicker.cpp +++ b/widget/windows/nsFilePicker.cpp @@ -688,7 +688,7 @@ NS_IMETHODIMP nsFilePicker::GetFiles(nsISimpleEnumerator **aFiles) { NS_ENSURE_ARG_POINTER(aFiles); - return NS_NewArrayEnumerator(aFiles, mFiles); + return NS_NewArrayEnumerator(aFiles, mFiles, NS_GET_IID(nsIFile)); } // Get the file + path diff --git a/xpcom/components/nsCategoryManager.cpp b/xpcom/components/nsCategoryManager.cpp index 3b80197bdda1..526c64e78d59 100644 --- a/xpcom/components/nsCategoryManager.cpp +++ b/xpcom/components/nsCategoryManager.cpp @@ -59,6 +59,11 @@ public: NS_DECL_NSISIMPLEENUMERATOR NS_DECL_NSIUTF8STRINGENUMERATOR + const nsID& DefaultInterface() override + { + return NS_GET_IID(nsISupportsCString); + } + protected: // Callback function for NS_QuickSort to sort mArray static int SortCallback(const void*, const void*, void*); diff --git a/xpcom/ds/nsArray.cpp b/xpcom/ds/nsArray.cpp index e31a646bb0ea..f40ca313dfbb 100644 --- a/xpcom/ds/nsArray.cpp +++ b/xpcom/ds/nsArray.cpp @@ -7,6 +7,7 @@ #include "nsArray.h" #include "nsArrayEnumerator.h" #include "nsThreadUtils.h" +#include "xpcjsid.h" NS_INTERFACE_MAP_BEGIN(nsArray) NS_INTERFACE_MAP_ENTRY(nsIArray) @@ -79,11 +80,22 @@ nsArrayBase::IndexOf(uint32_t aStartIndex, nsISupports* aElement, } NS_IMETHODIMP -nsArrayBase::Enumerate(nsISimpleEnumerator** aResult) +nsArrayBase::ScriptedEnumerate(nsIJSIID* aElemIID, uint8_t aArgc, + nsISimpleEnumerator** aResult) { + if (aArgc > 0 && aElemIID) { + return NS_NewArrayEnumerator(aResult, static_cast(this), *aElemIID->GetID()); + } return NS_NewArrayEnumerator(aResult, static_cast(this)); } + +NS_IMETHODIMP +nsArrayBase::EnumerateImpl(const nsID& aElemIID, nsISimpleEnumerator** aResult) +{ + return NS_NewArrayEnumerator(aResult, static_cast(this), aElemIID); +} + // nsIMutableArray implementation NS_IMETHODIMP diff --git a/xpcom/ds/nsArrayEnumerator.cpp b/xpcom/ds/nsArrayEnumerator.cpp index 2a50b81a819b..1a12dd4c2451 100644 --- a/xpcom/ds/nsArrayEnumerator.cpp +++ b/xpcom/ds/nsArrayEnumerator.cpp @@ -23,17 +23,21 @@ public: NS_DECL_NSISIMPLEENUMERATOR // nsSimpleArrayEnumerator methods - explicit nsSimpleArrayEnumerator(nsIArray* aValueArray) + explicit nsSimpleArrayEnumerator(nsIArray* aValueArray, const nsID& aEntryIID) : mValueArray(aValueArray) + , mEntryIID(aEntryIID) , mIndex(0) { } + const nsID& DefaultInterface() override { return mEntryIID; } + private: ~nsSimpleArrayEnumerator() override = default; protected: nsCOMPtr mValueArray; + const nsID mEntryIID; uint32_t mIndex; }; @@ -86,9 +90,10 @@ nsSimpleArrayEnumerator::GetNext(nsISupports** aResult) } nsresult -NS_NewArrayEnumerator(nsISimpleEnumerator** aResult, nsIArray* aArray) +NS_NewArrayEnumerator(nsISimpleEnumerator** aResult, nsIArray* aArray, + const nsID& aEntryIID) { - RefPtr enumer = new nsSimpleArrayEnumerator(aArray); + RefPtr enumer = new nsSimpleArrayEnumerator(aArray, aEntryIID); enumer.forget(aResult); return NS_OK; } @@ -106,16 +111,19 @@ public: NS_DECL_NSISIMPLEENUMERATOR // Use this instead of `new`. - static nsCOMArrayEnumerator* Allocate(const nsCOMArray_base& aArray); + static nsCOMArrayEnumerator* Allocate(const nsCOMArray_base& aArray, const nsID& aEntryIID); // specialized operator to make sure we make room for mValues void operator delete(void* aPtr) { free(aPtr); } + const nsID& DefaultInterface() override { return mEntryIID; } + private: // nsSimpleArrayEnumerator methods - nsCOMArrayEnumerator() + explicit nsCOMArrayEnumerator(const nsID& aEntryIID) : mIndex(0) , mArraySize(0) + , mEntryIID(aEntryIID) { mValueArray[0] = nullptr; } @@ -126,6 +134,8 @@ protected: uint32_t mIndex; // current position uint32_t mArraySize; // size of the array + const nsID& mEntryIID; + // this is actually bigger nsISupports* mValueArray[1]; }; @@ -175,7 +185,7 @@ nsCOMArrayEnumerator::GetNext(nsISupports** aResult) } nsCOMArrayEnumerator* -nsCOMArrayEnumerator::Allocate(const nsCOMArray_base& aArray) +nsCOMArrayEnumerator::Allocate(const nsCOMArray_base& aArray, const nsID& aEntryIID) { // create enough space such that mValueArray points to a large // enough value. Note that the initial value of aSize gives us @@ -191,7 +201,7 @@ nsCOMArrayEnumerator::Allocate(const nsCOMArray_base& aArray) // Allocate a buffer large enough to contain our object and its array. void* mem = moz_xmalloc(size); - auto result = new (mozilla::KnownNotNull, mem) nsCOMArrayEnumerator(); + auto result = new (mozilla::KnownNotNull, mem) nsCOMArrayEnumerator(aEntryIID); result->mArraySize = count; @@ -209,9 +219,10 @@ nsCOMArrayEnumerator::Allocate(const nsCOMArray_base& aArray) nsresult NS_NewArrayEnumerator(nsISimpleEnumerator** aResult, - const nsCOMArray_base& aArray) + const nsCOMArray_base& aArray, + const nsID& aEntryIID) { - RefPtr enumerator = nsCOMArrayEnumerator::Allocate(aArray); + RefPtr enumerator = nsCOMArrayEnumerator::Allocate(aArray, aEntryIID); enumerator.forget(aResult); return NS_OK; } diff --git a/xpcom/ds/nsArrayEnumerator.h b/xpcom/ds/nsArrayEnumerator.h index 341ae86edab4..dd4dd5093444 100644 --- a/xpcom/ds/nsArrayEnumerator.h +++ b/xpcom/ds/nsArrayEnumerator.h @@ -9,7 +9,7 @@ // enumerator implementation for nsIArray -#include "nscore.h" +#include "nsISupports.h" class nsISimpleEnumerator; class nsIArray; @@ -19,7 +19,8 @@ class nsCOMArray_base; // The enumerator holds an owning reference to the array. nsresult NS_NewArrayEnumerator(nsISimpleEnumerator** aResult, - nsIArray* aArray); + nsIArray* aArray, + const nsID& aEntryIID = NS_GET_IID(nsISupports)); // create an enumerator for an existing nsCOMArray implementation // The enumerator will hold an owning reference to each ELEMENT in @@ -27,6 +28,7 @@ NS_NewArrayEnumerator(nsISimpleEnumerator** aResult, // without its objects going away. nsresult NS_NewArrayEnumerator(nsISimpleEnumerator** aResult, - const nsCOMArray_base& aArray); + const nsCOMArray_base& aArray, + const nsID& aEntryIID = NS_GET_IID(nsISupports)); #endif diff --git a/xpcom/ds/nsHashPropertyBag.cpp b/xpcom/ds/nsHashPropertyBag.cpp index 15e28fbdc8c0..7a38553bd7db 100644 --- a/xpcom/ds/nsHashPropertyBag.cpp +++ b/xpcom/ds/nsHashPropertyBag.cpp @@ -120,7 +120,8 @@ nsHashPropertyBagBase::GetEnumerator(nsISimpleEnumerator** aResult) propertyArray->AppendElement(sprop); } - return NS_NewArrayEnumerator(aResult, propertyArray); + return NS_NewArrayEnumerator(aResult, propertyArray, + NS_GET_IID(nsIProperty)); } #define IMPL_GETSETPROPERTY_AS(Name, Type) \ diff --git a/xpcom/ds/nsIArray.idl b/xpcom/ds/nsIArray.idl index d591253e9ac8..bf1b955abcfe 100644 --- a/xpcom/ds/nsIArray.idl +++ b/xpcom/ds/nsIArray.idl @@ -5,6 +5,7 @@ #include "nsISupports.idl" +interface nsIJSIID; interface nsISimpleEnumerator; /** @@ -31,7 +32,7 @@ interface nsISimpleEnumerator; * null is a valid entry in the array, and as such any nsISupports * parameters may be null, except where noted. */ -[scriptable, uuid(114744d9-c369-456e-b55a-52fe52880d2d)] +[scriptable, builtinclass, uuid(114744d9-c369-456e-b55a-52fe52880d2d)] interface nsIArray : nsISupports { /** @@ -87,5 +88,17 @@ interface nsIArray : nsISupports * @throws NS_ERROR_FAILURE if the array is empty (to make it easy * to detect errors), or NS_ERROR_OUT_OF_MEMORY if out of memory. */ - nsISimpleEnumerator enumerate(); + [binaryname(ScriptedEnumerate), optional_argc] + nsISimpleEnumerator enumerate([optional] in nsIJSIID aElemIID); + + [noscript] + nsISimpleEnumerator enumerateImpl(in nsIDRef aElemIID); + + %{C++ + nsresult + Enumerate(nsISimpleEnumerator** aRetVal, const nsID& aElemIID = NS_GET_IID(nsISupports)) + { + return EnumerateImpl(aElemIID, aRetVal); + } + %} }; diff --git a/xpcom/ds/nsIArrayExtensions.idl b/xpcom/ds/nsIArrayExtensions.idl index 3682d2ee70ae..872a5c018d8d 100644 --- a/xpcom/ds/nsIArrayExtensions.idl +++ b/xpcom/ds/nsIArrayExtensions.idl @@ -24,7 +24,7 @@ * itself, possibly getting rid of the Count() method, as it duplicates * nsIArray functionality. */ -[scriptable, uuid(261d442e-050c-453d-8aaa-b3f23bcc528b)] +[scriptable, builtinclass, uuid(261d442e-050c-453d-8aaa-b3f23bcc528b)] interface nsIArrayExtensions : nsIArray { /** diff --git a/xpcom/ds/nsIMutableArray.idl b/xpcom/ds/nsIMutableArray.idl index 73f629412263..0308aa814b4a 100644 --- a/xpcom/ds/nsIMutableArray.idl +++ b/xpcom/ds/nsIMutableArray.idl @@ -20,7 +20,7 @@ * Any of these methods may throw NS_ERROR_OUT_OF_MEMORY when the * array must grow to complete the call, but the allocation fails. */ -[scriptable, uuid(af059da0-c85b-40ec-af07-ae4bfdc192cc)] +[scriptable, builtinclass, uuid(af059da0-c85b-40ec-af07-ae4bfdc192cc)] interface nsIMutableArray : nsIArrayExtensions { /** diff --git a/xpcom/ds/nsISimpleEnumerator.idl b/xpcom/ds/nsISimpleEnumerator.idl index ccad2a16722e..1a2b47705dbe 100644 --- a/xpcom/ds/nsISimpleEnumerator.idl +++ b/xpcom/ds/nsISimpleEnumerator.idl @@ -31,7 +31,8 @@ interface nsIJSEnumerator : nsISupports { interface nsISimpleEnumeratorBase : nsISupports { /** * Returns a JavaScript iterator for all remaining entries in the enumerator. - * Each entry is queried only to nsISupports. + * Each entry is typically queried to the appropriate interface for the + * enumerator. */ [symbol] nsIJSEnumerator iterator(); diff --git a/xpcom/ds/nsObserverList.h b/xpcom/ds/nsObserverList.h index a47add08a90c..3174669e2d7a 100644 --- a/xpcom/ds/nsObserverList.h +++ b/xpcom/ds/nsObserverList.h @@ -82,6 +82,8 @@ public: explicit nsObserverEnumerator(nsObserverList* aObserverList); + const nsID& DefaultInterface() override { return NS_GET_IID(nsIObserver); } + private: ~nsObserverEnumerator() override = default; diff --git a/xpcom/ds/nsPersistentProperties.cpp b/xpcom/ds/nsPersistentProperties.cpp index ff9b22c06a22..433b00960e48 100644 --- a/xpcom/ds/nsPersistentProperties.cpp +++ b/xpcom/ds/nsPersistentProperties.cpp @@ -570,7 +570,7 @@ nsPersistentProperties::Enumerate(nsISimpleEnumerator** aResult) } } - return NS_NewArrayEnumerator(aResult, props); + return NS_NewArrayEnumerator(aResult, props, NS_GET_IID(nsIPropertyElement)); } //////////////////////////////////////////////////////////////////////////////// diff --git a/xpcom/ds/nsSimpleEnumerator.cpp b/xpcom/ds/nsSimpleEnumerator.cpp index b540ab63e64c..be8c14896a1b 100644 --- a/xpcom/ds/nsSimpleEnumerator.cpp +++ b/xpcom/ds/nsSimpleEnumerator.cpp @@ -71,7 +71,7 @@ NS_IMPL_ISUPPORTS(JSEnumerator, nsIJSEnumerator) nsresult nsSimpleEnumerator::Iterator(nsIJSEnumerator **aResult) { - auto result = MakeRefPtr(this, NS_GET_IID(nsISupports)); + auto result = MakeRefPtr(this, DefaultInterface()); result.forget(aResult); return NS_OK; } diff --git a/xpcom/ds/nsSimpleEnumerator.h b/xpcom/ds/nsSimpleEnumerator.h index afb195b4c7cf..e54e6a3ecd6a 100644 --- a/xpcom/ds/nsSimpleEnumerator.h +++ b/xpcom/ds/nsSimpleEnumerator.h @@ -14,6 +14,8 @@ class nsSimpleEnumerator : public nsISimpleEnumerator NS_DECL_ISUPPORTS NS_DECL_NSISIMPLEENUMERATORBASE + virtual const nsID& DefaultInterface() { return NS_GET_IID(nsISupports); } + protected: virtual ~nsSimpleEnumerator() = default; }; diff --git a/xpcom/ds/nsStringEnumerator.cpp b/xpcom/ds/nsStringEnumerator.cpp index 03e413b4cbcc..9dd7aba1670d 100644 --- a/xpcom/ds/nsStringEnumerator.cpp +++ b/xpcom/ds/nsStringEnumerator.cpp @@ -59,6 +59,14 @@ public: NS_IMETHOD GetNext(nsAString& aResult) override; NS_DECL_NSISIMPLEENUMERATOR + const nsID& DefaultInterface() override + { + if (mIsUnicode) { + return NS_GET_IID(nsISupportsString); + } + return NS_GET_IID(nsISupportsCString); + } + private: ~nsStringEnumerator() { diff --git a/xpcom/io/nsAppFileLocationProvider.cpp b/xpcom/io/nsAppFileLocationProvider.cpp index 6acaa3eda098..45628ed7a4f5 100644 --- a/xpcom/io/nsAppFileLocationProvider.cpp +++ b/xpcom/io/nsAppFileLocationProvider.cpp @@ -390,6 +390,8 @@ public: { } + const nsID& DefaultInterface() override { return NS_GET_IID(nsIFile); } + NS_IMETHOD HasMoreElements(bool* aResult) override { while (!mNext && *mCurrentKey) { diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp index b59860286c96..41d0c3520500 100644 --- a/xpcom/io/nsLocalFileUnix.cpp +++ b/xpcom/io/nsLocalFileUnix.cpp @@ -110,6 +110,8 @@ public: NS_FORWARD_NSISIMPLEENUMERATORBASE(nsSimpleEnumerator::) + const nsID& DefaultInterface() override { return NS_GET_IID(nsIFile); } + private: ~nsDirEnumeratorUnix() override; diff --git a/xpcom/io/nsLocalFileWin.cpp b/xpcom/io/nsLocalFileWin.cpp index e2d334a37341..1a038ad00e70 100644 --- a/xpcom/io/nsLocalFileWin.cpp +++ b/xpcom/io/nsLocalFileWin.cpp @@ -241,6 +241,8 @@ public: NS_FORWARD_NSISIMPLEENUMERATORBASE(nsSimpleEnumerator::) nsresult Init(); + const nsID& DefaultInterface() override { return NS_GET_IID(nsIFile); } + NS_IMETHOD GetNextFile(nsIFile** aResult) override { bool hasMore = false; @@ -701,6 +703,8 @@ public: { } + const nsID& DefaultInterface() override { return NS_GET_IID(nsIFile); } + nsresult Init(nsIFile* aParent) { nsAutoString filepath; diff --git a/xpfe/appshell/nsAppShellWindowEnumerator.h b/xpfe/appshell/nsAppShellWindowEnumerator.h index 614885c5bdbf..863a9d3bd22f 100644 --- a/xpfe/appshell/nsAppShellWindowEnumerator.h +++ b/xpfe/appshell/nsAppShellWindowEnumerator.h @@ -83,6 +83,8 @@ public: nsWindowMediator& inMediator); virtual ~nsASXULWindowEnumerator(); NS_IMETHOD GetNext(nsISupports **retval) override; + + const nsID& DefaultInterface() override { return NS_GET_IID(nsIXULWindow); } }; //