Bug 1769442 - Remove nsIFactory::lockFactory, breaking compatibility with IClassFactory. r=xpcom-reviewers,Jamie,necko-reviewers,kershaw,nika

nsIFactory is binary compatible with Windows COM's IClassFactory,
but nothing seems to depend on it. This patch removes the test
for compatibility, TestCOM, and removes the lockFactory
method that isn't otherwise needed.

Differential Revision: https://phabricator.services.mozilla.com/D146386
This commit is contained in:
Andrew McCreight 2022-05-16 22:38:51 +00:00
Родитель 18fcb78a92
Коммит 01913de302
25 изменённых файлов: 11 добавлений и 134 удалений

Просмотреть файл

@ -67,10 +67,6 @@ var AboutModuleFactory = {
return new AboutModule().QueryInterface(aIID);
},
lockFactory(aLock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
QueryInterface: ChromeUtils.generateQI(["nsIFactory"]),
};

Просмотреть файл

@ -16,9 +16,6 @@ var provider = {
}
return this.QueryInterface(iid);
},
lockFactory: function eventsink_lockf(lock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
startup() {},
watch() {},
shutdown() {},

Просмотреть файл

@ -16,9 +16,6 @@ var provider = {
}
return this.QueryInterface(iid);
},
lockFactory: function eventsink_lockf(lock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
startup() {},
watch() {},
shutdown() {},

Просмотреть файл

@ -12,9 +12,6 @@ var factory = {
createInstance() {
throw new Error("There is no history service");
},
lockFactory() {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
QueryInterface: ChromeUtils.generateQI(["nsIFactory"]),
};

Просмотреть файл

@ -48,7 +48,6 @@ CustomProtocolHandler.prototype = {
}
return this.QueryInterface(aIID);
},
lockFactory() {},
/** nsISupports */
QueryInterface: ChromeUtils.generateQI(["nsIProtocolHandler", "nsIFactory"]),

Просмотреть файл

@ -24,9 +24,6 @@ var factory = {
}
return unsafeAboutModule.QueryInterface(aIID);
},
lockFactory(aLock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
QueryInterface: ChromeUtils.generateQI(["nsIFactory"]),
};

Просмотреть файл

