Saturday, May 11, 2024
 Popular · Latest · Hot · Upcoming
72
rated 0 times [  74] [ 2]  / answers: 1 / hits: 64444  / 11 Years ago, mon, april 8, 2013, 12:00:00

Background: I'm doing some user interface tests that need to detect if people are paying attention or not. But, this question is not about the page visibility API.



Specifically, I would like to know how my Javascript code will be affected if the current tab is not active, or the browser window is not active, in different browsers. I've dug up the following so far:





I have the following questions:




  • Other than mobile browsers, do desktop browsers ever pause JS execution when a tab is not active? When and which browsers?

  • Which browsers reduce the setInterval repeat? Is it just reduced to a limit or by a percentage? For example, if I have a 10ms repeat versus a 5000ms repeat, how will each be affected?

  • Do these changes happen if the window is out of focus, as opposed to just the tab? (I imagine it would be harder to detect, as it requires the OS API.)

  • Are there any other effects that would not be observed in an active tab? Could they mess things up that would otherwise execute correctly (i.e. the aforementioned Jasmine tests)?


More From » browser

 Answers
12

Test One



I have written a test specifically for this purpose:

Frame Rate Distribution: setInterval vs requestAnimationFrame



Note: This test is quite CPU intensive. requestAnimationFrame is not supported by IE 9- and Opera 12-.



The test logs the actual time it takes for a setInterval and requestAnimationFrame to run in different browsers, and gives you the results in the form of a distribution. You can change the number of milliseconds for setInterval to see how it runs under different settings. setTimeout works similarly to a setInterval with respect to delays. requestAnimationFrame generally defaults to the 60fps depending on the browser. To see what happens when you switch to a different tab or have an inactive window, simply open the page, switch to a different tab and wait for a while. It will continue to log the actual time it takes for these functions in an inactive tab.



Test Two



Another way to test it is to log the timestamp repeatedly with setInterval and requestAnimationFrame and view it in a detached console. You can see how frequently it is updated (or if it is ever updated) when you make the tab or window inactive.





Results



Chrome

Chrome limits the minimum interval of setInterval to around 1000ms when the tab is inactive. If the interval is higher than 1000ms, it will run at the specified interval. It does not matter if the window is out of focus, the interval is limited only when you switch to a different tab. requestAnimationFrame is paused when the tab is inactive.



// Provides control over the minimum timer interval for background tabs.
const double kBackgroundTabTimerInterval = 1.0;


https://codereview.chromium.org/6546021/patch/1001/2001



Firefox

Similar to Chrome, Firefox limits the minimum interval of setInterval to around 1000ms when the tab (not the window) is inactive. However, requestAnimationFrame runs exponentially slower when the tab is inactive, with each frame taking 1s, 2s, 4s, 8s and so on.



// The default shortest interval/timeout we permit
#define DEFAULT_MIN_TIMEOUT_VALUE 4 // 4ms
#define DEFAULT_MIN_BACKGROUND_TIMEOUT_VALUE 1000 // 1000ms


https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296



Internet Explorer

IE does not limit the delay in setInterval when the tab is inactive, but it pauses requestAnimationFrame in inactive tabs. It does not matter whether the window is out of focus or not.



Edge

Starting from Edge 14, setInterval is capped at 1000ms in inactive tabs. requestAnimationFrame is always paused in inactive tabs.



Safari

Just like Chrome, Safari caps setInterval at 1000ms when the tab is inactive. requestAnimationFrame is paused as well.



Opera

Since the adoption of the Webkit engine, Opera exhibits the same behavior as Chrome. setInterval is capped at 1000ms and requestAnimationFrame is paused when the tab is inactive.



Summary



Repeating intervals for inactive tabs:




setInterval requestAnimationFrame
Chrome
9- not affected not supported
10 not affected paused
11+ >=1000ms paused

Firefox
3- not affected not supported
4 not affected 1s
5+ >=1000ms 2ns (n = number of frames since inactivity)

IE
9- not affected not supported
10+ not affected paused

Edge
13- not affected paused
14+ >=1000ms paused

Safari
5- not affected not supported
6 not affected paused
7+ >=1000ms paused

Opera
12- not affected not supported
15+ >=1000ms paused

[#79062] Saturday, April 6, 2013, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
beatriceisabelad

Total Points: 710
Total Questions: 107
Total Answers: 99

Location: Cayman Islands
Member since Sat, Sep 17, 2022
2 Years ago
;