Страницы: 1
Суть проблемы: есть расширение Redirector, позволяющее осуществлять перенаправление ссылок по задаваемым пользователем правилам - я, например, пользуюсь им для перенаправления с русскоязычных страниц MSDN на англоязычные, что для меня достаточно актуально. Но у этого расширения есть одна проблема: оно не распознает target="_blank" у ссылок, в результате чего ссылки поисковой выдачи гугла, например, попадающие под правила перенаправления, отрываются не в новой вкладке, а в текущей. Хотелось бы это исправить, не дожидаясь автора (СКМ не предлагать - он работает, но хотелось бы все сделать неотличимым от обычного поведения браузера).
Я заглянул в код расширения - перенаправление осуществляется js-xpcom компонентом, реализующем интерфейсы nsIContentPolicy и nsIChannelEventSink - nsIContentPolicy определяет, разрешить перенаправление, или нет, а nsIChannelEventSink осуществляет собственно перенаправление на нужный адрес. Перенаправление делается в реализации метода onChannelRedirect - примерно так:
onChannelRedirect: function(oldChannel, newChannel, flags) { try { let newLocation = newChannel.URI.spec; if (!(newChannel.loadFlags & Ci.nsIChannel.LOAD_DOCUMENT_URI)) return; if (!newLocation) return; .......... var win; var webNav; for each (let callback in callbacks) { try { win = callback.getInterface(Ci.nsILoadContext).associatedWindow; webNav = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation); break; } catch(e) {} } if (!webNav) { return; } var redirectUrl = this.getRedirectUrl(newLocation); if (redirectUrl) { webNav.loadURI(redirectUrl,null,null,null,null); throw Cr.NS_BASE_STREAM_WOULD_BLOCK; } } catch (e if (e != Cr.NS_BASE_STREAM_WOULD_BLOCK)) { this.debug("Redirector: Unexpected error in onChannelRedirect: " + e + "\n"); } },
т.е. у нас на входе есть только экземпляр nsIChannel, от которого мы получаем исходный url, и определяем требуемый url перенаправления. Вопрос: можно ли как-то из экземпляра nsIChannel (думаю, на самом деле это экземпляр nsIHttpChannel) определить тот факт, что ссылка, по url которой был открыт канал, имела атрибут target="_blank"? При наличии такой возможности можно было бы открывать новую вкладку, и делать редирект в ней.
Отсутствует
Вопрос снят. Выяснилось, что расширение вполне нормально обрабатывает target="_blank" - просто в моем случае вышеописанную картину дает конфликт с NoScript.
Отсутствует
Страницы: 1