tabs.onUpdated.addListener changeInfo.status переходит с undefined на Complete без загрузки

Я вижу это поведение только тогда, когда загружается страница google SERP (при поиске из окна поиска на google.com/ или в поле на самой странице SERP). Я видел ожидаемое поведение для других страниц, то есть я вижу неопределенный, загружающийся и, наконец, полный.

chrome.tabs.onUpdated.addListener( function(tabId, changeInfo, tab){
console.log(changeInfo.status); // prints undefined couple of times and then completed (no sign of loading).
}

Я работаю над расширением, которое ведет себя по-разному в зависимости от состояния вкладок.

Тот же код работает, как и ожидалось, в хроме.

Также обновление страницы SERP запускает загрузку и статус завершения, как и ожидалось.


person birdman    schedule 18.08.2016    source источник
comment
Это не содержит фактический вопрос. Пожалуйста, уточните вашу конкретную проблему или добавьте дополнительные детали, чтобы выделить именно то, что вам нужно. В том виде, в котором он сейчас написан, трудно точно сказать, о чем вы спрашиваете. См. страницу Как задать вопрос, чтобы получить разъяснения по этому вопросу. Как написано, все, что делает этот Вопрос, - это информирует нас о некотором различном поведении в Google Chrome и Firefox.   -  person Makyen♦    schedule 19.08.2016
comment
Если вам нужна помощь, нам нужно знать, как вы используете эту информацию и почему вы должны иметь changeInfo.status переход с undefined'loading'➞''complete'' вместо undefined➞''complete''.   -  person Makyen♦    schedule 19.08.2016
comment
Связано: WebExtension: реагировать на перезагрузку вкладки   -  person Makyen♦    schedule 19.08.2016
comment
@Makyen спасибо за ответ, я пытаюсь создать события для URL-адресов на основе этих статусов, я искал 'loading', чтобы создать событие загрузки для этого URL-адреса, и как только я увидел 'complete', я создавал другие настраиваемые события и событие закрытия для этот конкретный URL.   -  person birdman    schedule 19.08.2016


Ответы (1)


Firefox и Google Chrome — разные браузеры. WebExtensions очень новинка для Firefox. Даже когда он станет зрелым, Firefox и Google Chrome будут отличаться. Для этого может потребоваться, чтобы у вас были существенно разные участки кода для различных браузеров, в которых должно работать ваше расширение.

В настоящее время в Firefox changeInfo объект, который передается в функцию прослушивателя для chrome.tabs.onUpdated может быть недействительным. Предполагается, что он может иметь только два возможных значения: loading или complete.

Похоже, что существует ошибка, из-за которой changeInfo может иметь свойство status, но значение этого свойства равно undefined. В этих случаях объект tabs.Tab с также передается прослушивателю tabs.onUpdated, имеет свойство status со значением, которое является строкой. В большинстве случаев это значение равно 'completed', даже если оно кажется неточным.

Похоже, что это может обойти относительно легко. Это зависит от того, что вам нужно.

Следующий код переопределит ошибочные значения undefined для changeInfo.status, предполагая, что они равны 'loading':

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if(changeInfo.hasOwnProperty("status") && typeof changeInfo.status === 'undefined'){
        changeInfo.status = 'loading';
    }
});

Реальность такова, что вам нужно будет определить для себя, что работает для вашего расширения. Firefox и Chrome будут предоставлять вашему расширению несколько иную информацию.

Для описанной вами ситуации (с главной страницы Google на страницу SERP) комбинированный webRequest, webNavigation и tabs.onUpdated предоставляют следующую информацию:

        webRequest: https://www.google.com/images/nav_logo242.png
        webRequest: https://www.google.com/complete/search?sclient=psy-ab&site=&source=hp&q=SERP&oq=&gs_l=&pbx=1&bav=on.2,or.&bvm=bv.129759880,d.cGc&fp=1&biw=1256&bih=924&dpr=1&pf=p&gs_rn=64&gs_ri=psy-ab&cp=4&gs_id=kv&xhr=t&tch=1&ech=1&psi=E6u2V_S8BY_gjwPakICACA.1471589139270.1
        webRequest: https://www.google.com/gen_204?atyp=i&ct=1&cad=1&rsm=6&ei=E6u2V_S8BY_gjwPakICACA&zx=1471589794481

