Skip to content

Instantly share code, notes, and snippets.

@furf
Created September 2, 2020 16:52
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save furf/b57ce352b506660624b6328c71c3788b to your computer and use it in GitHub Desktop.
Save furf/b57ce352b506660624b6328c71c3788b to your computer and use it in GitHub Desktop.
Detect system sleep and wake events in browser.
<html>
<head>
<title>sleep.js</title>
</head>
<body>
<h1>sleep.js</h1>
<script src="sleep.js"></script>
<script>
function logEvent(event) {
const time = new Date(event.detail).toTimeString().substr(0, 8);
console.log(event.type, time);
};
document.addEventListener('sleep', logEvent);
document.addEventListener('wake', logEvent);
</script>
</body>
</html>
(() => {
const data =
'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';
const video = document.createElement('video');
video.loop = true;
video.muted = true;
video.src = `data:video/mp4;base64,${data}`;
video.play().then(
() => {
Object.entries({
pause: 'sleep',
play: 'wake',
}).forEach(([type, customType]) => {
video.addEventListener(type, () => {
document.dispatchEvent(
new CustomEvent(customType, { detail: Date.now() }),
);
});
});
console.info('System sleep/wake detection video initialized.');
},
() => {
console.error('Unable to initialize system sleep/wake detection.');
},
);
})();
@rdjpalmer
Copy link

In Edge 92.0.902.15 I find this also fires when I change browser tab. Any ideas why that might be?

@furf
Copy link
Author

furf commented Aug 9, 2021

In Edge 92.0.902.15 I find this also fires when I change browser tab. Any ideas why that might be?

This was a pretty crude experiment. I am noticing the same in Chrome 92.0.4515.131 as well. And it also happens when the window is open, but completely obscured by another window.

I assume that since the video renders only a single frame and is muted, the engine recognizes that it can change the playback state with no net effect to the user.

Perhaps if I included a second frame of video, it would not be able to do so…

@furf
Copy link
Author

furf commented Aug 9, 2021

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment