67 lines
2.5 KiB
Dart
67 lines
2.5 KiB
Dart
// Copyright 2014 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.
|
|
|
|
import 'dart:html' as html;
|
|
import 'dart:ui' as ui;
|
|
|
|
import 'platform.dart' as platform;
|
|
|
|
export 'platform.dart' show TargetPlatform;
|
|
|
|
/// The dart:html implementation of [platform.defaultTargetPlatform].
|
|
platform.TargetPlatform get defaultTargetPlatform {
|
|
// To get a better guess at the targetPlatform we need to be able to reference
|
|
// the window, but that won't be available until we fix the platforms
|
|
// configuration for Flutter.
|
|
return platform.debugDefaultTargetPlatformOverride ??
|
|
_testPlatform ??
|
|
_browserPlatform;
|
|
}
|
|
|
|
final platform.TargetPlatform? _testPlatform = () {
|
|
platform.TargetPlatform? result;
|
|
assert(() {
|
|
// This member is only available in the web's dart:ui implementation.
|
|
// ignore: undefined_prefixed_name
|
|
if (ui.debugEmulateFlutterTesterEnvironment as bool) {
|
|
result = platform.TargetPlatform.android;
|
|
}
|
|
return true;
|
|
}());
|
|
return result;
|
|
}();
|
|
|
|
// Lazy-initialized and forever cached current browser platform.
|
|
//
|
|
// Computing the platform is expensive as it uses `window.matchMedia`, which
|
|
// needs to parse and evaluate a CSS selector. On some devices this takes up to
|
|
// 0.20ms. As `defaultTargetPlatform` is routinely called dozens of times per
|
|
// frame this value should be cached.
|
|
final platform.TargetPlatform _browserPlatform = () {
|
|
final String navigatorPlatform = html.window.navigator.platform?.toLowerCase() ?? '';
|
|
if (navigatorPlatform.startsWith('mac')) {
|
|
return platform.TargetPlatform.macOS;
|
|
}
|
|
if (navigatorPlatform.startsWith('win')) {
|
|
return platform.TargetPlatform.windows;
|
|
}
|
|
if (navigatorPlatform.contains('iphone') ||
|
|
navigatorPlatform.contains('ipad') ||
|
|
navigatorPlatform.contains('ipod')) {
|
|
return platform.TargetPlatform.iOS;
|
|
}
|
|
if (navigatorPlatform.contains('android')) {
|
|
return platform.TargetPlatform.android;
|
|
}
|
|
// Since some phones can report a window.navigator.platform as Linux, fall
|
|
// back to use CSS to disambiguate Android vs Linux desktop. If the CSS
|
|
// indicates that a device has a "fine pointer" (mouse) as the primary
|
|
// pointing device, then we'll assume desktop linux, and otherwise we'll
|
|
// assume Android.
|
|
if (html.window.matchMedia('only screen and (pointer: fine)').matches) {
|
|
return platform.TargetPlatform.linux;
|
|
}
|
|
return platform.TargetPlatform.android;
|
|
}();
|