У меня есть диалоговая абстракция, которую я использую в FireBreath здесь: https://gist.github.com/1368648
Оказывается, вы не можете использовать runModal во вторичном потоке; это должно быть в основном потоке приложения. Это проблема в плагине NPAPI, потому что вы также не можете заблокировать основной поток во время вызова NPAPI или браузер (по крайней мере, Chrome и Firefox 4+) может убить вас.
Решение состоит в том, чтобы запустить его в основном потоке, но не как часть вызова NPAPI; Вы можете сделать это, используя executeSelectorOnMainThread и не дожидаясь его завершения. Если вы предоставляете какой-то обратный вызов (функция javascript NPObject прекрасно работает), вы можете вызвать его, когда ваш диалог завершится.
FireBreath использует этот метод для своей функции BrowserHost :: ScheduleOnMainThread, которую я сейчас использую в той сущности, на которую я ссылался. Кто-то (вы?) Опубликовал комментарий к сути, спрашивая, работает ли он для меня; Суть в момент комментария не сделал, но я обновил его с исправлением (которое я только что выяснил вчера). Так как мы обновили его, чтобы использовать executeSelectorOnMainThread для запуска вызова позже, я не смог воспроизвести сбой.
Оглядываясь назад, вы уже знакомы с тем, чтобы перезвонить в главном потоке следующим образом: Как перезаписать поток плагинов в Safari 5.1 для OSX?
Вы используете ту же технику; можно было бы подумать, что блокирование потока также будет опасным, но, поскольку во время модального диалога цикл системных событий продолжает выполняться, все в порядке; Ваш код не возвращается, но другие события по-прежнему отправляются. Браузер не ожидает возврата вызова NPAPI, поэтому у него, похоже, нет проблем.