Facebook reported that the worker reload seemed to be happening twice, and that the second load caused the ports to fail.
A quick look verifies that the first reload does happen twice. It then seems the second reload happens once, and after that reload no longer works correctly. I have not looked into the ports having an issue yet.
The unload handler is removing the worker from the global list of workers, then closing all ports. This caused two issues:
- The next call to getFrameWorkerHandle created a new frameworker instance, we would end up with multiple frameworkers per provider
- the closed ports cannot be reused (portid is set to null, never reset, then you cannot postmessage across the port)
The reason for the change over number of reloads seems to be that the worker can no longer send a reload message over the ports.
Created attachment 680822 [details] [diff] [review]
The first part of the patch is code removal.
Unfortunately the diff doesn't show enough context, so you need to look at the unload handler to see that we handle what I am removing later in the handler.
The second part of the patch causes the unload handler to run during termination. If we do not close ports here, we run into the cause of our "re activation" bug because the worker was not getting the port-close message on termination. We could live without the second part for 17 of the patch if we must.
I think that the code I removed may have been in the terminate function prior to adding the unload handler, but I didn't dig into history to verify that.
Created attachment 680826 [details] [diff] [review]
better fix after better understanding of what is happening there.
Created attachment 680845 [details] [diff] [review]
patch per IRC discussion
This doesn't fix the "close ports on terminate()" issue, but we can followup with that.
Comment on attachment 680826 [details] [diff] [review]
I also omitted the "ports = " change in my patch, since I think that line should just be removed (reload() already clears .ports). We need more tests here.
bug 811134 created for the terminate fix
Created attachment 680889 [details] [diff] [review]
updated patch with test
Created attachment 680898 [details] [diff] [review]
updated patch with additional test
This other test is from Mark, for the ".loaded" change.
Comment on attachment 680898 [details] [diff] [review]
updated patch with additional test
Try looks good, and Shane got confirmation from Facebook engineers that this addresses their problem, so I'm going to land this on beta.
followup test fix:
Created attachment 680950 [details] [diff] [review]
followup leak fix #2
First followup leak fix wasn't enough. Removing the deletion of the entry in the workerCache from the unload handler exposed a previously-existing problem: we were leaking the workers from the tests for bug 804910 until shutdown via the workerCache. This didn't come up until now because that line in the unload handler would clear the reference during shutdown, when the hidden window was unloaded.
Not my night tonight:
(thankfully all of the followup landings are test-only issues - no need to worry about them for b6)
Is there a way to test this? Any exploratory testing QA can do in Beta 6 to either verify this is fixed or check for potential regressions?
(In reply to Anthony Hughes, Mozilla QA (:ashughes) from comment #19)
> Is there a way to test this? Any exploratory testing QA can do in Beta 6 to
> either verify this is fixed or check for potential regressions?
Not really - the "reload" feature is not exposed via the UI (ie, there is nothing a user can do to invoke a reload). The tests should now reliably cover this though.
Okay, thanks Mark. Flagging this qa- for verification.