@ -116,7 +116,6 @@ ProtocolHandler.prototype = {
}
return this.QueryInterface(aIID);
},
lockFactory() {},
/** nsISupports */
QueryInterface: ChromeUtils.generateQI([

Просмотреть файл

@ -27,9 +27,6 @@ var sniffer = {
}
return this.QueryInterface(iid);
},
lockFactory: function sniffer_lockf(lock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
getMIMETypeFromContent(request, data, length) {
return sniffedType;

Просмотреть файл

@ -26,9 +26,6 @@ var eventsink = {
}
return this.QueryInterface(iid);
},
lockFactory: function eventsink_lockf(lock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
asyncOnChannelRedirect: function eventsink_onredir(
oldChan,

Просмотреть файл

@ -38,7 +38,6 @@ TestProtocolHandlerFactory.prototype = {
createInstance(delegate, iid) {
return new TestProtocolHandler().QueryInterface(iid);
},
lockFactory(lock) {},
};
function register_test_protocol_handler() {

Просмотреть файл

@ -52,7 +52,6 @@ TestProtocolHandlerFactory.prototype = {
createInstance(delegate, iid) {
return new TestProtocolHandler().QueryInterface(iid);
},
lockFactory(lock) {},
};
function register_test_protocol_handler() {

Просмотреть файл

@ -68,9 +68,6 @@ var MockRegistrar = Object.freeze({
return wrappedMock.QueryInterface(iid);
},
lockFactory(lock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
QueryInterface: ChromeUtils.generateQI(["nsIFactory"]),
};

Просмотреть файл

@ -32,9 +32,6 @@ var newFactory = function(window) {
}
return new MockColorPickerInstance(window).QueryInterface(aIID);
},
lockFactory(aLock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
QueryInterface: ChromeUtils.generateQI(["nsIFactory"]),
};
};

Просмотреть файл

@ -37,9 +37,6 @@ var newFactory = function(window) {
}
return new MockFilePickerInstance(window).QueryInterface(aIID);
},
lockFactory(aLock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
QueryInterface: ChromeUtils.generateQI(["nsIFactory"]),
};
};

Просмотреть файл

@ -20,9 +20,6 @@ var newFactory = {
}
return new MockPermissionPromptInstance().QueryInterface(aIID);
},
lockFactory(aLock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
QueryInterface: ChromeUtils.generateQI(["nsIFactory"]),
};

Просмотреть файл

@ -308,9 +308,6 @@ var _fakeIdleService = {
}
return _fakeIdleService.QueryInterface(aIID);
},
lockFactory(aLock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
QueryInterface: ChromeUtils.generateQI(["nsIFactory"]),
},

Просмотреть файл

@ -18,10 +18,6 @@ var TestPromptFactory = {
return this.QueryInterface(iid);
},
lockFactory: function tPF_lockf(lock) {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
getPrompt: function tPF_getPrompt(aWindow, aIID) {
if (aIID.equals(Ci.nsIAuthPrompt) || aIID.equals(Ci.nsIAuthPrompt2)) {
authPromptRequestReceived = true;

Просмотреть файл

@ -2087,9 +2087,6 @@ nsToolkitProfileFactory::CreateInstance(nsISupports* aOuter, const nsID& aIID,
return profileService->QueryInterface(aIID, aResult);
}
NS_IMETHODIMP
nsToolkitProfileFactory::LockFactory(bool aVal) { return NS_OK; }
nsresult NS_NewToolkitProfileFactory(nsIFactory** aResult) {
*aResult = new nsToolkitProfileFactory();

Просмотреть файл

@ -2126,9 +2126,6 @@ nsSingletonFactory::CreateInstance(nsISupports* aOuter, const nsIID& aIID,
return mSingleton->QueryInterface(aIID, aResult);
}
NS_IMETHODIMP
nsSingletonFactory::LockFactory(bool) { return NS_OK; }
/**
* Set our windowcreator on the WindowWatcher service.
*/

Просмотреть файл

@ -16,10 +16,4 @@ GenericFactory::CreateInstance(nsISupports* aOuter, REFNSIID aIID,
return mCtor(aOuter, aIID, aResult);
}
NS_IMETHODIMP
GenericFactory::LockFactory(bool aLock) {
NS_ERROR("Vestigial method, never called!");
return NS_ERROR_FAILURE;
}
} // namespace mozilla

Просмотреть файл

@ -208,11 +208,6 @@ NS_IMETHODIMP StaticModuleFactory::CreateInstance(nsISupports* aOuter,
return CreateInstanceImpl(mID, aIID, aResult);
}
NS_IMETHODIMP StaticModuleFactory::LockFactory(bool aLock) {
MOZ_CRASH("LockFactory is no longer a thing");
return NS_ERROR_NOT_IMPLEMENTED;
}
} // anonymous namespace

Просмотреть файл

@ -10,7 +10,7 @@
* components without specifying a concrete base class.
*/
[scriptable, object, uuid(00000001-0000-0000-c000-000000000046)]
[scriptable, object, uuid(1bb40a56-9223-41e6-97d4-da97bdeb6a4d)]
interface nsIFactory : nsISupports {
/**
* Creates an instance of a component.
@ -28,15 +28,4 @@ interface nsIFactory : nsISupports {
*/
void createInstance(in nsISupports aOuter, in nsIIDRef iid,
[retval, iid_is(iid)] out nsQIResult result);
/**
* LockFactory provides the client a way to keep the component
* in memory until it is finished with it. The client can call
* LockFactory(PR_TRUE) to lock the factory and LockFactory(PR_FALSE)
* to release the factory.
*
* @param lock - Must be PR_TRUE or PR_FALSE
* @throws NS_ERROR* - Method failure.
*/
void lockFactory(in boolean lock);
};

Просмотреть файл

@ -56,9 +56,6 @@ nsINIParserFactory::CreateInstance(nsISupports* aOuter, REFNSIID aIID,
return QueryInterface(aIID, aResult);
}
NS_IMETHODIMP
nsINIParserFactory::LockFactory(bool aLock) { return NS_OK; }
NS_IMPL_ISUPPORTS(nsINIParserImpl, nsIINIParser, nsIINIParserWriter)
bool nsINIParserImpl::ContainsNull(const nsACString& aStr) {

Просмотреть файл

@ -83,8 +83,6 @@ class Factory final : public nsIFactory {
NS_IMETHOD CreateInstance(nsISupports* aDelegate, const nsIID& aIID,
void** aResult) override;
NS_IMETHOD LockFactory(bool aLock) override { return NS_OK; }
bool mFirstComponentCreated;
};

Просмотреть файл

@ -7,7 +7,8 @@
#include <unknwn.h>
#include <stdio.h>
#include "nsISupports.h"
#include "nsIFactory.h"
#include "nsCOMPtr.h"
#include "mozilla/RefPtr.h"
// unknwn.h is needed to build with WIN32_LEAN_AND_MEAN
#include <unknwn.h>
@ -67,64 +68,19 @@ MozExternalRefCountType nsTestCom::Release() {
return res;
}
class nsTestComFactory final : public nsIFactory {
~nsTestComFactory() { sDestructions++; }
NS_DECL_ISUPPORTS
public:
nsTestComFactory() {}
NS_IMETHOD CreateInstance(nsISupports* aOuter, const nsIID& aIID,
void** aResult) override;
NS_IMETHOD LockFactory(bool aLock) override { return NS_OK; }
static int sDestructions;
};
int nsTestComFactory::sDestructions;
NS_IMPL_ISUPPORTS(nsTestComFactory, nsIFactory)
nsresult nsTestComFactory::CreateInstance(nsISupports* aOuter,
const nsIID& aIID, void** aResult) {
if (aOuter != nullptr) {
return NS_ERROR_NO_AGGREGATION;
}
nsTestCom* t = new nsTestCom();
NS_ADDREF(t);
nsresult res = t->QueryInterface(aIID, aResult);
NS_RELEASE(t);
return res;
}
TEST(TestCOM, WindowsInterop)
{
nsTestComFactory* inst = new nsTestComFactory();
// Test we can QI nsIFactory to an IClassFactory.
IClassFactory* iFactory = nullptr;
nsresult rv = inst->QueryInterface(NS_GET_IID(nsIFactory), (void**)&iFactory);
ASSERT_TRUE(NS_SUCCEEDED(rv));
ASSERT_TRUE(iFactory);
// Test we can CreateInstance with an IUnknown.
// Test that we can QI an nsITestCom to an IUnknown.
RefPtr<nsTestCom> t = new nsTestCom();
IUnknown* iUnknown = nullptr;
HRESULT hr = iFactory->LockServer(TRUE);
ASSERT_TRUE(SUCCEEDED(hr));
hr = iFactory->CreateInstance(nullptr, IID_IUnknown, (void**)&iUnknown);
ASSERT_TRUE(SUCCEEDED(hr));
nsresult rv = t->QueryInterface(NS_GET_IID(nsISupports), (void**)&iUnknown);
ASSERT_TRUE(NS_SUCCEEDED(rv));
ASSERT_TRUE(iUnknown);
hr = iFactory->LockServer(FALSE);
ASSERT_TRUE(SUCCEEDED(hr));
// Test we can QI an IUnknown to nsITestCom.
nsITestCom* iTestCom = nullptr;
nsCOMPtr<nsITestCom> iTestCom;
GUID testGUID = NS_ITEST_COM_IID;
hr = iUnknown->QueryInterface(testGUID, (void**)&iTestCom);
HRESULT hr = iUnknown->QueryInterface(testGUID, getter_AddRefs(iTestCom));
ASSERT_TRUE(SUCCEEDED(hr));
ASSERT_TRUE(iTestCom);
@ -133,9 +89,8 @@ TEST(TestCOM, WindowsInterop)
ASSERT_TRUE(NS_SUCCEEDED(rv));
iUnknown->Release();
iTestCom->Release();
iFactory->Release();
iTestCom = nullptr;
t = nullptr;
ASSERT_EQ(nsTestComFactory::sDestructions, 1);
ASSERT_EQ(nsTestCom::sDestructions, 1);
}