Files
TPSchedule/mobile/lib/features/school/school_browser.dart
T

68 lines
2.0 KiB
Dart

import 'package:webview_flutter/webview_flutter.dart';
import 'package:webview_flutter_android/webview_flutter_android.dart';
import '../../services/diagnostic_log.dart';
import 'school_browser_diagnostics.dart';
class SchoolBrowserInfo {
const SchoolBrowserInfo({this.chromiumVersion});
final String? chromiumVersion;
}
typedef SchoolBrowserConfigurator = Future<SchoolBrowserInfo> Function(
WebViewController controller,
String school,
);
/// Configure only the dedicated school browser before its first request.
Future<SchoolBrowserInfo> configureSchoolBrowser(
WebViewController controller,
String school,
) async {
final android = controller.platform;
if (android is! AndroidWebViewController) return const SchoolBrowserInfo();
try {
await android.setUseWideViewPort(true);
final cookies = WebViewCookieManager().platform;
if (cookies is AndroidWebViewCookieManager) {
await cookies.setAcceptThirdPartyCookies(android, true);
}
await controller.setOnConsoleMessage((message) {
final code =
schoolConsoleCode(message.message) ??
(message.level == JavaScriptLogLevel.error ? 'script_error' : null);
if (code != null) {
DiagnosticLog.instance.add(
'school_console_error',
fields: {'school': school, 'code': code},
);
}
});
String? version;
try {
version = RegExp(r'\bChrome/(\d+(?:\.\d+){0,3})\b')
.firstMatch(await android.getUserAgent() ?? '')
?.group(1);
} catch (_) {
/* Version inspection must not block authentication. */
}
DiagnosticLog.instance.add(
'browser_configured',
fields: {
'school': school,
'phase': 'wide_viewport',
'result': true,
'code': 'third_party_cookies',
'version': version,
},
);
return SchoolBrowserInfo(chromiumVersion: version);
} catch (error) {
DiagnosticLog.instance.add(
'browser_setup_failed',
fields: {'school': school, 'code': error.runtimeType.toString()},
);
rethrow;
}
}