Skip to content

Instantly share code, notes, and snippets.

@ptesny
Forked from tarun/parent.html
Created March 1, 2022 12:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ptesny/bda2a7388ede52aa2ae00c2041334509 to your computer and use it in GitHub Desktop.
Save ptesny/bda2a7388ede52aa2ae00c2041334509 to your computer and use it in GitHub Desktop.
testing setting timeouts in postMessage callback in the parent window. this seems to break on mobile browsers (tested in iOS 5/6). posting message to the same window works fine.
<!DOCTYPE html>
<html>
<head>
<title>iOS background setTimeout test - parent</title>
</head>
<body>
<h1>Parent</h1>
<button id="open-popup">Open Popup</button>
<ol id="info-panel">
</ol>
<button id="post-message-local">postMessage locally</button>
<button id="dummy-button">Dummy Button</button>
<script type="text/javascript" src="trace.js"></script>
<script type="text/javascript">
(function() {
var i = 0;
/* doing this as browsers will block opening popups if not initiated by user action */
document.getElementById('open-popup').addEventListener('click', function() {
window.open('popup.html', 'test-popup', 'width=400,height=400');
});
document.getElementById('dummy-button').addEventListener('click', function() {
test.log('dummy button pressed');
});
document.getElementById('post-message-local').addEventListener('click', function() {
window.postMessage('test-local-timeout at ' + (new Date()).toLocaleTimeString(), '*');
});
window.addEventListener('message', function(e) {
var delay = 1000;
var index = ++i;
var intervalId = 0;
var intervalCount = 0;
var messageInfo = "parent setCallback index :" + index + ", for popup message " + e.data + ", using delay " + delay;
test.log(e);
test.log('settingTimeout for ' + messageInfo);
setTimeout(function() {
test.log(' in Timeout callback ' + messageInfo);
}, delay);
test.log('settingInterval ' + messageInfo);
intervalId = setInterval(function() {
test.log(' in Interval callback with count ' + intervalCount + ', ' + messageInfo);
intervalCount++;
if (intervalCount > 2) {
clearInterval(intervalId);
}
}, delay);
});
}());
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>iOS background setTimeout test - child</title>
</head>
<body>
<h1>Child</h1>
<ol id="info-panel">
</ol>
<script type="text/javascript" src="trace.js"></script>
<script type="text/javascript">
(function() {
var delay = 1000;
test.log('will post mesage in ' + delay + ' milli-seconds');
setTimeout(function() {
test.log('posting message');
window.opener.postMessage('test-parent-timeout at ' + (new Date()).toLocaleTimeString(), '*');
}, delay);
}());
</script>
</body>
</html>
(function() {
var test = window.test;
if (typeof test === "undefined") {
test = {};
}
var infoPanel = document.getElementById('info-panel');
test.log = function(message) {
var li = document.createElement('li');
var now = "[ " + (new Date()).toLocaleTimeString() + " ]";
var logMessage = "";
li.innerHTML = now + "\t" + message;
infoPanel.appendChild(li);
if (typeof message === "string") {
console.log(now + "\t" + message);
} else {
console.log(now);
console.log(message);
}
};
window.test = test;
}());
(function() {
test.log('loaded');
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment