// 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. // TODO(goderbauer): Remove this ignore when the documentation for the // now private, then public typedefs is clear. // ignore_for_file: library_private_types_in_public_api @JS() library js_location_strategy; import 'dart:async'; import 'dart:html' as html; import 'dart:ui' as ui; import 'package:js/js.dart'; import 'package:meta/meta.dart'; import '../navigation_common/url_strategy.dart'; typedef _JsSetUrlStrategy = void Function(JsUrlStrategy?); /// A JavaScript hook to customize the URL strategy of a Flutter app. // // Keep this in sync with the JS name in the web engine. Find it at: // https://github.com/flutter/engine/blob/master/lib/web_ui/lib/src/engine/navigation/js_url_strategy.dart // // TODO(mdebbar): Add integration test https://github.com/flutter/flutter/issues/66852 @JS('_flutter_web_set_location_strategy') external _JsSetUrlStrategy get jsSetUrlStrategy; typedef _PathGetter = String Function(); typedef _StateGetter = Object? Function(); typedef _AddPopStateListener = ui.VoidCallback Function(EventListener); typedef _StringToString = String Function(String); typedef _StateOperation = void Function(Object state, String title, String url); typedef _HistoryMove = Future<void> Function(int count); /// Given a Dart implementation of URL strategy, converts it to a JavaScript /// URL strategy to be passed through JS interop. JsUrlStrategy convertToJsUrlStrategy(UrlStrategy strategy) { return JsUrlStrategy( getPath: allowInterop(strategy.getPath), getState: allowInterop(strategy.getState), addPopStateListener: allowInterop(strategy.addPopStateListener), prepareExternalUrl: allowInterop(strategy.prepareExternalUrl), pushState: allowInterop(strategy.pushState), replaceState: allowInterop(strategy.replaceState), go: allowInterop(strategy.go), ); } /// The JavaScript representation of a URL strategy. /// /// This is used to pass URL strategy implementations across a JS-interop /// bridge from the app to the engine. @JS() @anonymous abstract class JsUrlStrategy { /// Creates an instance of [JsUrlStrategy] from a bag of URL strategy /// functions. external factory JsUrlStrategy({ @required _PathGetter getPath, @required _StateGetter getState, @required _AddPopStateListener addPopStateListener, @required _StringToString prepareExternalUrl, @required _StateOperation pushState, @required _StateOperation replaceState, @required _HistoryMove go, }); /// Adds a listener to the `popstate` event and returns a function that /// removes the listener. external ui.VoidCallback addPopStateListener(html.EventListener fn); /// Returns the active path in the browser. external String getPath(); /// Returns the history state in the browser. /// /// See: https://developer.mozilla.org/en-US/docs/Web/API/History/state external Object getState(); /// Given a path that's internal to the app, create the external url that /// will be used in the browser. external String prepareExternalUrl(String internalUrl); /// Push a new history entry. /// /// See: https://developer.mozilla.org/en-US/docs/Web/API/History/pushState external void pushState(Object? state, String title, String url); /// Replace the currently active history entry. /// /// See: https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState external void replaceState(Object? state, String title, String url); /// Moves forwards or backwards through the history stack. /// /// A negative [count] value causes a backward move in the history stack. And /// a positive [count] value causes a forward move. /// /// Examples: /// /// * `go(-2)` moves back 2 steps in history. /// * `go(3)` moves forward 3 steps in history. /// /// See: https://developer.mozilla.org/en-US/docs/Web/API/History/go external Future<void> go(int count); }