Как я могу изменить User Agent только на одной вкладке Firefox?

Я разрабатываю расширение Firefox, и мне нужно изменить пользовательский агент на одной вкладке. Я использовал такие расширения, как User Agent Switcher, но он позволял мне изменять только пользовательский агент во всем браузере. Вы знаете, возможно ли это? Где я могу прочитать о?

Большое спасибо, Г.

1 ответ

Это веселый аддон. я хотел создать аддон, который включал бы прокси только в одной вкладке, я думаю это поможет вам сделать это в ближайшее время

скопировать вставить код. он подделывает user-agent во всех вещах, загруженных на вкладке 1. на всех остальных вкладках он пропустит загрузку. однако, если нет loadContext, вы не сможете определить, с какой вкладки она идет, поэтому, вероятно, просто проигнорируйте ее и отпустите.

нам нужен совет от ппл более опытный, чем я. в каких случаях мы получаем нулевой loadContext?

на копировать вставить код

const {classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu, results: Cr, manager: Cm} = Components;
Cu.import('resource://gre/modules/Services.jsm');

var myTabToSpoofIn = Services.wm.getMostRecentBrowser('navigator:browser').gBrowser.tabContainer[0]; //will spoof in the first tab of your browser

var httpRequestObserver = {
    observe: function (subject, topic, data) {
        var httpChannel, requestURL;

        if (topic == "http-on-modify-request") {
            httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
            var goodies = loadContextGoodies(httpChannel)
            if (goodies) {
              if (goodies.aTab == myTabToSpoofIn) {
                httpChannel.setRequestHeader('User-Agent', 'user agent spoofeddddd', false);
              } else {
                //we arent spoofing in this tab so ignore it
              }
            } else {
                //no goodies so we dont know what tab its from, im not sure when we dont have a loadContext we need to ask other ppl
                //no goodies for this channel, so dont know what tab its in so probably just load this, your decision though, make it option to user, if cannot find associated load context ask user if they want the data to be loaded with default user agent or just not load it at all
                //httpChannel.cancel(Cr.NS_BINDING_ABORTED); //uncomment this to abort it
            }
        }
    }
};

Services.obs.addObserver(httpRequestObserver, "http-on-modify-request", false);
//Services.obs.removeObserver(httpRequestObserver, "http-on-modify-request", false); //run this on shudown of your addon otherwise the observer stags registerd







//this function gets the contentWindow and other good stuff from loadContext of httpChannel
function loadContextGoodies(httpChannel) {
    //httpChannel must be the subject of http-on-modify-request QI'ed to nsiHTTPChannel as is done on line 8 "httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);"
    //start loadContext stuff
    var loadContext;
    try {
        var interfaceRequestor = httpChannel.notificationCallbacks.QueryInterface(Ci.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
        try {
            loadContext = interfaceRequestor.getInterface(Ci.nsILoadContext);
        } catch (ex) {
            try {
                loadContext = subject.loadGroup.notificationCallbacks.getInterface(Ci.nsILoadContext);
            } catch (ex2) {}
        }
    } catch (ex0) {}

    if (!loadContext) {
        //no load context so dont do anything although you can run this, which is your old code
        //this probably means that its loading an ajax call or like a google ad thing
        return null;
    } else {
        var contentWindow = loadContext.associatedWindow;
        if (!contentWindow) {
            //this channel does not have a window, its probably loading a resource
            //this probably means that its loading an ajax call or like a google ad thing
            return null;
        } else {
            var aDOMWindow = contentWindow.top.QueryInterface(Ci.nsIInterfaceRequestor)
                .getInterface(Ci.nsIWebNavigation)
                .QueryInterface(Ci.nsIDocShellTreeItem)
                .rootTreeItem
                .QueryInterface(Ci.nsIInterfaceRequestor)
                .getInterface(Ci.nsIDOMWindow);
            var gBrowser = aDOMWindow.gBrowser;
            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 where the example in the previous section ends
            return {
                aDOMWindow: aDOMWindow,
                gBrowser: gBrowser,
                aTab: aTab,
                browser: browser,
                contentWindow: contentWindow
            };
        }
    }
    //end loadContext stuff
}

также примечание. потому что вы хотите изменить запрос пользователя, убедитесь, что для третьего параметра установлено значение false в httpChannel.setRequestHeader('MyCustomRequestHeader', 'hiiii', false); в противном случае он объединит ранее существовавший пользовательский агент с новым, который вы указали.

Другие вопросы по тегам