JavaScript document.domain Uncaught DOMException: Blocked a frame with origin
First, I would recommend, you read Same-origin Policy.
The same-origin policy is a critical security mechanism that restricts how a document or script loaded from one origin can interact with a resource from another origin. It helps isolate potentially malicious documents, reducing possible attack vectors.
Two URLs have the same origin if the protocol, port (if specified), and host are the same for both. You may see this referenced as the "scheme/host/port tuple", or just "tuple". (A "tuple" is a set of items that together comprise a whole — a generic form for double/triple/quadruple/quintuple/etc.)
In this particular case, you open a window with HTTPS protocol, however when you set the domain, the protocol is changed to HTTP, see image below:
As per 1, if the protocols are not the same, then its a violation of the principle and hence you get the error
Uncaught DOMException: Blocked a frame with origin "https://www.google.com" from accessing a cross-origin frame.
cross-origin is the keyword here.
Also, check out this SecurityError: Blocked a frame with origin from accessing a cross-origin frame for more details.
This error is not a bug. The same-origin policy is a security mechanism that ensures that window objects only have access to the informations they are authorized to get. In your case, this includes having access to opened.location
.
Upon creation, both tabs have the same origin, which allows the first one to access opened.location
. But after the call to document.domain='www.google.com'
, they don't anymore.
"What? But in both tabs, window.location.origin
are identical"
Yes, but it is a little bit more complex. The origin is defined by the scheme/host/port tuple, see @TheUnknown's answer for more details. The scheme and host stay the same all along, and they're the one included in the string of window.location.origin
.
The tricky thing to know is that any call to document.domain
, including document.domain = document.domain
, causes the port number to be overwritten with null
, therefore causing a difference in the two tabs' origins, and preventing them from communicating informations like opened.location
with one another, thus the error.
Informations extracted from MDN's guide on same-origin policy