diff --git a/content/treestyletab/windowHelperHacks.js b/content/treestyletab/windowHelperHacks.js index 19d1496a..15922cf4 100644 --- a/content/treestyletab/windowHelperHacks.js +++ b/content/treestyletab/windowHelperHacks.js @@ -668,25 +668,53 @@ TreeStyleTabWindowHelper.overrideExtensionsAfterBrowserInit = function TSTWH_ove // Greasemonkey // https://addons.mozilla.org/firefox/addon/748 if (sv.getTreePref('compatibility.Greasemonkey')) { - if ('GM_BrowserUI' in window && 'openInTab' in GM_BrowserUI) { - eval('GM_BrowserUI.openInTab = '+ - GM_BrowserUI.openInTab.toSource().replace( - /(if\s*\(this\.isMyWindow\([^\)]+\)\)\s*\{\s*)(this\.tabBrowser)/, - '$1 TreeStyleTabService.readyToOpenChildTab($2); $2' - ) - ); + try { + let hitchModule = Components.utils.import('resource://greasemonkey/util/hitch.js', {}); + let hitch = hitchModule.hitch; + if (hitch.toSource().indexOf('TreeStyleTabService') < 0) { + hitchModule.hitch = function(aObject, aMethod) { + if (typeof aMethod == 'function' && + aMethod.toSource().indexOf('function openInTab') > -1) { + let originalOpenInTab = aMethod; + /** + * This function must be replaced on scripts in "chrome:" URL, like this. + * Otherwise the original openInTab() will raise violation error. + * Don't move this hack into JS code modules with "resource:" URL. + */ + aMethod = function openInTab(aSafeContentWindow, aChromeWindow, aURL, aLoadInBackgtound) { + if (aChromeWindow.TreeStyleTabService) + aChromeWindow.TreeStyleTabService.readyToOpenChildTabNow(aSafeContentWindow); + return originalOpenInTab.apply(this, arguments); + }; + } + return hitch.apply(this, arguments); + }; + } } - else if ('@greasemonkey.mozdev.org/greasemonkey-service;1' in Components.classes) { - let service = Components.classes['@greasemonkey.mozdev.org/greasemonkey-service;1'].getService().wrappedJSObject; - if (service) { - let _openInTab = service.__proto__._openInTab; - if (_openInTab.toSource().indexOf('TreeStyleTabService') < 0) { - service.__proto__._openInTab = function() { - let contentWindow = arguments[0]; - let chromeWindow = arguments[1]; - chromeWindow.TreeStyleTabService.readyToOpenChildTabNow(contentWindow); - return _openInTab.apply(this, arguments); - }; + catch(e) { + dump(e+'\n'); + + // hacks for old versions + if ('GM_BrowserUI' in window && 'openInTab' in GM_BrowserUI) { + eval('GM_BrowserUI.openInTab = '+ + GM_BrowserUI.openInTab.toSource().replace( + /(if\s*\(this\.isMyWindow\([^\)]+\)\)\s*\{\s*)(this\.tabBrowser)/, + '$1 TreeStyleTabService.readyToOpenChildTab($2); $2' + ) + ); + } + else if ('@greasemonkey.mozdev.org/greasemonkey-service;1' in Components.classes) { + let service = Components.classes['@greasemonkey.mozdev.org/greasemonkey-service;1'].getService().wrappedJSObject; + if (service && service.__proto__._openInTab) { + let _openInTab = service.__proto__._openInTab; + if (_openInTab.toSource().indexOf('TreeStyleTabService') < 0) { + service.__proto__._openInTab = function() { + let contentWindow = arguments[0]; + let chromeWindow = arguments[1]; + chromeWindow.TreeStyleTabService.readyToOpenChildTabNow(contentWindow); + return _openInTab.apply(this, arguments); + }; + } } } }