Skip to content

Commit 6514ad2

Browse files
author
Ioan Moldovan
authored
fix: enable google contact search in firefox (#5820)
1 parent a84810e commit 6514ad2

File tree

4 files changed

+34
-22
lines changed

4 files changed

+34
-22
lines changed

extension/chrome/elements/compose-modules/compose-recipients-module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -861,9 +861,10 @@ export class ComposeRecipientsModule extends ViewModule<ComposeView> {
861861
.on(
862862
'click',
863863
this.view.setHandler(async () => {
864-
const authResult = await GoogleOAuth.newAuthPopup({
864+
const authResult = await BrowserMsg.send.bg.await.reconnectAcctAuthPopup({
865865
acctEmail: this.view.acctEmail,
866866
scopes: GoogleOAuth.defaultScopes('contacts'),
867+
screenDimensions: Ui.getScreenDimensions(),
867868
});
868869
if (authResult.result === 'Success') {
869870
this.googleContactsSearchEnabled = true;

extension/js/common/browser/browser-msg.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,7 @@ export class BrowserMsg {
596596
private static async sendAwait(destString: string | undefined, name: string, bm?: Dict<unknown>, awaitRes = false): Promise<Bm.Response> {
597597
bm = bm || {};
598598
// console.debug(`sendAwait ${name} to ${destString || 'bg'}`, bm);
599-
const isBackgroundPage = Env.isBackgroundPage();
599+
const isBackgroundPage = await Env.isBackgroundPage();
600600
if (isBackgroundPage && BrowserMsg.HANDLERS_REGISTERED_BACKGROUND && typeof destString === 'undefined') {
601601
// calling from bg script to bg script: skip messaging
602602
const handler: Bm.AsyncRespondingHandler = BrowserMsg.HANDLERS_REGISTERED_BACKGROUND[name];
@@ -605,7 +605,7 @@ export class BrowserMsg {
605605
return await BrowserMsg.sendRaw(destString, name, bm, awaitRes);
606606
}
607607

608-
private static sendRaw(destString: string | undefined, name: string, bm: Dict<unknown>, awaitRes = false): Promise<Bm.Response> {
608+
private static async sendRaw(destString: string | undefined, name: string, bm: Dict<unknown>, awaitRes = false): Promise<Bm.Response> {
609609
const msg: Bm.Raw = {
610610
name,
611611
data: { bm },
@@ -614,7 +614,7 @@ export class BrowserMsg {
614614
stack: Catch.stackTrace(),
615615
};
616616
// eslint-disable-next-line no-null/no-null
617-
if (!Env.isBackgroundPage() && msg.to !== null) {
617+
if (!(await Env.isBackgroundPage()) && msg.to !== null) {
618618
const validMsg: Bm.RawWithWindowExtensions = { ...msg, to: msg.to };
619619
// send via window messaging in parallel
620620
Catch.try(async () => {
@@ -661,19 +661,25 @@ export class BrowserMsg {
661661
};
662662
try {
663663
if (chrome.runtime) {
664-
if (Env.isBackgroundPage()) {
665-
chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
666-
for (const tab of tabs) {
667-
chrome.tabs.sendMessage(Number(tab.id), msg, resolve);
664+
Env.isBackgroundPage()
665+
.then(isBackgroundPage => {
666+
if (isBackgroundPage) {
667+
chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
668+
for (const tab of tabs) {
669+
chrome.tabs.sendMessage(Number(tab.id), msg, resolve);
670+
}
671+
});
672+
} else {
673+
if (awaitRes) {
674+
chrome.runtime.sendMessage(msg, processRawMsgResponse);
675+
} else {
676+
void chrome.runtime.sendMessage(msg);
677+
}
668678
}
679+
})
680+
.catch((e: unknown) => {
681+
throw e;
669682
});
670-
} else {
671-
if (awaitRes) {
672-
chrome.runtime.sendMessage(msg, processRawMsgResponse);
673-
} else {
674-
void chrome.runtime.sendMessage(msg);
675-
}
676-
}
677683
} else {
678684
BrowserMsg.renderFatalErrCorner('Error: missing chrome.runtime', 'RED-RELOAD-PROMPT');
679685
}

extension/js/common/browser/chrome.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import { AbstractStore } from '../platform/store/abstract-store.js';
1111

1212
type ChromeStorageType = 'local' | 'session';
1313

14-
const handleFatalErr = (reason: 'storage_undefined', error: Error) => {
14+
const handleFatalErr = async (reason: 'storage_undefined', error: Error) => {
1515
try {
16-
if (Env.isBackgroundPage()) {
16+
if (await Env.isBackgroundPage()) {
1717
throw error;
1818
} else if (Env.isContentScript()) {
1919
console.error('Incomplete extension environment in content script', error);
@@ -46,7 +46,7 @@ export const windowsCreate = async (q: chrome.windows.CreateData): Promise<chrom
4646
export const storageGet = async (storageType: ChromeStorageType, keys: string[]): Promise<Dict<unknown>> => {
4747
return await new Promise((resolve, reject) => {
4848
if (typeof chrome.storage === 'undefined') {
49-
handleFatalErr('storage_undefined', new Error('storage is undefined'));
49+
void handleFatalErr('storage_undefined', new Error('storage is undefined'));
5050
} else {
5151
const storage = chrome.storage[storageType];
5252
storage.get(keys, result => {
@@ -65,7 +65,7 @@ export const storageGet = async (storageType: ChromeStorageType, keys: string[])
6565
export const storageGetAll = async (storageType: ChromeStorageType): Promise<{ [key: string]: unknown }> => {
6666
return await new Promise(resolve => {
6767
if (typeof chrome.storage === 'undefined') {
68-
handleFatalErr('storage_undefined', new Error('storage is undefined'));
68+
void handleFatalErr('storage_undefined', new Error('storage is undefined'));
6969
} else {
7070
const storage = chrome.storage[storageType];
7171
storage.get(resolve);
@@ -76,7 +76,7 @@ export const storageGetAll = async (storageType: ChromeStorageType): Promise<{ [
7676
export const storageSet = async (storageType: ChromeStorageType, values: Dict<unknown>): Promise<void> => {
7777
return await new Promise(resolve => {
7878
if (typeof chrome.storage === 'undefined') {
79-
handleFatalErr('storage_undefined', new Error('storage is undefined'));
79+
void handleFatalErr('storage_undefined', new Error('storage is undefined'));
8080
} else {
8181
const storage = chrome.storage[storageType];
8282
storage.set(values, resolve);
@@ -87,7 +87,7 @@ export const storageSet = async (storageType: ChromeStorageType, values: Dict<un
8787
export const storageRemove = async (storageType: ChromeStorageType, keys: string[]): Promise<void> => {
8888
return await new Promise(resolve => {
8989
if (typeof chrome.storage === 'undefined') {
90-
handleFatalErr('storage_undefined', new Error('storage is undefined'));
90+
void handleFatalErr('storage_undefined', new Error('storage is undefined'));
9191
} else {
9292
const storage = chrome.storage[storageType];
9393
storage.remove(keys, resolve);

extension/js/common/browser/env.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@ export class Env {
4141
}
4242

4343
// Check if the current context is a Service Worker
44-
public static isBackgroundPage() {
44+
public static async isBackgroundPage() {
45+
// In firefox, window&document is not null even in background page
46+
if (typeof browser !== 'undefined' && typeof browser.runtime?.getBackgroundPage !== 'undefined') {
47+
const backgroundPage = await browser.runtime.getBackgroundPage();
48+
return backgroundPage === window;
49+
}
4550
return typeof window === 'undefined' && typeof document === 'undefined';
4651
}
4752

0 commit comments

Comments
 (0)