I run a real time charting platform for Bitcoin traders (like those using BitMEX) and the app does a lot of updating/refreshing. I recently learned of the visibilitychange API and managed to make huge improvements in the app's performance when running in the background - on the order of ~75% reduction in CPU usage when running in the background. [1]
var doVisualUpdates = true;
document.addEventListener('visibilitychange', function(){
doVisualUpdates = !document.hidden;
});
Basically, you can use this to determine if your tab is running "in the background" and avoid redrawing/refreshing components to show updates that won't ever be seen.
Yeah - that's a really great trick! You can also get this somewhat "for free" by batching updates on `requestAnimationFrame`, which never fires when unfocused.
But if you do this, isn't it possible that you'll queue up tons of re-renders that all go off when the tab comes back in focus? I'm thinking of React for example, where you might re-render a component with updated props several times per second. In my case, I've settled on just not re-rendering at all, and then doing so once with the latest props when "visibility" fires again with document.hidden === true.
Why should the browser rely on the webpage developer to tell it to not redraw things in a tab that isn't the visible one? The browser by default shouldn't redraw content in a tab that isn't visible. This seems like the most obvious thing in the world.
It depends on how you define "Visibility changes".
What might he be talking about? Well, it works something like this...
- The app fetches data from a server.
- The data is processed. This may be cheap, or expensive.
- The DOM is updated.
- The page layout is recomputed.
- The browser window is redrawn.
Certainly, the browser could skip the last step for invisible tabs. It can't skip redoing the layout, as the JS can read the computed layout back out; at most it could do the computation lazily, but that would be extra code and complexity. Everything prior to that step isn't under the browser's control.
The web-app coder could act on every single step in the chain, starting by throttling data fetches.
Because some websites might still need to work when not in focus. E.g. If you are showing animations or videos in a window, but the user wants to answer an IM in another window without interrupting the animations.
It doesn't need to do the final step of rendering - but it still needs to reflow the page whenever you change the DOM, because information from that reflow is accessible to javascript.
If you happen to use React, I built a React component that helps you manage this! :) Hopefully it helps a bit! It also reports whether or not a user is idle, such that you can reduce cpu usage during that as well.
Hi, this is Alexander. I'm an engineer on Chromium team working on scheduling and on background tab throttling in particular.
Firstly, I want to make clear that we are not shipping this in Chrome 56. We have enabled throttling as an experiment in beta channel to measure impact and collect feedback from web devs. We will aim to ship it in Chrome 57, subject to further feedback.
In response to concerns voiced we will disable aggressive throttling when active websocket connection is present. Tabs playing audio are already unthrottled.
We will also consider more signals to use in exempting a page from this throttling: metatag, pinned tabs, permission to show notifications from user. Please leave a comment in the bug (crbug.com/650594) if you have other suggestions.
If a page signals it's desire to opt-out of aggressive throttling, the user should be notified of this, perhaps by an icon in the tab, so that we can either close it or force the throttling.
I'm a laptop user and CPU-hungry background tabs are a huge drain on my battery life. If something is opting out of or otherwise excluded from throttling, I want to know about it.
While I agree with you in theory, this will only help a small fraction of us techie users. The average user is going to see a new, weird icon on their eBay Auction tab and call their computer company to ask them what it is and if they're being hacked.
When I did support for Apple Care, every single update if it had new or extra icons we always got lots of calls like this.
Then you have a fav icon, the page title, possibly a mute icon, a close icon and a throttle icon? The mute icon and page title aren't visible anymore as it is with many tabs open, so adding another icon doesn't sound like a good idea, especially if visibility is important.
I'd like to see the user better informed of hot (active) tabs. Just like there's an audio icon to help the user track down which tab is making noise, there should also be some mechanism to let the user know that a tab is more active than usual.
I'd recommend a different background color for the tab, except that I'd also like to see (sign in) profiles have distinct background colors to aid the user in keeping their profiles straight.
Color change on the tab would be nice - maybe have it slowly grow more red (and perhaps add an option to change the color as well - for colorblind folks) - then start blinking - then burst into flame...
While I've only seen it once, when I looked at it upon learning of its existence- the Chrome 'task manager' might show CPU usage of each tab. When I look at all the chrome.exe processes in the Windows Task Manager, the CPU usage is clear, but I can never tell which process is which tab. Something like a glowing tab coloration animation would be an unobtrusive informational thing, that would work even when tabs are pinned & too tiny to display a meter type thing inside them. Maybe if there could be a 'pause' button that appears on hover to allow this throttling to be engaged or not. Sounds like something to this extent might be a successful extension, then maybe if it sees broad adoption it could be implemented permanently.
This made me picture one of the old school nintendo games where your character starts sprouting flames when on a hot streak. There are times I would like to see flames flying off tabs that are pegging my cpu.
> In response to concerns voiced we will disable aggressive throttling when active websocket connection is present. Tabs playing audio are already unthrottled.
The pages that are most aggressive in being a drain on resources, in my experience, are also using websockets to constantly load in new advertising and JavaScript and other garbage. Just "the page has a WS open" should not be enough to keep a page unthrottled without providing the user a chance to change that behavior.
I second this. I'm generally a fan of efforts to reduce the CPU usage of background tabs (as one who constantly finds himself with an embarrassing number of open tabs), but I need to be able to control which tabs I absolutely don't want throttled.
Not the greatest solution, considering Pinning isn't documented anywhere and most Chrome users have no idea it exists. Which is a shame, as pinning is probably my favorite browser feature.
Pinned tabs definitely should be excluded from throttling. Pinning tab for me usually means that I want to keep track of something, which usually is my email, chat client, etc. I don't want to be notified about new email on my phone before I get that notification on PC, which is already happening too often. That's just unnecessary hassle.
Though I'm not sure how popular this feature is and I would vote for other ways to turn throttling off, especially for those which prompt user about it.
> We will also consider more signals to use in exempting a page from this throttling
The main problems I have with background tabs and resource use is advertising iframes on otherwise inert pages. iflscience.com and sometimes imgur.com are two notable offenders here in my experience.
Advertisers will opt of anything that might throttle their content whether they need to or not, without testing if they need to, just in case. so if there is an opt out I expect it to be abused such that this pain point will not go away.
As well as asking if a particular domain should be allowed to unthrottle itself as others have suggested (or instead of if there is a fear that extra UI interactions will confuse the user) perhaps you could only allow it if the top level frame also opts out? This would give control back to the main page maintainer and if used in combination with the prompts could confuse less technical users less (the request for unthrottling comes from a recognised name like iflscience.com not content.idofmachineinfarm.r438957432t43.somecompanyyouveneverheardof.com)
> disable aggressive throttling when active websocket connection is present.
How is "active" defined here? I foresee advertisers opening a websocket that does as little as possible in order to get a prompt-less lifting of the throttle...
> Tabs playing audio are already unthrottled
I'd love to reverse this and punish tabs that play audio in the background! (or to allow for genuinely useful uses, such as message alerts, punish those that play more then 5 seconds of audio in a minute, unless tey are whitelisted).
I think the heart of it is that "using my resources in the background" needs to be 100% opt-in. All webpages should be frozen and use 0 CPU/RAM unless the user grants them permission. I can think of only a handful of sites I would grant this permission to - mainly "apps" such as Google Inbox, Slack etc.
There should be a way to force-enable this for tabs, even foreground tabs. Some sites are just terrible.
I'd also appreciate it if nothing the website can do can override that. If I mute the audio, then it shouldn't be a signal, and you'll want to avoid using signals which the websites can trigger without user action.
Honestly, I'd prefer if there was some way to entirely suspend event processing on a tab, or at least timers.
Hi Alex, I appreciate your work. My macbook air is getting pretty slow and this is the best free performance boost I could ask for. keep up the good work.
Is this some sort of reaction to Microsoft's over the top desktop ads campaign against Chrome?
Make no mistake, I do believe Chrome could benefit from this, and I do believe what Microsoft is doing is skirting the edge between ethical and non-ethical (okay, I think it's sleazy). But it just seems like a curious coincidence.
There should be a way to opt out of this per domain, the way a user opts into Notifications API, Webcam API, etc. A website should be able to ask permission to not be throttled this aggressively.
In addition to automatically inferred signals, it would be great to give the user optional complete control over throttling as well at a per-tab level. I.e. a switch somewhere that user can freely enable/disable for a given tab to mark it throttled vs. unthrottled, whatever the right terminology would be.
I provide notification access to news sites, not sites I want constantly burning my CPU. This is "throttling", not "100% suspending forever", right? There's no good reason to give more CPU to these tabs that might be occasionally wanting to tell me something from the background: as they are in the background that's the only thing they should be doing, and if they are currently doing other things they should have a strong incentive to stop doing all that other stuff when they detect going into the background: there should be no exemption for tabs with notification access.
User should have a way to enforce throttling on all tabs. e.g. I always have my iPhone on low power mode. Its the users choice, not the developers. As much as I hate saying that as a developer.
As an example - I never listen to audio/video in a background tab, but I have to suffer battery loss because of features that I have no plans to use.
The Apple model of asking user for permission when it notices that a background app is reading your location could be a good model to follow. That way, when you notice a frequently battery hogging domain in the background, even if it uses web sockets, etc., you still prompt the user to throttle.
Pinning a tab has the side-effect of shrinking its title bar to just the icon. I use the text on there to communicate alerts / information to users. (Maybe pinned will enlarge if document.title is changed or something don't know never use it). So hopefully there is another way. To me `site settings` `Throttle this site when in the background, Warning: this may slow your machine and consume additional battery resources`
To me the fundamental issue is one of user control. If the user wants the site to run in the background, great. However a lot of times they don't even know that it is and, surprise! the battery is drained, or everything is running slow and it's time to press shift+esc and stare at the jumping percentages in the task manager.
So to that end, communicating what's going on to the users, is I think pretty important so hopefully:
* A Visual Indicator on the tab, similar in spirit to the speaker or red recording circle, that conveys
1. Tab is fully utilizing its throttle.
2. Tab has throttling disabled by user-request.
And then to give users control:
* The ability via `site settings` to disable the throttling, however if a site is using excessive background resources, some sort of ui should show indicate such.
(A lot of this would be almost trivial by showing little cpu use bars, with a line where the throttle is, but it might look kind of ugly)
Even though this is going to break some of my apps, I can see a greater good here, and I am 100% for helping out with battery life, and preventing my machine from being some sort of ad network computation shard. So I am fine with this being the default option even though it will break apps I have written. They are mostly in house tools so as long as I can instruct users to override the throttle, provided I am given that option, which it seems like I will be.
I would figure that for larger more public facing devs, the experience might be a bit more tedious. Perhaps a unthrottled-background permission request API can be done. And hopefully for legacy sites that won't be updated, the visual indicators above will clue users in as to fact that the browser is throttling the site. Perhaps ugh I hate even suggesting this, a nag bar could pop up when the user navigates back to the tab to inform them that the site was aggressively throttled.
Anyhow, I am glad you guys are getting out ahead of this, I think this stuff is going to get worse as sites seek to run more code on our machines in ways we cannot easily discern. So I actually don't like that workers / websockets / audio work around aggressive throttling, because the bad actors are just going to use that to burn cpu in the background without the users consent. Hopefully if executed well, with a helpful ui, this can be used to stop any unwanted and often unseen but still felt cpu waste while allowing sites the user actually does rely on to continue working.
ps, I'll cross post this to your tracker as well as you requested, I just know that leaving it here will get more eyeballs from a larger community to give their feedback as well.
I meet many tab hoarders (always open a new one, never close any, ending up with hundrets), but just can't wrap my head around it!
I hate having more than 6-7 simultaneously open because it gets increasingly harder to keep an overview of what you're doing. The same applies for IDE tabs or windows. Too much of them and finding the right one becomes increasingly hard, and losing the thread more likely.
When I am doing coding work, I often have a ton of tabs open. I will keep different documentation tabs open to the relevant sections. I will keep some tabs with answers on StackOverflow.
My open tabs are kinda like my working memory. I could close them and reopen them as needed, but it is easier to just click a tab then to try to find the thing again. In addition, sometimes the pages I am looking at have dynamic navigation, and closing and reopening the page will require a good deal of navigation to find the section I was looking at. Plus, the overall time to reload the content, where if I just have the tab open there is no download time.
Also, the tab icons help me remember what I was looking at. I will often keep tabs open for what I wanted to read later.
There might be a more effective way to accomplish what I do with many tabs, but it works for me at the moment so I haven't attempted to find a browser plugin or extension to change the behavior.
I use many tabs as a stack of pages when debugging, researching, or reading aggregate news feeds (reddit, hn). It usually starts with a Google search or two, in which I open all links I think _might_ be relevant based off of what information google can provide me from the results page.
From there I read through each and open any further tabs if anything is linked too in the text (I hardly ever actually click navigate, it's most always a new tab). Generally this only goes about 3 deep (search, first page, sub links). I will close any pages that I find have no useful information, but if there is anything I think might be useful in the next 30 minutes I just leave it open. I do this for each of the results I originally opened. Somewhere in the 7-15 tabs generally is the answer I'm looking for or at least there is enough information I can answer my question. If any link is particularly beneficial, I will bookmark it. Generally the time span I have a large number of tabs open is no more than an hour before I'm finished and close everything out.
Chrome handles this nicely, if you are on a page and open a tab, it will place the new tab next to the current tab, instead of at the end of the tab list. Some sort of tree tab view would probably work much better for this, but Chromes behavior isn't bad for what I do.
I use my tabs as a task list. I close them once I have read the page, taken action on the knowledge in the page or decided it was too stale to matter anymore.
If you have to deal with a lot of task switching, blindly closing browser tabs would be a huge waste of time. You can individually check each tab before closing the ones you don't need, but that takes time and cognitive load.
So I leave them open until the computer can't handle it.
I use my tabs like a generational garbage collector. Tabs to the left of the current tab are processed, tabs on the right are to-be-processed. I'll go to a page like reddit or HN and spin off a dozen tabs of things to read. Then I'll go through one by one and either process, delay or close.
Once I reach about 250 - 300 tabs, I'll do a longer generation sweep and go through all the tabs and try to get it down to less than 100 or so.
Basically, I'm never in need of finding any specific tab. If I want the content from that tab, I'll just open a new one and navigate back to that point. The tabs are really a lightweight to-read list.
I am a tab hoarder I guess. I use them to organize my work. Every window is a project (right now I have 5 of them) and all the tabs (20-30) are mostly resources I need to fulfill them. If I have completed a project or decided to stop working on it I close the window and get rid of all project related pages at once.
I don't use favorites or bookmarks because usually I don't need a link permanently.
Edit: I actively try not to get too many. If it starts to hide the title/favicon completely I start to close them again until I can recognize them by title without clicking through them.
Tabs are a todo list. I've currently got two pinned tabs open, JIRA and bitbucket tabs that act as placeholders, one unfinished email, one spotify playlist for work, one podcast, and 6 articles to read. And that's only because I recently restarted Chrome. I can easily have 20+ tabs open if Chrome has been running for a week or two.
I use it like a kind of mental stack or breadcrumb. The tabs most relevant to my current task are on the right, usually no more than three. The rest of the tabs is how I got there, occasionally serving as references. Once I get to the point of making it hard to tell one from the other I tend to do a garbage collection sweep. Sometimes, when switching context, I just reopen Chrome to clear the stack.
Incidentally, the note papers floating around on my desk works in a similar way, although they are more of an unordered set. Only one or two are relevant, the rest were helpful at some point but no longer are. Cleaning my table usually results in me dumping the whole thing in the dustbin.
Why do you need an overview? It's like stack frames: you can limit your scope to what you're currently doing. The other tabs represent stuff that's "parked" and you aspire to come back to.
(This is why tabs are better than windows for this, because they maintain a linear order while most systems will re-order window order if you visit the windows)
My tab-opening habits predate tabs, because I was raised on Netscape Navigator with a modem using "open in new window" instead. I would read down a page and open interesting-looking hyperlinks in the background, so I didn't have to wait for them to load. Another advantage of this technique on modems was that I could close down the line and carry on reading.
For me, it's more that I use my tabs as reminders for things I need to do or things I want to read (I know, this is a pretty bad system, and I try to use a better to do list and tools like Pocket on top of tabs, but I always seem to drift back to just tabs simply because it's the lowest effort system for me to ensure I remember). If I'm working, I'll generally just open a new window and keep the tabs I'm actively using there and get to the backlog later.
I tend to lean towards tab hoarding. I use Tab Corral to automatically close out old tabs, which works out pretty well. Rather than having to evaluate whether I still need a certain tab up, it quietly closes it after a bit, usually once I've forgotten about it.
The tabs are transient todo list. This is something I need to finish researching, this is a documentation to what I'm working on, these are 3 great articled I want to read in the evening.
The combo of The Great Suspender + Session Buddy makes tab management so much better, and easier on resources.
Leave open the tabs you know you'll need soon(ish) and let the Great Suspender throttle them, and save (then close) groups of tabs/windows you won't need right away using Session Buddy.
Seconded. Chrome used to crash ~1/month on me but ever since I started using The Great Suspender I haven't had a single incident and it's been well over a year.
Is there anything that does the opposite of this? A lot of our current tests run in a browser window, and generally I leave it in the background as I don't want to stare at my tests running. However, when they are backgrounded they slow down and sometimes fail due to timeouts. I haven't actually tried, but does opening a new window get around this even if it does not have focus?
Unfortunately, I find a lot of sites don't play nice with The Great Suspender. Lots of js-heavy sites would break when they were "resumed", resulting in my place in an article/podcast/video/etc being lost. I'm glad Google is addressing the issue; hopefully they'll do so in a way that's more transparent to the user.
If you are using The Great Suspender, chances are that background tabs are going to be fully suspended so the aggressive throttling isn't even needed.
tl;dr - Great suspender is even "more aggressive" than the outlined throttling, as it fully suspends the page and returns all CPU and RAM to you, so it's a great solution for people interested in throttling background tabs.
I like the change as a general idea but there obviously needs to be a manual override. Like, I don't want websites to access my camera without permission but obviously I want to allow some websites to do that. A similar permission could be used here and is perfectly backwards compatible:
1. a tab exceeds its quota and throttling kicks in;
2. you visit the tab to check why it stopped working;
3. you get a permission pop up (like all others) once you visit the tab again, asking you whether you want to allow it unlimited resource usage, noting that it'll decrease battery life of your device.
While this is elegant, its still dangerous. There are online payments that could check whether your booking is complete in the background by periodically firing ajax calls, bulk updates or uploads, etc.
I don't want to have to pin every single tab I want unthrottled - that's a mixing/piggybacking of otherwise orthogonal concerns. Just make it a separate option I can set per tab.
This would be great. At the very least, I'd like the power to un-throttle a tab myself if I decide to do so - even if there's no prompt, it's important to me that I can let a process run full-speed in the background. Losing that would actually decrease the value of Chrome quite a bit for me.
The amount of people that will understand what that means is not very substantial. Usually asking for more permissions confuses users as well, people get permission fatigue.
request for location doesn't require the page to explicitly indicate a desire, the request is triggered if the page attempts to use the location services of the JS API. sites that want to run unthrottled can't be identified simply by the usage of a certain API, so the developer would need to add something explicitly to their markup to indicate the desire.
i want control over the feature regardless of whether or not the site's developer deems it appropriate.
That's less "backward compatible" than the suggestion to pop up a dialog on switching to the page, because the page needs to know to ask for the permission.
I'm not sure if that's a good thing or a bad thing. After all, backward compatibility is how we got the semantics of an alert() dialog stopping all JS execution.
Every website would start showing such popup. Now (if you have enabled Javascript) many sites show popup to allow notifications the moment you open them. That is annoying when you search for something in Google and have to click "No" for every new page opened.
Seems like the current solution they're advocating for is for sites to do background processing in a [Worker][1].
This seems like a step towards the way things work with mobile apps currently, where the app's main thread gets suspended when its not in the foreground, and background processing happens in separate threads which the user has some degree of control over.
Edit: I meant regular `Worker`s, not `ServiceWorker`s.
Except it should probably be web workers that are unthrottled. However, in the current implementation Web workers do get throttled. Service workers are supposed to be for networking and offline applications, not doing cpu related things. As such, service worker lifetimes are really messy since they don't have real guarantees as to if they will randomly restart.
There's no way to know whether or not it has a battery. Maybe it's on a UPS, for example.
All I know is that my desktop runs at about 70W idle vs. 450W fully-loaded. Unnecessary use of the CPU wastes money regardless of whether or not you're using that money to charge a battery.
Even on a desktop machine, you don't want tabs spinning in the background (using electricity) if you don't need the work being done. That's bad for your wallet and bad for the environment.
What are we supposed to do about stuff this? Like I wrote a video game https://play.basketball-gm.com/ that lets you open multiple tabs for viewing multiple screens even while simulation is occurring in another tab. But Chrome recently stopped running the simulation if it's in a background tab. Putting my simulation code in a Shared Worker would be nice, except Safari and IE will never support it and it seems likely to be deprecated soon. Service Workers kill anything that takes over 30 seconds, so no long running processing allowed. What do I do? Go back to writing desktop apps that nobody will install?
Their own Google Play would be impacted otherwise. Good to hear, since the only thing I use Chrome for is Google Play (and any other, one-off, old-fashioned sites which require Flash). Why in the world does Google still require Flash for... anything?
This isn't a full solution, but perhaps inter-tab communication would work? Use whichever tab is focused as the master, then other tabs send messages to the primary as they need work done. It wouldn't work when none of your tabs are focused, but perhaps that's an acceptable constraint.
That might work, but it's much more complicated and given the issues I'm already facing, I wouldn't want to rely on that communication actually happening (maybe background tab won't be able to send a signal to the foreground tab, since JS is apparently not running in the background tab).
Yes? I mean, you have to admit what you built is the epitome of edge case when it comes to how a browser is typically used, and is actually exactly the type of thing they want to optimize because basically if you aren't looking at the tab, it's not being used (generally).
As a developer you need to decide whether or not to support a browser, and if that browser doesn't provide the APIs you need then you should drop support for that feature in that browser. In this case, if Chrome is making a change that you can't or won't change your game for then the solution is to detect Chrome and display a "This game only works in a single tab in Chrome. Try Firefox!" message if a user opens it in a second tab.
Make it a single page thing and spread the image out over multiple desktops. Make it a real desktop app instead. I do think Chrome / Google is (if they go through with this) actively going to fight against using the browser as an application platform though. At the very least they should give notifications to webapps that they are about to go to low-power mode, act differently when on a power cable, and check whether the tab is visible or not.
It is. But then you open it in multiple tabs, because that's how people use websites.
Unless I'm supposed to re-implement tabs within my single page application and then force it to only let one tab run, which I guess is possible but horrible :)
As a workaround, in the meantime, have you tried using several windows, not just tabs? Of course, none of them can be minimized, but they can be covered by other windows and should still run.
Nowadays, one writes ad-supported mobile games that nobody will pay for. ;)
Would it be possible to just declare "Best played in Firefox?" It's a bit gauche, but if a browser's engine has a behavior that isn't really compatible with what you intend to do, that's the browser's fault.
Could you create a tabbed interface that is just a dumb view of a server state communicated over websockets? Then the user could just open the page in n windows (each on its own tab) and have the same state represented in each?
Problem is, there is no server. All client side. So the tab on which you click "run simulation" is effectively the "server", except it stops running when the user switches tabs.
How about displaying more info about the "weight" of a page, when it comes to downloaded assets, cookies / local storage, RAM and CPU usage? I know there are ass backwards and fugly ways to see all of that, but why can't I see a list of all open tabs, with columns of such info which I get to define and sort as I please? Why not have the option to that info pop up when hovering over a tab, and to show notification icons for certain thresholds, user definable with sensible defaults? There's a lot of things browsers should be doing. So what if 100 people don't care; the one person that does become more aware of what is going on more than makes up for it. *
And just let us allow tabs to grab all the resources they want on a opt-in basis. Why not?
* Before anyone brings up the inevitable economic argument - it wouldn't take a lot of man hours to do these things, I dare say it would just take one or two persons who are capable to be willing and allowed to do them. And compared to all sorts of things that browsers vendors made and get scrapped, you at least know tabs will always use ram, CPU and load assets over the network, so it's not ever going to be completely useless.
What I'd like is popping up plain warnings aimed at regular, non-tech user. "These tabs are currently slowing down your computer: <list>." Or, "This tab uses a lot of battery power."
Besides directly providing information that is relevant to a typical user, I'd hope such a solution would finally put some pressure on the companies to optimize their webpages.
Yeah, make that "allow docking the task manager". Though I still miss a total about how many bytes got downloaded, average speed etc. I also miss it in other browsers (though I should have made that more clear, I wasn't meaning to "bash Chrome" -- this frustrates me since the departure of old Opera, with all browsers, I love the powerful web API stuff but I hate the user interface directions).
And to repeat myself, I really do miss something akin to the icon that displays which tabs are playing sound -- not for myself, but because it would allow people to notice the difference between bloated and well crafted pages more easily.
I appreciate they prefer to automatically decide what is best, but I would prefer more gauges, at least as an accessible option. If you hide something behind an "advanced" label, it will just scare people off for no reason. It's not like configurations dialog aren't kinda barren and padded as is. Just fix that and then just put things there, neatly categorized and maybe even searchable, and explain them. People can drive cars and vote for politicians, but we can't trust them to read? Just about any image viewer or video player seems to think more highly of people than browsers of all things do.
Yes. The browser is slowly becoming it's own operating system. Like Oracle making a bare-metal version of their database, pretty soon, Google will just skip ChromeOS, bundle Chrome with a storage driver, input driver, and video and sound drivers, and be done with it.
It's not everything you asked for, but as it stands Chrome does have a task manager (Shift + Esc) that shows CPU usage, Memory, and also how the tabs are grouped process-wise.
I know, but you can use Chrome for a million years, and have resource hogging tabs crash your computer, without ever knowing about that. Even ("X seems to be slowing down your computer, press shift+ESC for a detailed breakdown") would help. The point is for abusive sites to stick out and have that imaginary free market, with the rational consumers and their informed decisions, do the rest.
This is of course a really good thing, but I feel this is not enough.
The browser has increasingly become universal platform. On the one hand, this means applications written for browsers are automatically cross platform. But this also makes the browsers more and more complicated. Even the simplest webpage takes a significant hit in resource usage.
Maybe we need some sort of "reduced web". A browser that only supports the essential features to display webpages. No WebGL, canvas, notification, WebRTC, locations, WebMIDI, or WebUSB (seriously!). And I don't mean just disable these features, but rather design the browser without them. Then we could do most of our browsing in the minimal browser, and only fire up chrome for the more demanding web apps.
Personally speaking (That means I'm speaking for myself), I could absolutely care less about the plight of the developer who wants their page to run stuff in the background.
If you really think I should be running something in the background, you should ask Chrome for that permission so Chrome can ask me. If I say yes, then feel free, but no website should have this for free.
Why not? Your applications on the desktop can run background tasks without your approval. Your phone's applications on iOS and Android can run background tasks without your approval. The web has tons of web applications some of which more complex than stand alone apps. So why wouldn't they be afforded the same?
Asking would be a bit of a UX nightmare. You'll have so few users enable it. It's a pattern they've never seen before.
> Your phone's applications on iOS and Android can run background tasks without your approval.
Apps on iOS can only do this for a short time interval before they will receive a SIGSTOP and are no longer allowed to execute at all; and while you can react to push notifications, you are given a very limited time interval in which you can do that locally. You can manage downloads in the background, but those are passed off to a dedicated download process to make sure you aren't doing anything complex (as a download should not be a major CPU drain: it is really just something that has to respond to I/O events). You can play audio or track location actively in the background, but the system makes this incredibly obvious by placing an omnipresent and highly intrusive banner at the top of the screen, telling you which application is doing that. You can manage bluetooth devices in the background, but if you are paired with a bluetooth device then the user probably understands what is happening.
[1] https://twitter.com/cryptowat_ch/status/817502626896089090
https://www.npmjs.com/package/visibility is a nice little package that encapsulates some of the browser compat issues, if you have out-of-date clients.
What might he be talking about? Well, it works something like this...
- The app fetches data from a server.
- The data is processed. This may be cheap, or expensive.
- The DOM is updated.
- The page layout is recomputed.
- The browser window is redrawn.
Certainly, the browser could skip the last step for invisible tabs. It can't skip redoing the layout, as the JS can read the computed layout back out; at most it could do the computation lazily, but that would be extra code and complexity. Everything prior to that step isn't under the browser's control.
The web-app coder could act on every single step in the chain, starting by throttling data fetches.
https://github.com/Skilgarriff/react-user-focus
https://developer.mozilla.org/en-US/docs/Web/API/window/requ...
In addition to requestAnimationFrame this could be very handy!
Are there any gotchas you have experienced in using this API that I should look out for?
Firstly, I want to make clear that we are not shipping this in Chrome 56. We have enabled throttling as an experiment in beta channel to measure impact and collect feedback from web devs. We will aim to ship it in Chrome 57, subject to further feedback.
In response to concerns voiced we will disable aggressive throttling when active websocket connection is present. Tabs playing audio are already unthrottled.
We will also consider more signals to use in exempting a page from this throttling: metatag, pinned tabs, permission to show notifications from user. Please leave a comment in the bug (crbug.com/650594) if you have other suggestions.
Looking forward to your feedback, Alexander.
I'm a laptop user and CPU-hungry background tabs are a huge drain on my battery life. If something is opting out of or otherwise excluded from throttling, I want to know about it.
Thanks.
When I did support for Apple Care, every single update if it had new or extra icons we always got lots of calls like this.
I'd recommend a different background color for the tab, except that I'd also like to see (sign in) profiles have distinct background colors to aid the user in keeping their profiles straight.
The pages that are most aggressive in being a drain on resources, in my experience, are also using websockets to constantly load in new advertising and JavaScript and other garbage. Just "the page has a WS open" should not be enough to keep a page unthrottled without providing the user a chance to change that behavior.
Though I'm not sure how popular this feature is and I would vote for other ways to turn throttling off, especially for those which prompt user about it.
The main problems I have with background tabs and resource use is advertising iframes on otherwise inert pages. iflscience.com and sometimes imgur.com are two notable offenders here in my experience.
Advertisers will opt of anything that might throttle their content whether they need to or not, without testing if they need to, just in case. so if there is an opt out I expect it to be abused such that this pain point will not go away.
As well as asking if a particular domain should be allowed to unthrottle itself as others have suggested (or instead of if there is a fear that extra UI interactions will confuse the user) perhaps you could only allow it if the top level frame also opts out? This would give control back to the main page maintainer and if used in combination with the prompts could confuse less technical users less (the request for unthrottling comes from a recognised name like iflscience.com not content.idofmachineinfarm.r438957432t43.somecompanyyouveneverheardof.com)
> disable aggressive throttling when active websocket connection is present.
How is "active" defined here? I foresee advertisers opening a websocket that does as little as possible in order to get a prompt-less lifting of the throttle...
> Tabs playing audio are already unthrottled
I'd love to reverse this and punish tabs that play audio in the background! (or to allow for genuinely useful uses, such as message alerts, punish those that play more then 5 seconds of audio in a minute, unless tey are whitelisted).
I'd also appreciate it if nothing the website can do can override that. If I mute the audio, then it shouldn't be a signal, and you'll want to avoid using signals which the websites can trigger without user action.
Honestly, I'd prefer if there was some way to entirely suspend event processing on a tab, or at least timers.
Does this extend to SSE?
Make no mistake, I do believe Chrome could benefit from this, and I do believe what Microsoft is doing is skirting the edge between ethical and non-ethical (okay, I think it's sleazy). But it just seems like a curious coincidence.
I provide notification access to news sites, not sites I want constantly burning my CPU. This is "throttling", not "100% suspending forever", right? There's no good reason to give more CPU to these tabs that might be occasionally wanting to tell me something from the background: as they are in the background that's the only thing they should be doing, and if they are currently doing other things they should have a strong incentive to stop doing all that other stuff when they detect going into the background: there should be no exemption for tabs with notification access.
As an example - I never listen to audio/video in a background tab, but I have to suffer battery loss because of features that I have no plans to use.
To me the fundamental issue is one of user control. If the user wants the site to run in the background, great. However a lot of times they don't even know that it is and, surprise! the battery is drained, or everything is running slow and it's time to press shift+esc and stare at the jumping percentages in the task manager.
So to that end, communicating what's going on to the users, is I think pretty important so hopefully:
* A Visual Indicator on the tab, similar in spirit to the speaker or red recording circle, that conveys
And then to give users control:* The ability via `site settings` to disable the throttling, however if a site is using excessive background resources, some sort of ui should show indicate such.
(A lot of this would be almost trivial by showing little cpu use bars, with a line where the throttle is, but it might look kind of ugly)
Even though this is going to break some of my apps, I can see a greater good here, and I am 100% for helping out with battery life, and preventing my machine from being some sort of ad network computation shard. So I am fine with this being the default option even though it will break apps I have written. They are mostly in house tools so as long as I can instruct users to override the throttle, provided I am given that option, which it seems like I will be.
I would figure that for larger more public facing devs, the experience might be a bit more tedious. Perhaps a unthrottled-background permission request API can be done. And hopefully for legacy sites that won't be updated, the visual indicators above will clue users in as to fact that the browser is throttling the site. Perhaps ugh I hate even suggesting this, a nag bar could pop up when the user navigates back to the tab to inform them that the site was aggressively throttled.
Anyhow, I am glad you guys are getting out ahead of this, I think this stuff is going to get worse as sites seek to run more code on our machines in ways we cannot easily discern. So I actually don't like that workers / websockets / audio work around aggressive throttling, because the bad actors are just going to use that to burn cpu in the background without the users consent. Hopefully if executed well, with a helpful ui, this can be used to stop any unwanted and often unseen but still felt cpu waste while allowing sites the user actually does rely on to continue working.
ps, I'll cross post this to your tracker as well as you requested, I just know that leaving it here will get more eyeballs from a larger community to give their feedback as well.
I use a LOT of tabs, and the best plugin has been The Great Suspender. Highly recommend it for anyone who wants memory & CPU back and keeps many tabs/windows open at once: https://chrome.google.com/webstore/detail/the-great-suspende...
I hate having more than 6-7 simultaneously open because it gets increasingly harder to keep an overview of what you're doing. The same applies for IDE tabs or windows. Too much of them and finding the right one becomes increasingly hard, and losing the thread more likely.
My open tabs are kinda like my working memory. I could close them and reopen them as needed, but it is easier to just click a tab then to try to find the thing again. In addition, sometimes the pages I am looking at have dynamic navigation, and closing and reopening the page will require a good deal of navigation to find the section I was looking at. Plus, the overall time to reload the content, where if I just have the tab open there is no download time.
Also, the tab icons help me remember what I was looking at. I will often keep tabs open for what I wanted to read later.
I use many tabs as a stack of pages when debugging, researching, or reading aggregate news feeds (reddit, hn). It usually starts with a Google search or two, in which I open all links I think _might_ be relevant based off of what information google can provide me from the results page.
From there I read through each and open any further tabs if anything is linked too in the text (I hardly ever actually click navigate, it's most always a new tab). Generally this only goes about 3 deep (search, first page, sub links). I will close any pages that I find have no useful information, but if there is anything I think might be useful in the next 30 minutes I just leave it open. I do this for each of the results I originally opened. Somewhere in the 7-15 tabs generally is the answer I'm looking for or at least there is enough information I can answer my question. If any link is particularly beneficial, I will bookmark it. Generally the time span I have a large number of tabs open is no more than an hour before I'm finished and close everything out.
Chrome handles this nicely, if you are on a page and open a tab, it will place the new tab next to the current tab, instead of at the end of the tab list. Some sort of tree tab view would probably work much better for this, but Chromes behavior isn't bad for what I do.
So I leave them open until the computer can't handle it.
I use my tabs like a generational garbage collector. Tabs to the left of the current tab are processed, tabs on the right are to-be-processed. I'll go to a page like reddit or HN and spin off a dozen tabs of things to read. Then I'll go through one by one and either process, delay or close.
Once I reach about 250 - 300 tabs, I'll do a longer generation sweep and go through all the tabs and try to get it down to less than 100 or so.
Basically, I'm never in need of finding any specific tab. If I want the content from that tab, I'll just open a new one and navigate back to that point. The tabs are really a lightweight to-read list.
On the other hand I rather use native apps, when given the option.
Which I also only keep the ones for the task at hand open.
I don't use favorites or bookmarks because usually I don't need a link permanently.
Edit: I actively try not to get too many. If it starts to hide the title/favicon completely I start to close them again until I can recognize them by title without clicking through them.
I'm more of a less is more guy, when it comes to windows/tabs.
Incidentally, the note papers floating around on my desk works in a similar way, although they are more of an unordered set. Only one or two are relevant, the rest were helpful at some point but no longer are. Cleaning my table usually results in me dumping the whole thing in the dustbin.
Why do you need an overview? It's like stack frames: you can limit your scope to what you're currently doing. The other tabs represent stuff that's "parked" and you aspire to come back to.
(This is why tabs are better than windows for this, because they maintain a linear order while most systems will re-order window order if you visit the windows)
My tab-opening habits predate tabs, because I was raised on Netscape Navigator with a modem using "open in new window" instead. I would read down a page and open interesting-looking hyperlinks in the background, so I didn't have to wait for them to load. Another advantage of this technique on modems was that I could close down the line and carry on reading.
Dead Comment
Leave open the tabs you know you'll need soon(ish) and let the Great Suspender throttle them, and save (then close) groups of tabs/windows you won't need right away using Session Buddy.
https://chrome.google.com/webstore/detail/session-buddy/edac...
"""
Advantages over The Great Suspender:
- More memory savings
- Compatible with chrome tab syncing
- Super lightweight extension that uses no content scripts or persistent background scripts
Disadvantages over The Great Suspender:
- No visibility on which tabs have been suspended
- Unable to prevent a tab from reloading when it gains focus
"""
tl;dr - Great suspender is even "more aggressive" than the outlined throttling, as it fully suspends the page and returns all CPU and RAM to you, so it's a great solution for people interested in throttling background tabs.
1. a tab exceeds its quota and throttling kicks in;
2. you visit the tab to check why it stopped working;
3. you get a permission pop up (like all others) once you visit the tab again, asking you whether you want to allow it unlimited resource usage, noting that it'll decrease battery life of your device.
"Don't throttle pinned tabs"
www.foobar.com wants to:
"Run in the background unthrottled"
request for location doesn't require the page to explicitly indicate a desire, the request is triggered if the page attempts to use the location services of the JS API. sites that want to run unthrottled can't be identified simply by the usage of a certain API, so the developer would need to add something explicitly to their markup to indicate the desire.
i want control over the feature regardless of whether or not the site's developer deems it appropriate.
I'm not sure if that's a good thing or a bad thing. After all, backward compatibility is how we got the semantics of an alert() dialog stopping all JS execution.
This seems like a step towards the way things work with mobile apps currently, where the app's main thread gets suspended when its not in the foreground, and background processing happens in separate threads which the user has some degree of control over.
Edit: I meant regular `Worker`s, not `ServiceWorker`s.
[1]: https://developer.mozilla.org/en-US/docs/Web/API/Worker
... which may actually be the right solution.
I swear to god if I see anything mentioning a battery on a desktop machine with no battery...
All I know is that my desktop runs at about 70W idle vs. 450W fully-loaded. Unnecessary use of the CPU wastes money regardless of whether or not you're using that money to charge a battery.
Deleted Comment
Maybe use electron or something?
Deleted Comment
Unless I'm supposed to re-implement tabs within my single page application and then force it to only let one tab run, which I guess is possible but horrible :)
but chrome does not like that and is always nagging and trying to trick you into installing the latest versions.
i looks like we will have to package it as electron app.
Deleted Comment
Would it be possible to just declare "Best played in Firefox?" It's a bit gauche, but if a browser's engine has a behavior that isn't really compatible with what you intend to do, that's the browser's fault.
Deleted Comment
And just let us allow tabs to grab all the resources they want on a opt-in basis. Why not?
* Before anyone brings up the inevitable economic argument - it wouldn't take a lot of man hours to do these things, I dare say it would just take one or two persons who are capable to be willing and allowed to do them. And compared to all sorts of things that browsers vendors made and get scrapped, you at least know tabs will always use ram, CPU and load assets over the network, so it's not ever going to be completely useless.
Besides directly providing information that is relevant to a typical user, I'd hope such a solution would finally put some pressure on the companies to optimize their webpages.
And to repeat myself, I really do miss something akin to the icon that displays which tabs are playing sound -- not for myself, but because it would allow people to notice the difference between bloated and well crafted pages more easily.
I appreciate they prefer to automatically decide what is best, but I would prefer more gauges, at least as an accessible option. If you hide something behind an "advanced" label, it will just scare people off for no reason. It's not like configurations dialog aren't kinda barren and padded as is. Just fix that and then just put things there, neatly categorized and maybe even searchable, and explain them. People can drive cars and vote for politicians, but we can't trust them to read? Just about any image viewer or video player seems to think more highly of people than browsers of all things do.
The browser has increasingly become universal platform. On the one hand, this means applications written for browsers are automatically cross platform. But this also makes the browsers more and more complicated. Even the simplest webpage takes a significant hit in resource usage.
Maybe we need some sort of "reduced web". A browser that only supports the essential features to display webpages. No WebGL, canvas, notification, WebRTC, locations, WebMIDI, or WebUSB (seriously!). And I don't mean just disable these features, but rather design the browser without them. Then we could do most of our browsing in the minimal browser, and only fire up chrome for the more demanding web apps.
If you really think I should be running something in the background, you should ask Chrome for that permission so Chrome can ask me. If I say yes, then feel free, but no website should have this for free.
Why not? Your applications on the desktop can run background tasks without your approval. Your phone's applications on iOS and Android can run background tasks without your approval. The web has tons of web applications some of which more complex than stand alone apps. So why wouldn't they be afforded the same?
Asking would be a bit of a UX nightmare. You'll have so few users enable it. It's a pattern they've never seen before.
Apps on iOS can only do this for a short time interval before they will receive a SIGSTOP and are no longer allowed to execute at all; and while you can react to push notifications, you are given a very limited time interval in which you can do that locally. You can manage downloads in the background, but those are passed off to a dedicated download process to make sure you aren't doing anything complex (as a download should not be a major CPU drain: it is really just something that has to respond to I/O events). You can play audio or track location actively in the background, but the system makes this incredibly obvious by placing an omnipresent and highly intrusive banner at the top of the screen, telling you which application is doing that. You can manage bluetooth devices in the background, but if you are paired with a bluetooth device then the user probably understands what is happening.
FYI, I switched to iOS because they're much more aggressive controlling about runaway background processes.