Я изучаю способы расширения блокировки всплывающих окон 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, у которых слишком много собственных проблем)?