So I tried leaving in the pseudo URLs (i.e. 'javascript:...') but removed the part where the body style is set to cursor: wait. However the problem still occurs so it seems like it's more related to using the pseudo URLs than it is to setting the cursor style specifically. This is based on the fact that, if we go back to the old style of "real" URLs for the iframes, the problem doesn't occur.
That little clue triggered a faint memory and I found ICE-7085. With IE, if you use document.write() in an event handler (or presumably as we are doing here as well), you need to call document.close() when you are done to help IE know when the document is fully "loaded". Otherwise IE helpfully leaves up the wait cursor indicating that there might be more content to come. Even if the iframe is replaced/removed. In ICE-7085, the code already had the document.close() code. But somewhere along the way, it was lost.
In the latest version of status.js, the off function of the overlay has the document.close():
off: function() {
if (this.overlay) {
if (/MSIE/.test(navigator.userAgent)) {
var overlay = document.createElement('iframe');
overlay.setAttribute('src', 'javascript:document.write("<html></html>");document.close();');
but the on function did not (lost in a previous refactor I guess):
on: function() {
if (/MSIE/.test(navigator.userAgent)) {
this.overlay = document.createElement('iframe');
this.overlay.setAttribute('src', 'javascript:try{document.write(\'<html><body style="cursor: wait;"></body><html>\');}catch(e){};');
Adding a "document.close()" call after the document.write() appears to do the trick as I no longer see the wait icon in IE 8 or 9 using the test app. Resolving as fixed.
This seems like a regression in P04&P03. The problem was not reproducible with ICEfaces 1.8.2 EE P02.