fixing scriptability of IPC interfaces

fixing critical bug in DConnectStub::QueryInterface
adding JavaScript testcase for DConnect

NOT PART OF THE BUILD
This commit is contained in:
darin%meer.net 2004-07-14 00:14:45 +00:00
parent cb74580d03
commit 333b83915b
6 changed files with 114 additions and 9 deletions

View File

@ -44,10 +44,10 @@ VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = ipcd
XPIDL_MODULE= ipcd_dconnect
XPIDLSRCS = \
ipcIDConnectService.idl \
$(NULL)
include $(topsrcdir)/config/rules.mk

View File

@ -999,7 +999,7 @@ DConnectStub::QueryInterface(const nsID &aIID, void **aInstancePtr)
}
// else, we need to query the peer object
LOG(("calling QueryInteface on peer object\n"));
LOG(("calling QueryInterface on peer object\n"));
DConnectSetupQueryInterface msg;
msg.opcode_minor = DCON_OP_SETUP_QUERY_INTERFACE;
@ -1207,10 +1207,18 @@ public:
LOG(("got SETUP_REPLY: status=%x instance=%p\n", reply->status, reply->instance));
nsresult rv = CreateStub(mSetup->iid, sender, reply->instance,
getter_AddRefs(mStub));
if (NS_FAILED(rv))
mStatus = rv;
if (NS_FAILED(reply->status))
{
NS_ASSERTION(!reply->instance, "non-null instance on failure");
mStatus = reply->status;
}
else
{
nsresult rv = CreateStub(mSetup->iid, sender, reply->instance,
getter_AddRefs(mStub));
if (NS_FAILED(rv))
mStatus = rv;
}
}
nsresult GetStub(void **aInstancePtr)

View File

@ -0,0 +1,69 @@
/**
* This file contains code that mirrors the code in TestDConnect.cpp:DoTest
*/
const ipcIService = Components.interfaces.ipcIService;
const ipcIDConnectService = Components.interfaces.ipcIDConnectService;
const nsIFile = Components.interfaces.nsIFile;
const nsILocalFile = Components.interfaces.nsILocalFile;
const nsIEventQueueService = Components.interfaces.nsIEventQueueService;
// XXX use directory service for this
const TEST_PATH = "/tmp";
var serverID = 0;
function findServer()
{
var ipc = Components.classes["@mozilla.org/ipc/service;1"].getService(ipcIService);
serverID = ipc.resolveClientName("test-server");
}
function doTest()
{
var dcon = Components.classes["@mozilla.org/ipc/dconnect-service;1"]
.getService(ipcIDConnectService);
var file = dcon.createInstanceByContractID(serverID, "@mozilla.org/file/local;1", nsIFile);
var localFile = file.QueryInterface(nsILocalFile);
localFile.initWithPath(TEST_PATH);
if (file.path != TEST_PATH)
{
dump("*** path test failed [path=" + file.path + "]\n");
return;
}
dump("file exists: " + file.exists() + "\n");
var clone = file.clone();
const node = "hello.txt";
clone.append(node);
dump("files are equal: " + file.equals(clone) + "\n");
if (!clone.exists())
clone.create(nsIFile.NORMAL_FILE_TYPE, 0600);
clone.moveTo(null, "helloworld.txt");
var localObj = Components.classes["@mozilla.org/file/local;1"].createInstance(nsILocalFile);
localObj.initWithPath(TEST_PATH);
dump("file.equals(localObj) = " + file.equals(localObj) + "\n");
dump("localObj.equals(file) = " + localObj.equals(file) + "\n");
}
function setupEventQ()
{
var eqs = Components.classes["@mozilla.org/event-queue-service;1"]
.getService(nsIEventQueueService);
eqs.createMonitoredThreadEventQueue();
}
setupEventQ();
findServer();
dump("\n---------------------------------------------------\n");
doTest();
dump("---------------------------------------------------\n\n");

View File

@ -0,0 +1,29 @@
/**
* This file contains code for a "server" that does nothing more
* than set a name for itself on the IPC system so that the client
* can connect and control this process.
*/
const ipcIService = Components.interfaces.ipcIService;
const nsIEventQueueService = Components.interfaces.nsIEventQueueService;
const nsIEventQueue = Components.interfaces.nsIEventQueue;
function registerServer()
{
var ipc = Components.classes["@mozilla.org/ipc/service;1"].getService(ipcIService);
ipc.addName("test-server");
}
function runEventQ()
{
var eqs = Components.classes["@mozilla.org/event-queue-service;1"]
.getService(nsIEventQueueService);
eqs.createMonitoredThreadEventQueue();
var queue = eqs.getSpecialEventQueue(eqs.CURRENT_THREAD_EVENT_QUEUE);
// this never returns
queue.eventLoop();
}
registerServer();
runEventQ();

View File

@ -43,7 +43,7 @@ VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = ipcd
MODULE = ipcd_lock
EXPORTS = \
ipcLockCID.h \

View File

@ -42,7 +42,7 @@ VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = ipcd
MODULE = ipcd_transmngr
XPIDLSRCS = \
ipcITransactionService.idl \
@ -50,4 +50,3 @@ XPIDLSRCS = \
$(NULL)
include $(topsrcdir)/config/rules.mk