tabs.updated event: tabId=37:: changeInfo keys:status ::changeInfo.status=undefined (override->loading)
tab.status=complete (override->loading)testTabEvents.js:96:9

tabs.updated event: tabId=37:: changeInfo keys:status,url ::changeInfo.status=complete
tab.status=complete
tab.url=https://www.google.com/?gws_rd=ssl#q=SERPtestTabEvents.js:96:9

        webRequest: https://www.google.com/search?sclient=psy-ab&site=&source=hp&q=SERP&oq=SERP&gs_l=hp.3..0i3k1j0l3.655013.655013.0.657681.1.1.0.0.0.0.173.173.0j1.1.0....0...1c.1.64.psy-ab..0.1.163.LqQ90ZRWj7o&pbx=1&bav=on.2,or.&bvm=bv.129759880,d.cGc&fp=1&biw=1256&bih=924&dpr=1&tch=1&ech=1&psi=E6u2V_S8BY_gjwPakICACA.1471589139270.3

    webNavigation->ReferenceFragmentUpdated: tadId=37:: url=https://www.google.com/?gws_rd=ssl#q=SERPtestTabEvents.js:182:13

tabs.updated event: tabId=37:: changeInfo keys:status ::changeInfo.status=undefined (override->loading)
tab.status=complete (override->loading)testTabEvents.js:96:9

tabs.updated event: tabId=37:: changeInfo keys:status ::changeInfo.status=undefined (override->loading)
tab.status=complete (override->loading)testTabEvents.js:96:9

        webRequest: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAJCAYAAAAGuM1UAAAAaUlEQVR4AY3OxQECQRBE0YdHsyc0G9LihkNqOESA92n9j09LlaCnmEzOFGcMFBCxc+Ra44UjElmSiL0iVxOL+LhjLIj7PWIzNCBd9MAk1iObHKCNfSTcYr2wQ0uWjFKmc0VRJNekXWTjDe6gHTKFP5vkAAAAAElFTkSuQmCC
        webRequest: https://id.google.com/verify/NQAAAB8aqx-h_1Es5zxXakqEQ4VnEYZCXpWW_8Rmrl4pN1yV-s-1d_qg6kBSbexs0XcddYBKPk8NAwLOwyJ-W75hWEw
        webRequest: https://www.google.com/gen_204?v=3&s=web&atyp=csi&ei=pa22V6CHGoHAjAPhgoPQBg&ei=pa22V6CHGoHAjAPhgoPQBg&cr=r&imp=0&pfa=n.1,ttfc.152,ttlc.0,cbt.96&pfm=n.1,ttfc.152,ttlc.0,cbt.96&pmd=max.17,avg.2,0,1,0,1,0,1,5,0,0,0,0,0,1,1,1,1,1,11,17,1&imn=1&adh=&xjs=dispose.3.11.ifl.1.fpe.1.jsa.1.m.0.lu.0&it=jradf.9&ima=1&rt=ol.553,jsrt.155,prt.557,pprt.557,iml.558,aft.557
        webRequest: https://www.google.com/xjs/_/js/k=xjs.s.en_US.tUVHO5ck74k.O/m=aspn,crd,sy7,sy268,sy314,sy3,sy9,sy54,sy315,sy316,sy27,sy317,dvl,sy57,sy58,sy300,em11,vs,sy85,sy86,sy88,sy90,sy81,sy83,sy87,sy91,sy78,sy84,sy89,sy92,sy79,tnv,sy46,atn,sy355,d3l,sy93,sy168,sy169,rqa,me/am=AFCSBBCI-H8ICLcQLEgFGBgE/rt=j/d=0/t=zcms/rs=ACT90oG-vU2X0tyaGFDLQbRJNbKCWyOApg

