나는 새로운 파이어 폭스 애드온을 개발하고 그 절편 모든 파이어 폭스의 네트워크 트래픽 (와 HTTP (S) 요청 http-on-modify-request
)
현재 코드를 사용하면 웹 페이지 / 탭 및 기타 모든 구성 요소 (RSS 피드 업데이트, XPCOM 구성 요소의 XHR 요청, 확장, 확장 관리자 등)에서 오는 요청을 분리 할 수 있습니다.
전체 그룹뿐만 아니라 탭의 트래픽 이외의 요청을 시작하는 사람을 정확하게 식별하고 싶습니다. (RSS, XPCOM 구성 요소, 확장, 확장 관리자 등)
예 : 가상 맞춤 변수requestRequestor
에는 특정 애드온 또는 RSS 업데이트 등을 식별하는 값이 있습니다.
이 비슷한 질문을 찾았 지만 해결책이 없습니다.
전체 그룹을 식별하는 현재 코드 ( http-on-modify-request 알림을 실행하는 브라우저 가져 오기 )는 다음과 같습니다.
Components.utils.import('resource://gre/modules/Services.jsm');
Services.obs.addObserver(httpObs, 'http-on-modify-request', false);
//Services.obs.removeObserver(httpObs, 'http-on-modify-request'); //uncomment this line, or run this line when you want to remove the observer
var httpObs = {
observe: function (aSubject, aTopic, aData) {
if (aTopic == 'http-on-modify-request') {
/*start - do not edit here*/
var oHttp = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel); //i used nsIHttpChannel but i guess you can use nsIChannel, im not sure why though
var interfaceRequestor = oHttp.notificationCallbacks.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
//var DOMWindow = interfaceRequestor.getInterface(Components.interfaces.nsIDOMWindow); //not to be done anymore because: https://developer.mozilla.org/en-US/docs/Updating_extensions_for_Firefox_3.5#Getting_a_load_context_from_a_request //instead do the loadContext stuff below
var loadContext;
try {
loadContext = interfaceRequestor.getInterface(Components.interfaces.nsILoadContext);
} catch (ex) {
try {
loadContext = aSubject.loadGroup.notificationCallbacks.getInterface(Components.interfaces.nsILoadContext);
//in ff26 aSubject.loadGroup.notificationCallbacks was null for me, i couldnt find a situation where it wasnt null, but whenever this was null, and i knew a loadContext is supposed to be there, i found that "interfaceRequestor.getInterface(Components.interfaces.nsILoadContext);" worked fine, so im thinking in ff26 it doesnt use aSubject.loadGroup.notificationCallbacks anymore, but im not sure
} catch (ex2) {
loadContext = null;
//this is a problem i dont know why it would get here
}
}
/*end do not edit here*/
/*start - do all your edits below here*/
var url = oHttp.URI.spec; //can get url without needing loadContext
if (loadContext) {
var contentWindow = loadContext.associatedWindow; //this is the HTML window of the page that just loaded
//aDOMWindow this is the firefox window holding the tab
var aDOMWindow = contentWindow.top.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShellTreeItem).rootTreeItem.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow);
var gBrowser = aDOMWindow.gBrowser; //this is the gBrowser object of the firefox window this tab is in
var aTab = gBrowser._getTabForContentWindow(contentWindow.top); //this is the clickable tab xul element, the one found in the tab strip of the firefox window, aTab.linkedBrowser is same as browser var above //can stylize tab like aTab.style.backgroundColor = 'blue'; //can stylize the tab like aTab.style.fontColor = 'red';
var browser = aTab.linkedBrowser; //this is the browser within the tab //this is what the example in the previous section gives
//end getting other useful stuff
} else {
Components.utils.reportError('EXCEPTION: Load Context Not Found!!');
//this is likely no big deal as the channel proably has no associated window, ie: the channel was loading some resource. but if its an ajax call you may end up here
}
}
}
};
답변
2020 년 6 월 현재 http 요청 요청자 필터링 / 식별을 달성하는 공식적인 방법 / 방법은 없습니다.
현재 유일한 가능성은 웹 페이지 / 탭과 다른 Firefox의 구성 요소 (피드 업데이트, 확장 요청, XPCOM 구성 요소의 XHR 요청 등)에서 요청을 분리하는 질문 코드에서 수행되는 작업입니다.
주석에서 언급했듯이 이것은 Firefox의 내부 제한입니다. 현재 Firefox의 핵심 코드는 요청자 추적을 구현하지 않으므로 요청을 시작한 사람과 이유를 알 수 없습니다. 최근에 Chrome 개발 도구 에이 기능이 추가 되었다는 사실을 아는 것이 유용 할 수 있습니다 .