Пока не принимайте это как решение. Я надеюсь, что некоторые другие люди могут прийти и помочь построить это решение.
Я знаю, что это наверняка верно:
Это я думаю правильно, под этим я подразумеваю, что это работает в моих тестовых примерах, но я не уверен, что это рекомендуемый способ:
- ТЕСТ ДЛЯ: Кадр или полная загрузка страницы - firefox-addon/22678462#22678462">Можем ли мы различать фреймовые и нефреймовые загрузки с помощью Ci в аддоне Firefox
Я не знаю, как это сделать, поэтому мне нужна помощь сообщества в этом:
Выполняется решение:
var myobserve = function(aSubject, aTopic, aData) {
var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
//start - test if xhr
var isXHR;
try {
var callbacks = httpChannel.notificationCallbacks;
var xhr = callbacks ? callbacks.getInterface(Ci.nsIXMLHttpRequest) : null;
isXHR = !!xhr;
} catch (e) {
isXHR = false;
}
//end - test if xhr
//start - test if frame OR full page load
var isFrameLoad;
var isFullPageLoad;
if (httpChannel.loadFlags & Ci.nsIHttpChannel.LOAD_INITIAL_DOCUMENT_URI) {
isFullPageLoad = true;
isFrameLoad = false;
} else if (httpChannel.loadFlags & Ci.nsIHttpChannel.LOAD_DOCUMENT_URI) {
isFrameLoad = true;
isFullPageLoad = false;
}
//end - test if frame OR full page load
//start - test if image
var isImg;
var isCss;
var isJs;
var isAudio;
//can keep going here
var mimeType = httpChannel.contentType;
if (/^image/i.test(mimeType)) {
isImg = true;
}
if (/^audio/i.test(mimeType)) {
isAudio = true;
}
if (/\/css$/i.test(mimeType)) {
isCss = true;
}
if (/\/js$/i.test(mimeType)) {
isJs = true;
}
//end - test if image
//start - OPTIONAL use loadContext to get a bunch of good stuff
//must paste the function from here: https://gist.github.com/Noitidart/644494bdc26f996739ef somewhere in your code
var goodies = loadContextAndGoodies(aSubject, true);
/*
//goodies is an object that holds the following information:
var goodies = {
loadContext: loadContext,
DOMWindow: DOMWindow,
gBrowser: gBrowser,
contentWindow: contentWindow,
browser: browser,
tab: tab
};
*/
// test if resource (such as image, or whatever) is being loaded is going into a frame [can also be used as altnerative way to test if frame load or full page]
var itemDestinationIsFrame;
var itemDestinationIsTopWin;
if (goodies.contentWindow) {
if (goodies.contentWindow.frameElement) {
itemDestinationIsFrame = true;
itemDestinationIsTopWin = false;
} else {
itemDestinationIsFrame = false;
itemDestinationIsTopWin = true;
}
}
//end - OPTIONAL use loadContext to get a bunch of good stuff
}
Конечно для начала наблюдения:
Services.obs.addObserver(myobserve, 'http-on-modify-request', false);
и остановить:
Services.obs.removeObserver(myobserve, 'http-on-modify-request', false);
Чтобы начать наблюдать
Чтобы начать наблюдать за всеми запросами, сделайте это (например, при запуске вашего аддона)
for (var o in observers) {
observers[o].reg();
}
Чтобы перестать наблюдать
Важно прекратить наблюдение (убедитесь, что вы запускаете это хотя бы при выключении аддона, вы не хотите оставлять наблюдателя зарегистрированным по причинам памяти)
for (var o in observers) {
observers[o].unreg();
}
person
Noitidart
schedule
15.12.2014