tabs.updated event: tabId=37:: changeInfo keys:status ::changeInfo.status=undefined (override->loading)
tab.status=complete (override->loading)testTabEvents.js:96:9

        webRequest: https://www.google.com/gen_204?atyp=i&ct=slh&cad=&ei=bqW2V8rcMMfkjwOEtKXACQ&s=3&v=2&pv=0.5883361922868646&me=4:1471589138584,e,U&zx=1471589798811
        webRequest: https://www.google.com/gen_204?atyp=i&ct=slh&cad=&ei=pa22V6CHGoHAjAPhgoPQBg&t=W&s=1&v=2&pv=0.3475507940470587&me=1:1471589797809,x:4053,e,B&zx=1471589801864

Приведенная выше информация о событии была получена при запуске расширения, которое я добавил в этот ответ (для веб-запросов), вместе со следующим расширением:

testTabEvents.js (изменено вручную, как я выразился в этом ответе, поэтому может иметь одну или две ошибки):

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    let output="";
    //We use the properties of "tab" instead of "changeInfo" because in testing it was
    //  clear that changeInfo was not always properly populated. The key(s) may just
    //  exist, but not have any value associated with them.

    //*
    //Testing output showing when the event is fired.
    //  This is used to determine, by experimentation, what events to ignore and which
    //  combinations and sequence of events occur during page navigation.

    function addPropToOutput(prop){
        if(tab.hasOwnProperty(prop)){
            output += (changeInfo.hasOwnProperty(prop)) ? '\ntab.' + prop + '=' + tab[prop] : '';
            if(prop === 'status'){
                output += ((changeInfo.hasOwnProperty("status") && typeof changeInfo.status === 'undefined') ? ' (override->loading)' :'')
            }
        }else{
            output += (changeInfo.hasOwnProperty(prop)) ? '\nchangeInfo.' + prop + '=' + changeInfo[prop] : '';
        }
    }

    //Want status and url always first
    changePropertiesOrder.forEach(addPropToOutput);
    Object.getOwnPropertyNames(changeInfo).forEach(function(prop){
        if(changePropertiesOrder.indexOf(prop) === -1){
            //Not in the list
            addPropToOutput(prop);
        }
    });

    console.log("tabs.updated event: tabId=" + tabId + ":: changeInfo keys:"
                + Object.keys(changeInfo)
                + (changeInfo.hasOwnProperty("status") ? ' ::changeInfo.status=' + changeInfo.status : '')
                + ((changeInfo.hasOwnProperty("status") && typeof changeInfo.status === 'undefined') ? ' (override->loading)' :'')
                + output
    );
    if(changeInfo.hasOwnProperty("status") && typeof changeInfo.status === 'undefined'){
        changeInfo.status = 'loading';
    }
});

var webNavEvents = ['BeforeNavigate',
                    'Committed',
                    'Completed',
                    //'CreatedNavigationTarget', //Not supported by Firefox
                    'DOMContentLoaded',
                    'ErrorOccurred',
                    'HistoryStateUpdated',
                    'ReferenceFragmentUpdated'
                    //'TabReplaced' //Not supported by Firefox
                    ];

webNavEvents.forEach(function(navType){
    browser.webNavigation['on' + navType].addListener(function(type,details){
        console.log('\twebNavigation->' + type 
                    + ': tadId=' + details.tabId
                    + ':: url=' + details.url
                    + ((typeof details.transitionType === 'string') ? ':: transitionType=' + details.transitionType : '')

        );
    }.bind(undefined,navType));
});

manifest.json:

{
    "description": "Test tabs.onUpdated and webNavigation events on page load",
    "manifest_version": 2,
    "name": "onUpdated and webNavigation event testing",
    "version": "0.1",
    "applications": {
        "gecko": {
            "id": "onUpdatedWebNavigationEventTesting@testing",
            "strict_min_version": "45.0"
        }
    },
    "permissions": [
        "webNavigation",
        "activeTab",
        "tabs"
    ],
    "background": {
        "scripts": ["testTabEvents.js"]
    }
}
person Makyen♦    schedule 19.08.2016