Я изучаю способы расширения блокировки всплывающих окон Firefox из расширения. Один из вариантов заменяет window.open() (или, скорее, Window.prototype.open()) на веб-странице с помощью функции обертки. Важным требованием является то, что эта манипуляция не может быть обнаружена или отменена веб-страницей. Например, если я просто делаю это:
Window.prototype.open = wrapper;
Веб-страница может легко вернуть изменения, выполнив следующие действия:
delete Window.prototype.open;
Вместо этого я могу использовать Object.defineProperty() для установки расширенных флагов свойств:
Object.defineProperty(Window.prototype, "open", {value: wrapper, configurable: false});
Веб-страница больше не может отменить это изменение, но она все еще может ее обнаружить: delete Window.prototype.open обычно меняет значение Window.prototype.open (другой экземпляр той же самой функции), здесь delete не будет иметь никакого эффекта вообще. Кроме того, Window.prototype.open = "test";delete Window.prototype.open; приведет к несогласованным результатам (разные в зависимости от того, указан ли флаг writable: false для свойства).
Есть ли что-нибудь еще, что я могу сделать для эмуляции поведения исходного свойства (не считая использования двоичных компонентов XPCOM, у которых слишком много собственных проблем)?