| // 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. |
| |
| part of dart.ui; |
| |
| @pragma('vm:entry-point') |
| void _updateWindowMetrics( |
| Object id, |
| double devicePixelRatio, |
| double width, |
| double height, |
| double viewPaddingTop, |
| double viewPaddingRight, |
| double viewPaddingBottom, |
| double viewPaddingLeft, |
| double viewInsetTop, |
| double viewInsetRight, |
| double viewInsetBottom, |
| double viewInsetLeft, |
| double systemGestureInsetTop, |
| double systemGestureInsetRight, |
| double systemGestureInsetBottom, |
| double systemGestureInsetLeft, |
| double physicalTouchSlop, |
| List<double> displayFeaturesBounds, |
| List<int> displayFeaturesType, |
| List<int> displayFeaturesState, |
| ) { |
| PlatformDispatcher.instance._updateWindowMetrics( |
| id, |
| devicePixelRatio, |
| width, |
| height, |
| viewPaddingTop, |
| viewPaddingRight, |
| viewPaddingBottom, |
| viewPaddingLeft, |
| viewInsetTop, |
| viewInsetRight, |
| viewInsetBottom, |
| viewInsetLeft, |
| systemGestureInsetTop, |
| systemGestureInsetRight, |
| systemGestureInsetBottom, |
| systemGestureInsetLeft, |
| physicalTouchSlop, |
| displayFeaturesBounds, |
| displayFeaturesType, |
| displayFeaturesState, |
| ); |
| } |
| |
| typedef _LocaleClosure = String Function(); |
| |
| @pragma('vm:entry-point') |
| _LocaleClosure? _getLocaleClosure() => PlatformDispatcher.instance._localeClosure; |
| |
| @pragma('vm:entry-point') |
| void _updateLocales(List<String> locales) { |
| PlatformDispatcher.instance._updateLocales(locales); |
| } |
| |
| @pragma('vm:entry-point') |
| void _updateUserSettingsData(String jsonData) { |
| PlatformDispatcher.instance._updateUserSettingsData(jsonData); |
| } |
| |
| @pragma('vm:entry-point') |
| void _updateLifecycleState(String state) { |
| PlatformDispatcher.instance._updateLifecycleState(state); |
| } |
| |
| @pragma('vm:entry-point') |
| void _updateSemanticsEnabled(bool enabled) { |
| PlatformDispatcher.instance._updateSemanticsEnabled(enabled); |
| } |
| |
| @pragma('vm:entry-point') |
| void _updateAccessibilityFeatures(int values) { |
| PlatformDispatcher.instance._updateAccessibilityFeatures(values); |
| } |
| |
| @pragma('vm:entry-point') |
| void _dispatchPlatformMessage(String name, ByteData? data, int responseId) { |
| PlatformDispatcher.instance._dispatchPlatformMessage(name, data, responseId); |
| } |
| |
| @pragma('vm:entry-point') |
| void _dispatchPointerDataPacket(ByteData packet) { |
| PlatformDispatcher.instance._dispatchPointerDataPacket(packet); |
| } |
| |
| @pragma('vm:entry-point') |
| void _dispatchSemanticsAction(int id, int action, ByteData? args) { |
| PlatformDispatcher.instance._dispatchSemanticsAction(id, action, args); |
| } |
| |
| @pragma('vm:entry-point') |
| void _beginFrame(int microseconds, int frameNumber) { |
| PlatformDispatcher.instance._beginFrame(microseconds); |
| PlatformDispatcher.instance._updateFrameData(frameNumber); |
| } |
| |
| @pragma('vm:entry-point') |
| void _reportTimings(List<int> timings) { |
| PlatformDispatcher.instance._reportTimings(timings); |
| } |
| |
| @pragma('vm:entry-point') |
| void _drawFrame() { |
| PlatformDispatcher.instance._drawFrame(); |
| } |
| |
| @pragma('vm:entry-point') |
| bool _onError(Object error, StackTrace? stackTrace) { |
| return PlatformDispatcher.instance._dispatchError(error, stackTrace ?? StackTrace.empty); |
| } |
| |
| // ignore: always_declare_return_types, prefer_generic_function_type_aliases |
| typedef _ListStringArgFunction(List<String> args); |
| |
| @pragma('vm:entry-point') |
| void _runMain(Function startMainIsolateFunction, |
| Function userMainFunction, |
| List<String> args) { |
| startMainIsolateFunction(() { // ignore: avoid_dynamic_calls |
| if (userMainFunction is _ListStringArgFunction) { |
| userMainFunction(args); |
| } else { |
| userMainFunction(); // ignore: avoid_dynamic_calls |
| } |
| }, null); |
| } |
| |
| /// Invokes [callback] inside the given [zone]. |
| void _invoke(void Function()? callback, Zone zone) { |
| if (callback == null) { |
| return; |
| } |
| |
| assert(zone != null); |
| |
| if (identical(zone, Zone.current)) { |
| callback(); |
| } else { |
| zone.runGuarded(callback); |
| } |
| } |
| |
| /// Invokes [callback] inside the given [zone] passing it [arg]. |
| /// |
| /// The 1 in the name refers to the number of arguments expected by |
| /// the callback (and thus passed to this function, in addition to the |
| /// callback itself and the zone in which the callback is executed). |
| void _invoke1<A>(void Function(A a)? callback, Zone zone, A arg) { |
| if (callback == null) { |
| return; |
| } |
| |
| assert(zone != null); |
| |
| if (identical(zone, Zone.current)) { |
| callback(arg); |
| } else { |
| zone.runUnaryGuarded<A>(callback, arg); |
| } |
| } |
| |
| /// Invokes [callback] inside the given [zone] passing it [arg1] and [arg2]. |
| /// |
| /// The 2 in the name refers to the number of arguments expected by |
| /// the callback (and thus passed to this function, in addition to the |
| /// callback itself and the zone in which the callback is executed). |
| void _invoke2<A1, A2>(void Function(A1 a1, A2 a2)? callback, Zone zone, A1 arg1, A2 arg2) { |
| if (callback == null) { |
| return; |
| } |
| |
| assert(zone != null); |
| |
| if (identical(zone, Zone.current)) { |
| callback(arg1, arg2); |
| } else { |
| zone.runGuarded(() { |
| callback(arg1, arg2); |
| }); |
| } |
| } |
| |
| /// Invokes [callback] inside the given [zone] passing it [arg1], [arg2], and [arg3]. |
| /// |
| /// The 3 in the name refers to the number of arguments expected by |
| /// the callback (and thus passed to this function, in addition to the |
| /// callback itself and the zone in which the callback is executed). |
| void _invoke3<A1, A2, A3>(void Function(A1 a1, A2 a2, A3 a3)? callback, Zone zone, A1 arg1, A2 arg2, A3 arg3) { |
| if (callback == null) { |
| return; |
| } |
| |
| assert(zone != null); |
| |
| if (identical(zone, Zone.current)) { |
| callback(arg1, arg2, arg3); |
| } else { |
| zone.runGuarded(() { |
| callback(arg1, arg2, arg3); |
| }); |
| } |
| } |
| |
| bool _isLoopback(String host) { |
| if (host.isEmpty) { |
| return false; |
| } |
| if ('localhost' == host) { |
| return true; |
| } |
| try { |
| return InternetAddress(host).isLoopback; |
| } on ArgumentError { |
| return false; |
| } |
| } |
| |
| /// Loopback connections are always allowed. |
| /// Zone override with 'flutter.io.allow_http' takes first priority. |
| /// If zone override is not provided, engine setting is checked. |
| @pragma('vm:entry-point') |
| void Function(Uri) _getHttpConnectionHookClosure(bool mayInsecurelyConnectToAllDomains) { |
| return (Uri uri) { |
| final Object? zoneOverride = Zone.current[#flutter.io.allow_http]; |
| if (zoneOverride == true) { |
| return; |
| } |
| if (zoneOverride == false && uri.isScheme('http')) { |
| // Going to _isLoopback check before throwing |
| } else if (mayInsecurelyConnectToAllDomains || uri.isScheme('https')) { |
| // In absence of zone override, if engine setting allows the connection |
| // or if connection is to `https`, allow the connection. |
| return; |
| } |
| // Loopback connections are always allowed |
| // Check at last resort to avoid debug annoyance of try/on ArgumentError |
| if (_isLoopback(uri.host)) { |
| return; |
| } |
| throw UnsupportedError( |
| 'Non-https connection "$uri" is not supported by the platform. ' |
| 'Refer to https://flutter.dev/docs/release/breaking-changes/network-policy-ios-android.'); |
| }; |
| } |