The DocumentLoader is now a global service. Rather than creating document loaders via the factory, they are now created as child loaders of the global DocumentLoader service which is accessable via GetService.
git-svn-id: svn://10.0.0.236/trunk@17935 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -344,7 +344,7 @@ protected:
|
||||
static NS_DEFINE_IID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
|
||||
static NS_DEFINE_IID(kChildCID, NS_CHILD_CID);
|
||||
static NS_DEFINE_IID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID);
|
||||
static NS_DEFINE_IID(kDocumentLoaderCID, NS_DOCUMENTLOADER_CID);
|
||||
static NS_DEFINE_IID(kDocLoaderServiceCID, NS_DOCUMENTLOADER_SERVICE_CID);
|
||||
static NS_DEFINE_IID(kWebShellCID, NS_WEB_SHELL_CID);
|
||||
|
||||
// IID's
|
||||
@@ -720,10 +720,16 @@ nsWebShell::Init(nsNativeWidget aNativeParent,
|
||||
NS_RELEASE(parentLoader);
|
||||
}
|
||||
} else {
|
||||
rv = nsRepository::CreateInstance(kDocumentLoaderCID,
|
||||
nsnull,
|
||||
nsIDocumentLoader* docLoaderService;
|
||||
|
||||
// Get the global document loader service...
|
||||
rv = nsServiceManager::GetService(kDocLoaderServiceCID,
|
||||
kIDocumentLoaderIID,
|
||||
(void**)&mDocLoader);
|
||||
(nsISupports **)&docLoaderService);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
rv = docLoaderService->CreateDocumentLoader(&mDocLoader);
|
||||
nsServiceManager::ReleaseService(kDocLoaderServiceCID, docLoaderService);
|
||||
}
|
||||
}
|
||||
if (NS_FAILED(rv)) {
|
||||
goto done;
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include "nsIURLGroup.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsINetService.h"
|
||||
#include "nsXPComFactory.h"
|
||||
|
||||
// XXX: Only needed for dummy factory...
|
||||
#include "nsIDocument.h"
|
||||
@@ -1784,111 +1785,75 @@ nsDocumentBindInfo::CancelRefreshURLTimers(void)
|
||||
}
|
||||
|
||||
/*******************************************
|
||||
* nsDocLoaderFactory
|
||||
* nsDocLoaderServiceFactory
|
||||
*******************************************/
|
||||
static nsDocLoaderImpl* gServiceInstance = nsnull;
|
||||
|
||||
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
|
||||
static NS_DEFINE_IID(kCDocumentLoader, NS_DOCUMENTLOADER_CID);
|
||||
|
||||
class nsDocumentLoaderFactory : public nsIFactory
|
||||
class nsDocLoaderServiceFactory : public nsFactory<nsDocLoaderImpl>
|
||||
{
|
||||
public:
|
||||
nsDocumentLoaderFactory();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsIFactory methods
|
||||
NS_IMETHOD CreateInstance(nsISupports *aOuter,
|
||||
const nsIID &aIID,
|
||||
void **aResult);
|
||||
|
||||
NS_IMETHOD LockFactory(PRBool aLock);
|
||||
|
||||
|
||||
protected:
|
||||
virtual ~nsDocumentLoaderFactory();
|
||||
NS_IMETHOD CreateInstance(nsISupports *aOuter,
|
||||
const nsIID &aIID,
|
||||
void **aResult);
|
||||
};
|
||||
|
||||
nsDocumentLoaderFactory::nsDocumentLoaderFactory()
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsDocumentLoaderFactory::~nsDocumentLoaderFactory()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Implementation of ISupports methods...
|
||||
*/
|
||||
NS_IMPL_ISUPPORTS(nsDocumentLoaderFactory,kIFactoryIID);
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocumentLoaderFactory::CreateInstance(nsISupports* aOuter,
|
||||
const nsIID& aIID,
|
||||
void** aResult)
|
||||
nsDocLoaderServiceFactory::CreateInstance(nsISupports *aOuter,
|
||||
const nsIID &aIID,
|
||||
void **aResult)
|
||||
{
|
||||
nsresult rv;
|
||||
nsIDocumentLoader* inst;
|
||||
static nsDocLoaderImpl* gGlobalDocLoader = nsnull;
|
||||
nsresult rv;
|
||||
nsDocLoaderImpl* inst;
|
||||
|
||||
// Parameter validation...
|
||||
if (NULL == aResult) {
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
goto done;
|
||||
}
|
||||
// Do not support aggregatable components...
|
||||
*aResult = NULL;
|
||||
if (NULL != aOuter) {
|
||||
rv = NS_ERROR_NO_AGGREGATION;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (nsnull == aResult) {
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
goto done;
|
||||
if (NULL == gServiceInstance) {
|
||||
// Create a new instance of the component...
|
||||
NS_NEWXPCOM(gServiceInstance, nsDocLoaderImpl);
|
||||
if (NULL == gServiceInstance) {
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
*aResult = nsnull;
|
||||
NS_ADDREF(gServiceInstance);
|
||||
}
|
||||
|
||||
if (nsnull != aOuter) {
|
||||
rv = NS_ERROR_NO_AGGREGATION;
|
||||
goto done;
|
||||
}
|
||||
// If the QI fails, the component will be destroyed...
|
||||
//
|
||||
// Use a local copy so the NS_RELEASE() will not null the global
|
||||
// pointer...
|
||||
inst = gServiceInstance;
|
||||
|
||||
if (nsnull == gGlobalDocLoader) {
|
||||
NS_NEWXPCOM(gGlobalDocLoader, nsDocLoaderImpl);
|
||||
if (nsnull == gGlobalDocLoader) {
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
NS_ADDREF(gGlobalDocLoader); // RefCount = 1
|
||||
}
|
||||
|
||||
rv = gGlobalDocLoader->CreateDocumentLoader(&inst);
|
||||
if (NS_OK != rv) {
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
*aResult = inst;
|
||||
NS_ADDREF(inst);
|
||||
rv = inst->QueryInterface(aIID, aResult);
|
||||
NS_RELEASE(inst);
|
||||
|
||||
done:
|
||||
return rv;
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocumentLoaderFactory::LockFactory(PRBool aLock)
|
||||
|
||||
// Entry point to create nsEventQueueService factory instances...
|
||||
|
||||
nsresult NS_NewDocLoaderServiceFactory(nsIFactory** aResult)
|
||||
{
|
||||
// Not implemented in simplest case.
|
||||
return NS_OK;
|
||||
nsresult rv = NS_OK;
|
||||
nsIFactory* inst = new nsDocLoaderServiceFactory();
|
||||
if (NULL == inst) {
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
else {
|
||||
NS_ADDREF(inst);
|
||||
}
|
||||
*aResult = inst;
|
||||
return rv;
|
||||
}
|
||||
|
||||
extern "C" NS_WEB nsresult
|
||||
NS_NewDocumentLoaderFactory(nsIFactory** aFactory)
|
||||
{
|
||||
if (nsnull == aFactory) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
nsDocumentLoaderFactory* it;
|
||||
NS_NEWXPCOM(it, nsDocumentLoaderFactory);
|
||||
*aFactory = it;
|
||||
if (nsnull == *aFactory) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
NS_ADDREF(*aFactory);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -22,9 +22,12 @@
|
||||
#include "nsIDocumentLoader.h"
|
||||
#include "nsIThrobber.h"
|
||||
|
||||
static NS_DEFINE_IID(kDocumentLoaderCID, NS_DOCUMENTLOADER_CID);
|
||||
static NS_DEFINE_IID(kThrobberCID, NS_THROBBER_CID);
|
||||
static NS_DEFINE_IID(kWebShellCID, NS_WEB_SHELL_CID);
|
||||
static NS_DEFINE_IID(kDocLoaderServiceCID, NS_DOCUMENTLOADER_SERVICE_CID);
|
||||
static NS_DEFINE_IID(kThrobberCID, NS_THROBBER_CID);
|
||||
static NS_DEFINE_IID(kWebShellCID, NS_WEB_SHELL_CID);
|
||||
|
||||
|
||||
nsresult NS_NewDocLoaderServiceFactory(nsIFactory** aResult);
|
||||
|
||||
|
||||
#if defined(XP_MAC) && defined(MAC_STATIC)
|
||||
@@ -42,8 +45,8 @@ extern "C" NS_WEB nsresult NSGetFactory(const nsCID& aClass, nsIFactory** aFacto
|
||||
if (aClass.Equals(kWebShellCID)) {
|
||||
rv = NS_NewWebShellFactory(aFactory);
|
||||
}
|
||||
else if (aClass.Equals(kDocumentLoaderCID)) {
|
||||
rv = NS_NewDocumentLoaderFactory(aFactory);
|
||||
else if (aClass.Equals(kDocLoaderServiceCID)) {
|
||||
rv = NS_NewDocLoaderServiceFactory(aFactory);
|
||||
}
|
||||
else if (aClass.Equals(kThrobberCID)) {
|
||||
rv = NS_NewThrobberFactory(aFactory);
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include "nsIURLGroup.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsINetService.h"
|
||||
#include "nsXPComFactory.h"
|
||||
|
||||
// XXX: Only needed for dummy factory...
|
||||
#include "nsIDocument.h"
|
||||
@@ -1784,111 +1785,75 @@ nsDocumentBindInfo::CancelRefreshURLTimers(void)
|
||||
}
|
||||
|
||||
/*******************************************
|
||||
* nsDocLoaderFactory
|
||||
* nsDocLoaderServiceFactory
|
||||
*******************************************/
|
||||
static nsDocLoaderImpl* gServiceInstance = nsnull;
|
||||
|
||||
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
|
||||
static NS_DEFINE_IID(kCDocumentLoader, NS_DOCUMENTLOADER_CID);
|
||||
|
||||
class nsDocumentLoaderFactory : public nsIFactory
|
||||
class nsDocLoaderServiceFactory : public nsFactory<nsDocLoaderImpl>
|
||||
{
|
||||
public:
|
||||
nsDocumentLoaderFactory();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsIFactory methods
|
||||
NS_IMETHOD CreateInstance(nsISupports *aOuter,
|
||||
const nsIID &aIID,
|
||||
void **aResult);
|
||||
|
||||
NS_IMETHOD LockFactory(PRBool aLock);
|
||||
|
||||
|
||||
protected:
|
||||
virtual ~nsDocumentLoaderFactory();
|
||||
NS_IMETHOD CreateInstance(nsISupports *aOuter,
|
||||
const nsIID &aIID,
|
||||
void **aResult);
|
||||
};
|
||||
|
||||
nsDocumentLoaderFactory::nsDocumentLoaderFactory()
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsDocumentLoaderFactory::~nsDocumentLoaderFactory()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Implementation of ISupports methods...
|
||||
*/
|
||||
NS_IMPL_ISUPPORTS(nsDocumentLoaderFactory,kIFactoryIID);
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocumentLoaderFactory::CreateInstance(nsISupports* aOuter,
|
||||
const nsIID& aIID,
|
||||
void** aResult)
|
||||
nsDocLoaderServiceFactory::CreateInstance(nsISupports *aOuter,
|
||||
const nsIID &aIID,
|
||||
void **aResult)
|
||||
{
|
||||
nsresult rv;
|
||||
nsIDocumentLoader* inst;
|
||||
static nsDocLoaderImpl* gGlobalDocLoader = nsnull;
|
||||
nsresult rv;
|
||||
nsDocLoaderImpl* inst;
|
||||
|
||||
// Parameter validation...
|
||||
if (NULL == aResult) {
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
goto done;
|
||||
}
|
||||
// Do not support aggregatable components...
|
||||
*aResult = NULL;
|
||||
if (NULL != aOuter) {
|
||||
rv = NS_ERROR_NO_AGGREGATION;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (nsnull == aResult) {
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
goto done;
|
||||
if (NULL == gServiceInstance) {
|
||||
// Create a new instance of the component...
|
||||
NS_NEWXPCOM(gServiceInstance, nsDocLoaderImpl);
|
||||
if (NULL == gServiceInstance) {
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
*aResult = nsnull;
|
||||
NS_ADDREF(gServiceInstance);
|
||||
}
|
||||
|
||||
if (nsnull != aOuter) {
|
||||
rv = NS_ERROR_NO_AGGREGATION;
|
||||
goto done;
|
||||
}
|
||||
// If the QI fails, the component will be destroyed...
|
||||
//
|
||||
// Use a local copy so the NS_RELEASE() will not null the global
|
||||
// pointer...
|
||||
inst = gServiceInstance;
|
||||
|
||||
if (nsnull == gGlobalDocLoader) {
|
||||
NS_NEWXPCOM(gGlobalDocLoader, nsDocLoaderImpl);
|
||||
if (nsnull == gGlobalDocLoader) {
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
NS_ADDREF(gGlobalDocLoader); // RefCount = 1
|
||||
}
|
||||
|
||||
rv = gGlobalDocLoader->CreateDocumentLoader(&inst);
|
||||
if (NS_OK != rv) {
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
*aResult = inst;
|
||||
NS_ADDREF(inst);
|
||||
rv = inst->QueryInterface(aIID, aResult);
|
||||
NS_RELEASE(inst);
|
||||
|
||||
done:
|
||||
return rv;
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocumentLoaderFactory::LockFactory(PRBool aLock)
|
||||
|
||||
// Entry point to create nsEventQueueService factory instances...
|
||||
|
||||
nsresult NS_NewDocLoaderServiceFactory(nsIFactory** aResult)
|
||||
{
|
||||
// Not implemented in simplest case.
|
||||
return NS_OK;
|
||||
nsresult rv = NS_OK;
|
||||
nsIFactory* inst = new nsDocLoaderServiceFactory();
|
||||
if (NULL == inst) {
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
else {
|
||||
NS_ADDREF(inst);
|
||||
}
|
||||
*aResult = inst;
|
||||
return rv;
|
||||
}
|
||||
|
||||
extern "C" NS_WEB nsresult
|
||||
NS_NewDocumentLoaderFactory(nsIFactory** aFactory)
|
||||
{
|
||||
if (nsnull == aFactory) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
nsDocumentLoaderFactory* it;
|
||||
NS_NEWXPCOM(it, nsDocumentLoaderFactory);
|
||||
*aFactory = it;
|
||||
if (nsnull == *aFactory) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
NS_ADDREF(*aFactory);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -344,7 +344,7 @@ protected:
|
||||
static NS_DEFINE_IID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
|
||||
static NS_DEFINE_IID(kChildCID, NS_CHILD_CID);
|
||||
static NS_DEFINE_IID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID);
|
||||
static NS_DEFINE_IID(kDocumentLoaderCID, NS_DOCUMENTLOADER_CID);
|
||||
static NS_DEFINE_IID(kDocLoaderServiceCID, NS_DOCUMENTLOADER_SERVICE_CID);
|
||||
static NS_DEFINE_IID(kWebShellCID, NS_WEB_SHELL_CID);
|
||||
|
||||
// IID's
|
||||
@@ -720,10 +720,16 @@ nsWebShell::Init(nsNativeWidget aNativeParent,
|
||||
NS_RELEASE(parentLoader);
|
||||
}
|
||||
} else {
|
||||
rv = nsRepository::CreateInstance(kDocumentLoaderCID,
|
||||
nsnull,
|
||||
nsIDocumentLoader* docLoaderService;
|
||||
|
||||
// Get the global document loader service...
|
||||
rv = nsServiceManager::GetService(kDocLoaderServiceCID,
|
||||
kIDocumentLoaderIID,
|
||||
(void**)&mDocLoader);
|
||||
(nsISupports **)&docLoaderService);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
rv = docLoaderService->CreateDocumentLoader(&mDocLoader);
|
||||
nsServiceManager::ReleaseService(kDocLoaderServiceCID, docLoaderService);
|
||||
}
|
||||
}
|
||||
if (NS_FAILED(rv)) {
|
||||
goto done;
|
||||
|
||||
Reference in New Issue
Block a user