On a site that uses
boomerang, I found a particular JavaScript error happen very often:
TypeError: Invalid calling object
This only happens on Internet Explorer, primarily IE 11, but I've seen it on versions as old as 9.
I searched through stack overflow for the cause of this error, and while many of the cases sounded like they could be my problem, further investigation showed that my case didn't match any of them.
The code in particular that threw the exception was collecting
resource timing information for all resources on the page. Part of the algorithm involves drilling into
iframe
s on the page, and this error showed up on one particular
iframe
.
There are a few things to note:
("performance" in frame) === true;
frame.hasOwnProperty("performance") === false;
The latter is not a surprise since
hasOwnProperty("performance")
is not supported for window objects on IE (I've seen this before when investigating
JSLint problems.)
There was no problem accessing
frame.document
, but accessing
frame.performance
threw an exception.
frame.performance; // <-- throws "TypeError: Invalid calling object" with error code -2147418113
frame["performance"]; // <-- throws "TypeError: Invalid calling object" with error code -2147418113
In fact,
frame.<anything except document>
would throw the same exception.
So I looked at the
iframe
's document object some more, and found this:
frame.document.pathname === "/xxx/yyy/123/4323.pdf";
The frame was pointing to a PDF document, and while IE was creating a reference to hold the
performance
object of this document, it prevented any attempts to access this reference.
I tested Chrome and Firefox, and they both create and populate a
frame.performance
object for PDF documents.