| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| const isBlink = () => { | |
| return (navigator.vendor === 'Google Inc.') || | |
| (navigator.agent === 'Edg/'); | |
| } | |
| const hasImageCodecs = () => { | |
| if (typeof ImageDecoder === 'undefined') { | |
| return false; | |
| } | |
| // TODO(yjbanov): https://github.com/flutter/flutter/issues/122761 | |
| // Frequently, when a browser launches an API that other browsers already | |
| // support, there are subtle incompatibilities that may cause apps to crash if, | |
| // we blindly adopt the new implementation. This check prevents us from picking | |
| // up potentially incompatible implementations of ImagdeDecoder API. Instead, | |
| // when a new browser engine launches the API, we'll evaluate it and enable it | |
| // explicitly. | |
| return isBlink(); | |
| } | |
| const hasChromiumBreakIterators = () => { | |
| return (typeof Intl.v8BreakIterator !== "undefined") && | |
| (typeof Intl.Segmenter !== "undefined"); | |
| } | |
| const supportsWasmGC = () => { | |
| // This attempts to instantiate a wasm module that only will validate if the | |
| // final WasmGC spec is implemented in the browser. | |
| // | |
| // Copied from https://github.com/GoogleChromeLabs/wasm-feature-detect/blob/main/src/detectors/gc/index.js | |
| const bytes = [0, 97, 115, 109, 1, 0, 0, 0, 1, 5, 1, 95, 1, 120, 0]; | |
| return WebAssembly.validate(new Uint8Array(bytes)); | |
| } | |
| /** | |
| * @returns {import("./types").BrowserEnvironment} | |
| */ | |
| export const browserEnvironment = { | |
| hasImageCodecs: hasImageCodecs(), | |
| hasChromiumBreakIterators: hasChromiumBreakIterators(), | |
| supportsWasmGC: supportsWasmGC(), | |
| crossOriginIsolated: window.crossOriginIsolated, | |
| }; |