blob: 1d229737c34cc9366857a65f96f64672e81010be [file] [log] [blame]
// 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.
import 'package:flutter/foundation.dart' show visibleForTesting;
import 'package:flutter/services.dart';
import 'package:url_launcher_platform_interface/link.dart';
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
import 'src/messages.g.dart';
/// An implementation of [UrlLauncherPlatform] for macOS.
class UrlLauncherMacOS extends UrlLauncherPlatform {
/// Creates a new plugin implementation instance.
UrlLauncherMacOS({
@visibleForTesting UrlLauncherApi? api,
}) : _hostApi = api ?? UrlLauncherApi();
final UrlLauncherApi _hostApi;
/// Registers this class as the default instance of [UrlLauncherPlatform].
static void registerWith() {
UrlLauncherPlatform.instance = UrlLauncherMacOS();
}
@override
final LinkDelegate? linkDelegate = null;
@override
Future<bool> canLaunch(String url) async {
final UrlLauncherBoolResult result = await _hostApi.canLaunchUrl(url);
switch (result.error) {
case UrlLauncherError.invalidUrl:
throw _getInvalidUrlException(url);
case null:
}
return result.value;
}
@override
Future<bool> launch(
String url, {
required bool useSafariVC,
required bool useWebView,
required bool enableJavaScript,
required bool enableDomStorage,
required bool universalLinksOnly,
required Map<String, String> headers,
String? webOnlyWindowName,
}) async {
final UrlLauncherBoolResult result = await _hostApi.launchUrl(url);
switch (result.error) {
case UrlLauncherError.invalidUrl:
throw _getInvalidUrlException(url);
case null:
}
return result.value;
}
@override
Future<bool> supportsMode(PreferredLaunchMode mode) async {
return mode == PreferredLaunchMode.platformDefault ||
mode == PreferredLaunchMode.externalApplication;
}
@override
Future<bool> supportsCloseForMode(PreferredLaunchMode mode) async {
// No supported mode is closeable.
return false;
}
Exception _getInvalidUrlException(String url) {
// TODO(stuartmorgan): Make this an actual ArgumentError. This should be
// coordinated across all platforms as a breaking change to have them all
// return the same thing; currently it throws a PlatformException to
// preserve existing behavior.
return PlatformException(
code: 'argument_error',
message: 'Unable to parse URL',
details: 'Provided URL: $url');
}
}