У меня есть приложение, работающее внутри iframe на "чужой" странице (другой домен и т.д.). Чтобы разрешить некоторую базовую связь между iframe и родителем, я загружаю часть script на родительскую страницу и использую postMessage
для обмена сообщениями с несколькими документами.
В большинстве случаев это общение работает по назначению, но иногда я вижу некоторые ошибки, сообщаемые моему инструменту отслеживания ошибок, и не могу понять, почему они происходят.
Вот примерный код:
PluginOnParent.js
// ...
window.addEventListener('message', function(e) {
// Check message origin etc...
if (e.data.type === 'iFrameRequest') {
e.source.postMessage({
type: 'parentResponse',
responseData: someInterestingData
}, e.origin);
}
// ...
}, false);
// ...
AppInsideIFrame.js
// ...
var timeoutId;
try {
if (window.self === window.top) {
// We're not inside an IFrame, don't do anything...
return;
}
} catch (e) {
// Browsers can block access to window.top due to same origin policy.
// See http://stackoverflow.com/a/326076
// If this happens, we are inside an IFrame...
}
function messageHandler(e) {
if (e.data && (e.data.type === 'parentResponse')) {
window.clearTimeout(timeoutId);
window.removeEventListener('message', messageHandler);
// Do some stuff with the sent data
}
}
timeoutId = window.setTimeout(function() {
errorTracking.report('Communication with parent page failed');
window.removeEventListener('message', messageHandler);
}, 500);
window.addEventListener('message', messageHandler, false);
window.parent.postMessage({ type: 'iFrameRequest' }, '*');
// ...
Что происходит здесь, когда сообщается об ошибках таймаута и об ошибке?
Дополнительная информация и мои мысли:
- У меня нет контроля над родительской страницей.
- Это не похоже на общую "конфигурационную" проблему (CORS и т.д.), поскольку ошибка происходит на той же странице, где она работает большую часть времени.
- Мы не поддерживаем IE < 10 и других "старых" версий браузера, поэтому здесь нет проблем.
- Мой инструмент отчетов об ошибках сообщает о множестве различных браузеров, среди которых самые последние версии (FF 49, Chrome 43 на Android 5, Chrome 53 на Win и Android 6, Mobile Safari 10,...)
- Поэтому это не похоже на проблему, связанную с конкретными браузерами или версиями.
- Тайм-аут в 500 мс - это просто какое-то волшебное число, которое я выбрал, который, как я думал, будет полностью безопасным...