2014-06-05 3 views
3

Я пытаюсь отключить диалоги beforeUnload в расширении для Firefox, который работал до FF28, обертывая окно в XPCNativeWrapper и переопределяя window.onbeforeunload с помощью addeventlistener.Отключение диалогов beforeunload в расширении Firefox 29

Пример JavaScript:

var win = new XPCNativeWrapper(window, "onbeforeunload", "event", "addEventListener()"); 
var beforeUnload = win.onbeforeunload; 
win.onbeforeunload = null; 
var newBeforeUnload = function(e) { 
    beforeUnload(); 
    //code to remove dialog 
} 
win.addEventListener('beforeunload', newBeforeUnload, false); 

Это перестало работать в FF29, когда метод beforeUnload изменяет расположение страницы. В FF29 я получаю сообщение об ошибке «Доступ к chrome: //browser/content/page.html» из скрипта denied ».

Пример JS на странице:

window.onbeforeunload = function() { 
    parent.frame2.location="page.html"; 
}; 
+0

Вы пытаетесь отредактировать исходный код аддона? – Noitidart

ответ

0

Итак, я был в состоянии решить мою проблему, используя следующие:

windowToModify.location.replace("javascript:(" + function() { 
    window.oldBeforeUnload = window.onbeforeunload; 
    window.onbeforeunload = function(E) { 
     window.oldBeforeUnload(); 
     var evt = e || window.event; 
     if (evt && evt.returnValue) { 
      delete evt['returnValue']; 
     } 
    }; 
    window.onunload = null; 
} + ")()"); 

так, JavaScript: (/ * некоторые Javascript в виде строки * /) является допустимым местом и будет работать в области окна/кадра. Этот скрипт устанавливает свойство window.oldBeforeUnload, а затем переопределяет onbeforeunload, чтобы отключить диалог до разгрузки.

Это должно работать в FF 3.6+

Смежные вопросы