nsIWebProgressListener can be used from either the parent process or the content process. In the parent process, you will not have access (except through shims) to the content window and its children. In the content process, you can access all that, but there are other APIs that you won’t be able to use. It depends what you wish to do when your listener is called.
When deciding where your progress listener should be placed, it is important to realise that there are three different kinds of progress listener: gBrowser.addTabsProgressListener; gBrowser.addProgressListener; and browser.addProgressListener. Note that not all of them strictly use the nsIWebProgressListener interface although they all look as if they do. There are lots of examples, but they don’t usually make it clear which type of progress listener is being used and why. addTabsProgressListener has some very useful “extras” such as onLocationChange() from tab switches, but obviously can’t be used in the content process.
Pick the right kind of listener for what you need and use it in the right place, it will save a whole bunch of headaches down the road.