| // 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'; | |
| final AnchorElement _urlParsingNode = AnchorElement(); | |
| /// Extracts the pathname part of a full [url]. | |
| /// | |
| /// Example: for the url `http://example.com/foo`, the extracted pathname will | |
| /// be `/foo`. | |
| String extractPathname(String url) { | |
| _urlParsingNode.href = url; // ignore: unsafe_html, node is never exposed to the user | |
| final String pathname = _urlParsingNode.pathname ?? ''; | |
| return (pathname.isEmpty || pathname[0] == '/') ? pathname : '/$pathname'; | |
| } | |
| // The <base> element in the document. | |
| final Element? _baseElement = document.querySelector('base'); | |
| /// Returns the `href` attribute of the <base> element in the document. | |
| /// | |
| /// Returns null if the element isn't found. | |
| String? getBaseElementHrefFromDom() => _baseElement?.getAttribute('href'); | |
| /// Checks that [baseHref] is set. | |
| /// | |
| /// Throws an exception otherwise. | |
| String checkBaseHref(String? baseHref) { | |
| if (baseHref == null) { | |
| throw Exception('Please add a <base> element to your index.html'); | |
| } | |
| if (!baseHref.endsWith('/')) { | |
| throw Exception('The base href has to end with a "/" to work correctly'); | |
| } | |
| return baseHref; | |
| } | |
| /// Prepends a forward slash to [path] if it doesn't start with one already. | |
| /// | |
| /// Returns [path] unchanged if it already starts with a forward slash. | |
| String ensureLeadingSlash(String path) { | |
| if (!path.startsWith('/')) { | |
| return '/$path'; | |
| } | |
| return path; | |
| } | |
| /// Removes the trailing forward slash from [path] if any. | |
| String stripTrailingSlash(String path) { | |
| if (path.endsWith('/')) { | |
| return path.substring(0, path.length - 1); | |
| } | |
| return path; | |
| } |