@@ -369,57 +369,36 @@ async function searchEngine(session, search, doc, docId, tabActive) {
369
369
}
370
370
371
371
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 ( ) : '' ;
384
373
385
374
const tabUrl = await getTabUrl ( session , search , doc , taskId ) ;
386
375
387
- await setupNewEngineTab ( tabId , tabUrl , token , search . engine ) ;
388
- }
376
+ const setupSteps = [ ] ;
389
377
390
- async function setupNewEngineTab ( tabId , tabUrl , token , engine ) {
391
- let beaconToken ;
392
- const userAgent = await getRequiredUserAgent ( engine ) ;
378
+ const userAgent = await getRequiredUserAgent ( search . engine ) ;
393
379
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
+ }
403
382
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 ;
421
394
}
422
395
396
+ await registry . addStorageItem ( storageItem , {
397
+ receipts : { expected : 1 , received : 0 } ,
398
+ expiryTime : 1.0 ,
399
+ token
400
+ } ) ;
401
+
423
402
if ( beaconToken ) {
424
403
await registry . addStorageItem (
425
404
{ tabUrl, keepHistory : false } ,
@@ -431,31 +410,66 @@ async function setupNewEngineTab(tabId, tabUrl, token, engine) {
431
410
) ;
432
411
}
433
412
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 ] = '' ;
443
436
}
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.
445
446
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
+ ) ;
450
466
} else {
451
- browser . tabs
452
- . sendMessage ( tabId , { id : 'setTabLocation' , token} , { frameId : 0 } )
453
- . catch ( err => null ) ;
467
+ setUserAgentHeader ( tabId , userAgent ) ;
454
468
}
455
469
}
456
470
457
471
async function getRequiredUserAgent ( engine ) {
458
- if ( await isAndroid ( ) ) {
472
+ if ( await isMobile ( ) ) {
459
473
// Google only works with a Chrome user agent on Firefox for Android,
460
474
// while other search engines may need a desktop user agent.
461
475
if ( targetEnv === 'firefox' && [ 'google' , 'googleText' ] . includes ( engine ) ) {
@@ -818,6 +832,8 @@ async function processMessage(request, sender) {
818
832
await onOptionChange ( ) ;
819
833
} else if ( request . id === 'showPage' ) {
820
834
await showPage ( { url : request . url } ) ;
835
+ } else if ( request . id === 'setupTab' ) {
836
+ return setupTab ( sender , request . steps ) ;
821
837
}
822
838
}
823
839
0 commit comments