@@ -369,57 +369,36 @@ async function searchEngine(session, search, doc, docId, tabActive) {
369369 }
370370
371371 const token = uuidv4 ( ) ;
372-
373- const tab = await createTab ( {
374- token,
375- index : session . sourceTabIndex ,
376- active : tabActive ,
377- getTab : true
378- } ) ;
379- const tabId = tab . id ;
380-
381- if ( search . sendsReceipt ) {
382- await registry . addTaskRegistryItem ( { taskId, tabId} ) ;
383- }
372+ const beaconToken = targetEnv === 'samsung' ? uuidv4 ( ) : '' ;
384373
385374 const tabUrl = await getTabUrl ( session , search , doc , taskId ) ;
386375
387- await setupNewEngineTab ( tabId , tabUrl , token , search . engine ) ;
388- }
376+ const setupSteps = [ ] ;
389377
390- async function setupNewEngineTab ( tabId , tabUrl , token , engine ) {
391- let beaconToken ;
392- const userAgent = await getRequiredUserAgent ( engine ) ;
378+ const userAgent = await getRequiredUserAgent ( search . engine ) ;
393379 if ( userAgent ) {
394- if ( targetEnv === 'samsung' ) {
395- // Samsung Internet 13: webRequest listener filtering by tab ID
396- // provided by tabs.createTab returns requests from different tab.
397- beaconToken = uuidv4 ( ) ;
398-
399- function requestCallback ( details ) {
400- removeCallback ( ) ;
401- setUserAgentHeader ( details . tabId , userAgent ) ;
402- }
380+ setupSteps . push ( { id : 'setUserAgent' , tabUrl, userAgent, beaconToken} ) ;
381+ }
403382
404- const removeCallback = function ( ) {
405- window . clearTimeout ( timeoutId ) ;
406- browser . webRequest . onBeforeRequest . removeListener ( requestCallback ) ;
407- } ;
408- const timeoutId = window . setTimeout ( removeCallback , 10000 ) ; // 10 seconds
409-
410- browser . webRequest . onBeforeRequest . addListener (
411- requestCallback ,
412- {
413- urls : [ getNewTabUrl ( beaconToken ) ] ,
414- types : [ 'main_frame' ]
415- } ,
416- [ 'blocking' ]
417- ) ;
418- } else {
419- setUserAgentHeader ( tabId , userAgent ) ;
420- }
383+ if ( search . sendsReceipt ) {
384+ setupSteps . push ( { id : 'addTask' , taskId} ) ;
385+ }
386+
387+ const storageItem = {
388+ tabUrl : beaconToken ? getNewTabUrl ( beaconToken ) : tabUrl ,
389+ keepHistory : false
390+ } ;
391+
392+ if ( setupSteps . length ) {
393+ storageItem . setupSteps = setupSteps ;
421394 }
422395
396+ await registry . addStorageItem ( storageItem , {
397+ receipts : { expected : 1 , received : 0 } ,
398+ expiryTime : 1.0 ,
399+ token
400+ } ) ;
401+
423402 if ( beaconToken ) {
424403 await registry . addStorageItem (
425404 { tabUrl, keepHistory : false } ,
@@ -431,31 +410,66 @@ async function setupNewEngineTab(tabId, tabUrl, token, engine) {
431410 ) ;
432411 }
433412
434- await registry . addStorageItem (
435- {
436- tabUrl : beaconToken ? getNewTabUrl ( beaconToken ) : tabUrl ,
437- keepHistory : false
438- } ,
439- {
440- receipts : { expected : 1 , received : 0 } ,
441- expiryTime : 1.0 ,
442- token
413+ await createTab ( { token, index : session . sourceTabIndex , active : tabActive } ) ;
414+ }
415+
416+ async function setupTab ( sender , steps ) {
417+ const results = { } ;
418+
419+ for ( const step of steps ) {
420+ if ( step . id === 'setUserAgent' ) {
421+ await setTabUserAgent ( {
422+ tabId : sender . tab . id ,
423+ tabUrl : step . tabUrl ,
424+ userAgent : step . userAgent ,
425+ beaconToken : step . beaconToken
426+ } ) ;
427+
428+ results [ step . id ] = '' ;
429+ } else if ( step . id === 'addTask' ) {
430+ await registry . addTaskRegistryItem ( {
431+ taskId : step . taskId ,
432+ tabId : sender . tab . id
433+ } ) ;
434+
435+ results [ step . id ] = '' ;
443436 }
444- ) ;
437+ }
438+
439+ return results ;
440+ }
441+
442+ async function setTabUserAgent ( { tabId, tabUrl, userAgent, beaconToken} = { } ) {
443+ if ( targetEnv === 'samsung' ) {
444+ // Samsung Internet 13: webRequest listener filtering by tab ID
445+ // provided by tabs.createTab returns requests from different tab.
445446
446- if ( targetEnv === 'safari' ) {
447- browser . runtime
448- . sendMessage ( { id : 'setTabLocation' , token} )
449- . catch ( err => null ) ;
447+ function requestCallback ( details ) {
448+ removeCallback ( ) ;
449+ setUserAgentHeader ( details . tabId , userAgent ) ;
450+ }
451+
452+ const removeCallback = function ( ) {
453+ window . clearTimeout ( timeoutId ) ;
454+ browser . webRequest . onBeforeRequest . removeListener ( requestCallback ) ;
455+ } ;
456+ const timeoutId = window . setTimeout ( removeCallback , 10000 ) ; // 10 seconds
457+
458+ browser . webRequest . onBeforeRequest . addListener (
459+ requestCallback ,
460+ {
461+ urls : [ getNewTabUrl ( beaconToken ) ] ,
462+ types : [ 'main_frame' ]
463+ } ,
464+ [ 'blocking' ]
465+ ) ;
450466 } else {
451- browser . tabs
452- . sendMessage ( tabId , { id : 'setTabLocation' , token} , { frameId : 0 } )
453- . catch ( err => null ) ;
467+ setUserAgentHeader ( tabId , userAgent ) ;
454468 }
455469}
456470
457471async function getRequiredUserAgent ( engine ) {
458- if ( await isAndroid ( ) ) {
472+ if ( await isMobile ( ) ) {
459473 // Google only works with a Chrome user agent on Firefox for Android,
460474 // while other search engines may need a desktop user agent.
461475 if ( targetEnv === 'firefox' && [ 'google' , 'googleText' ] . includes ( engine ) ) {
@@ -818,6 +832,8 @@ async function processMessage(request, sender) {
818832 await onOptionChange ( ) ;
819833 } else if ( request . id === 'showPage' ) {
820834 await showPage ( { url : request . url } ) ;
835+ } else if ( request . id === 'setupTab' ) {
836+ return setupTab ( sender , request . steps ) ;
821837 }
822838}
823839
0 commit comments