Skip to content

Commit 76f60b6

Browse files
committed
fix: improve new tab setup
1 parent f738727 commit 76f60b6

File tree

2 files changed

+92
-92
lines changed

2 files changed

+92
-92
lines changed

src/background/main.js

Lines changed: 77 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -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

457471
async 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

src/tab/main.js

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,37 @@
1-
const token = new URL(window.location.href).searchParams.get('id');
1+
async function getLocationData() {
2+
const token = new URL(window.location.href).searchParams.get('id');
3+
4+
return browser.runtime.sendMessage({
5+
id: 'storageRequest',
6+
asyncResponse: true,
7+
saveReceipt: true,
8+
storageId: token
9+
});
10+
}
211

312
function setLocation(tabUrl, keepHistory) {
4-
// Function may be called multiple times.
5-
if (self.locationUpdated) {
6-
return;
7-
} else {
8-
self.locationUpdated = true;
9-
}
10-
1113
if (keepHistory) {
1214
window.location.href = tabUrl;
1315
} else {
1416
window.location.replace(tabUrl);
1517
}
1618
}
1719

18-
async function getLocationData() {
19-
if (token) {
20-
return browser.runtime.sendMessage({
21-
id: 'storageRequest',
22-
asyncResponse: true,
23-
saveReceipt: true,
24-
storageId: token
25-
});
26-
}
20+
async function setupTab(steps) {
21+
return browser.runtime.sendMessage({id: 'setupTab', steps});
2722
}
2823

2924
async function start() {
3025
const data = await getLocationData();
31-
if (data) {
32-
setLocation(data.tabUrl, data.keepHistory);
33-
}
34-
}
3526

36-
function onMessage(request, sender) {
37-
// Samsung Internet 13: extension messages are sometimes also dispatched
38-
// to the sender frame.
39-
if (sender.url === document.URL) {
40-
return;
27+
if (data.setupSteps) {
28+
await setupTab(data.setupSteps);
4129
}
4230

43-
if (request.id === 'setTabLocation' && request.token === token) {
44-
start();
45-
}
31+
setLocation(data.tabUrl, data.keepHistory);
4632
}
4733

4834
function init() {
49-
browser.runtime.onMessage.addListener(onMessage);
50-
5135
start();
5236
}
5337

0 commit comments

Comments
 (0)