Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Will a browser give an iframe a separate thread for JavaScript?

Do web browsers use separate executional threads for JavaScript in iframes?

I believe Chrome uses separate threads for each tab, so I am guessing that JavaScript in an iframe would share the same thread as its parent window, however, that seems like a security risk too.

like image 867
jedatu Avatar asked Jul 16 '12 18:07

jedatu


People also ask

Can you use JavaScript in an iframe?

As long as the protocol, domain and port of the parent page and iframe match, everything will work fine.

Are iFrames bad practice?

Iframes Bring Security Risks. If you create an iframe, your site becomes vulnerable to cross-site attacks. You may get a submittable malicious web form, phishing your users' personal data. A malicious user can run a plug-in.

Is browser single threaded or multithreaded?

Browsers aren't single threaded, but your script runs in a single runloop.

Does iframe work in all browsers?

The iframe element is supported by all modern desktop and mobile browsers.


1 Answers

Recently tested if JavaScript running in a iFrame would block JavaScript from running in the parent window.

iFrame on same domain as parent:

  • Chrome 68.0.3440.84: Blocks
  • Safari 11.0.2 (13604.4.7.1.3): Blocks
  • Safari 15.1 on iOS: Blocks
  • Firefox 96: Blocks

iFrame on different domain as parent

  • Chrome 68.0.3440.84: Doesn't block
  • Safari 11.0.2 (13604.4.7.1.3): Blocks (outdated, but I don't have a macbook)
  • Safari 15.1 on iOS: Doesn't block
  • Firefox 96: Doesn't block
  • Chrome for Android 96: sometimes Blocks and sometimes Doesn't block (There are some complex rules in Chrome for Android that determine when Chrome for Android does and doesn't isolate a process, see chrome://process-internals and chrome://flags)

parent.html:

    <body>     <div id="count"></div>     <iframe src="./spin.html"></iframe>          <script>         let i = 0;         let div = document.getElementById("count");         setInterval(() => {             div.innerText = i++;         }, 100);     </script>     </body> 

spin.html:

    <body>     <button id="spin">spin</button>     <script>         const spin = document.getElementById("spin");         spin.addEventListener('click', () => {             const start = Date.now();             while (Date.now() - start < 1000) { }         })     </script>     </body> 
like image 90
WearyMonkey Avatar answered Sep 28 '22 07:09

WearyMonkey