IPDL/Five minute example: Difference between revisions

Jump to navigation Jump to search
No edit summary
Line 207: Line 207:


== Get the subprocess to launch ==
== Get the subprocess to launch ==
Here we reach a fork in the road of implementation.  You can either continue to follow this guide, which will walk through creating a new, dummy, non-Firefox main process, or you can roughly follow the steps here but adapt them so that they end up launching your subprocess class from the existing Firefox process.
'''REMEMBER''': these steps create a new, non-Firefox main process.
Create the directory <code>ipc/test-harness/app</code> and see that it gets added to the <code>TOOL_DIRS</code> var in your Makefile.  Create the file <code>ipc/test-harness/app/TestApp.cpp</code> with the following content.
#include "nsXULAppAPI.h"
#if defined(XP_WIN)
#include <windows.h>
#include "nsWindowsWMain.cpp"
#endif
int
main(int argc, char* argv[])
{
    return XRE_RunIPCTestHarness(argc, argv);
}
Now re-open <code>xpcom/build/nsXULAppAPI.h</code> and add the declaration
XRE_API(int,
        XRE_RunTestHarness, (int aArgc,
                              char* aArgv[]))
Re-open <code>toolkit/xre/nsEmbedFunctions.cpp</code>.  See that
  #include "mozilla/test/TestProcessParent.h"
  #include "mozilla/test/TestParent.h"
  using mozilla::test::TestProcessParent;
  using mozilla::test::TestParent;
get added somewhere in the file.  Add the following code.
//-----------------------------------------------------------------------------
// TestHarness
static void
TestHarnessMain(TestProcessParent* subprocess)
{
    TestParent parent;
    parent.Open(subprocess->GetChannel());
    parent.DoStuff();
}
static void
TestHarnessLaunchSubprocess(TestProcessParent* subprocess,
                            MessageLoop* mainLoop)
{
    NS_ASSERTION(subprocess->Launch(), "can't launch subprocess");
    mainLoop->PostTask(FROM_HERE,
                        NewRunnableFunction(TestHarnessMain, subprocess));
}
static void
TestHarnessPostLaunchSubprocessTask(void* data)
{
    TestProcessParent* subprocess = new TestProcessParent();
    MessageLoop* ioLoop =
        BrowserProcessSubThread::GetMessageLoop(BrowserProcessSubThread::IO);
    ioLoop->PostTask(FROM_HERE,
                      NewRunnableFunction(TestHarnessLaunchSubprocess,
                                          subprocess,
                                          MessageLoop::current()));
}
int
XRE_RunTestHarness(int aArgc, char* aArgv[])
{
    nsresult rv =
        XRE_InitParentProcess(
            aArgc, aArgv, TestHarnessPostLaunchSubprocessTask, NULL);
    NS_ENSURE_SUCCESS(rv, 1);
    return 0;
}
(Sorry, this CPS-like code is a little hard to follow.)
This code will not compile because <code>TestParent::DoStuff()</code> has not been implemented.  Everything else is set up though!
== Make the TestParent/TestChild do stuff ==
Confirmed users
699

edits

Navigation menu