2016-08-18 9 views
0

Я вижу это поведение только при загрузке страницы Google SERP (при поиске в окне поиска на странице google.com/ или на странице SERP это самостоятельно). Я видел ожидаемое поведение для других страниц, т. Е. Я видел unifined, загрузку и, наконец, полную.tabs.onUpdated.addListener's changeInfo.status переходит из undefined в Complete без необходимости загрузки

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 вызывает загрузку и завершение состояния, как ожидалось.

+0

Это не содержит актуального вопроса. Просьба уточнить вашу конкретную проблему или добавить дополнительные сведения, чтобы точно указать, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. См. Страницу [ask] для выяснения этого вопроса. Как написано, весь этот вопрос информирует нас о поведении, которое отличается от Google Chrome и Firefox. – Makyen

+0

Если вам нужна помощь, нам нужно знать, как вы используете эту информацию, и почему у вас есть *, чтобы иметь ['changeInfo.status'] (https://developer.mozilla.org/en-US/Add -ons/WebExtensions/API/tabs/onUpdated) переход от 'undefined'➞''loading''''complete '' вместо' undefined'''complete ''. – Makyen

+0

Связанный: [WebExtension: React при перегрузке закладки aa] (http://stackoverflow.com/q/38407703/3773011) – Makyen

ответ

1

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

В настоящее время в Firefox объект changeInfo, который передается функции слушателя для chrome.tabs.onUpdated, может быть недействительным. Предполагается, что только two possible values: 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 

выше события информация была получена от запуска extension I put in this answer (для webRequests) со следующим расширением:

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)); 
}); 

манифест.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": "[email protected]", 
      "strict_min_version": "45.0" 
     } 
    }, 
    "permissions": [ 
     "webNavigation", 
     "activeTab", 
     "tabs" 
    ], 
    "background": { 
     "scripts": ["testTabEvents.js"] 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^