Когда пользователь запускает генерацию файла, вы можете просто назначить уникальный идентификатор этой «загрузке» и отправить пользователя на страницу, которая обновляет (или проверяет с помощью AJAX) каждые несколько секунд. После того, как файл будет закончен, сохраните его под тем же уникальным идентификатором и ...
Затем вы можете пропустить весь беспорядок iframe / waiting / browserwindow, но у вас действительно элегантное решение.
Я бы использовал последний класс. Лучше мне сообщают, что это вспомогательный класс с некоторыми служебными методами. Определение интерфейса - это то, что я ожидаю реализовать, и методы, которые будут там, чтобы помочь кому-то реализовать интерфейс.