diff --git a/packages/firestore/CHANGELOG.md b/packages/firestore/CHANGELOG.md index 2cac668f4b1..30390790265 100644 --- a/packages/firestore/CHANGELOG.md +++ b/packages/firestore/CHANGELOG.md @@ -1,4 +1,8 @@ # Unreleased +- [fixed] Fixed an issue where auth credentials were not respected in some + Firefox or Chrome extensions. (#1491) + +# 1.9.2 - [fixed] Fixed an issue where auth credentials were not respected in certain browser environments (Electron 7, IE11 in trusted zone, UWP apps). (#1491) diff --git a/packages/firestore/src/platform_browser/webchannel_connection.ts b/packages/firestore/src/platform_browser/webchannel_connection.ts index c1b64b61e84..48674cc0e84 100644 --- a/packages/firestore/src/platform_browser/webchannel_connection.ts +++ b/packages/firestore/src/platform_browser/webchannel_connection.ts @@ -25,7 +25,13 @@ import { XhrIo } from '@firebase/webchannel-wrapper'; -import { isElectron, isIE, isReactNative, isUWP } from '@firebase/util'; +import { + isBrowserExtension, + isElectron, + isIE, + isReactNative, + isUWP +} from '@firebase/util'; import { Token } from '../api/credentials'; import { DatabaseId, DatabaseInfo } from '../core/database_info'; @@ -268,7 +274,13 @@ export class WebChannelConnection implements Connection { // doesn't have an Origin header. So we have to exclude a few browser environments that are // known to (sometimes) not include an Origin. See // https://github.com/firebase/firebase-js-sdk/issues/1491. - if (!isReactNative() && !isElectron() && !isIE() && !isUWP()) { + if ( + !isReactNative() && + !isElectron() && + !isIE() && + !isUWP() && + !isBrowserExtension() + ) { request.httpHeadersOverwriteParam = '$httpHeaders'; } diff --git a/packages/util/src/environment.ts b/packages/util/src/environment.ts index cb4bd4c9b91..b7509826f16 100644 --- a/packages/util/src/environment.ts +++ b/packages/util/src/environment.ts @@ -72,6 +72,24 @@ export function isBrowser(): boolean { return typeof self === 'object' && self.self === self; } +/** + * Detect browser extensions (Chrome and Firefox at least). + */ +interface BrowserRuntime { + id?: unknown; +} +declare const chrome: { runtime?: BrowserRuntime }; +declare const browser: { runtime?: BrowserRuntime }; +export function isBrowserExtension(): boolean { + const runtime = + typeof chrome === 'object' + ? chrome.runtime + : typeof browser === 'object' + ? browser.runtime + : undefined; + return typeof runtime === 'object' && runtime.id !== undefined; +} + /** * Detect React Native. *