No; that's the thing – if you defer the window.close to *any* kind of later callback (be it via a setTimeout, or an onmessage handler waiting for that "ack" ping) that makes the window.close happen in an execution context that was not directly initiated by a user action, window.close will fail to close the window.
That is at least my take on it, after having done some heavy testing about which conditions make window.close fail when it seemingly shouldn't. If you have anything more concrete about what can be done to have a message handler waiting for the ack not lose window.close privileges, I would be very interested, though. It at least fails on Chrome 9.
Which is why I want to be sure there is a guarantee that postMessage calls do happen, whether the window was closed immediately after they were scheduled: there is no way for the script code itself to verify that yes, it went through; you only have one attempt to close it, and can't wait until after you verified that it (whatever) happened.
(In my case, it's not an extension popup, but an html dialog opened by window.open from the background page right after initial install time, asking whether the user wants to opt in to a feature, with "yes, please" and "no, thanks" buttons, each of which report back to the background page that stores the choice in localStorage – and I want to be sure we never bug the user by asking twice.)