| // 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 'package:flutter_tools/src/html_utils.dart'; | |
| import '../src/common.dart'; | |
| const String htmlSample1 = ''' | |
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title></title> | |
| <base href="/foo/222/"> | |
| <meta charset="utf-8"> | |
| <link rel="icon" type="image/png" href="favicon.png"/> | |
| </head> | |
| <body> | |
| <div></div> | |
| <script src="main.dart.js"></script> | |
| </body> | |
| </html> | |
| '''; | |
| const String htmlSample2 = ''' | |
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title></title> | |
| <base href="$kBaseHrefPlaceholder"> | |
| <meta charset="utf-8"> | |
| <link rel="icon" type="image/png" href="favicon.png"/> | |
| </head> | |
| <body> | |
| <div></div> | |
| <script src="main.dart.js"></script> | |
| <script> | |
| const serviceWorkerVersion = null; | |
| </script> | |
| <script> | |
| navigator.serviceWorker.register('flutter_service_worker.js'); | |
| </script> | |
| </body> | |
| </html> | |
| '''; | |
| const String htmlSampleLegacyVar = ''' | |
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title></title> | |
| <base href="$kBaseHrefPlaceholder"> | |
| <meta charset="utf-8"> | |
| <link rel="icon" type="image/png" href="favicon.png"/> | |
| </head> | |
| <body> | |
| <div></div> | |
| <script src="main.dart.js"></script> | |
| <script> | |
| var serviceWorkerVersion = null; | |
| </script> | |
| <script> | |
| navigator.serviceWorker.register('flutter_service_worker.js'); | |
| </script> | |
| </body> | |
| </html> | |
| '''; | |
| String htmlSample2Replaced({ | |
| required String baseHref, | |
| required String serviceWorkerVersion, | |
| }) => | |
| ''' | |
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title></title> | |
| <base href="$baseHref"> | |
| <meta charset="utf-8"> | |
| <link rel="icon" type="image/png" href="favicon.png"/> | |
| </head> | |
| <body> | |
| <div></div> | |
| <script src="main.dart.js"></script> | |
| <script> | |
| const serviceWorkerVersion = "$serviceWorkerVersion"; | |
| </script> | |
| <script> | |
| navigator.serviceWorker.register('flutter_service_worker.js?v=$serviceWorkerVersion'); | |
| </script> | |
| </body> | |
| </html> | |
| '''; | |
| const String htmlSample3 = ''' | |
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title></title> | |
| <meta charset="utf-8"> | |
| <link rel="icon" type="image/png" href="favicon.png"/> | |
| </head> | |
| <body> | |
| <div></div> | |
| <script src="main.dart.js"></script> | |
| </body> | |
| </html> | |
| '''; | |
| void main() { | |
| test('can parse baseHref', () { | |
| expect(IndexHtml('<base href="/foo/111/">').getBaseHref(), 'foo/111'); | |
| expect(IndexHtml(htmlSample1).getBaseHref(), 'foo/222'); | |
| expect(IndexHtml(htmlSample2).getBaseHref(), ''); // Placeholder base href. | |
| }); | |
| test('handles missing baseHref', () { | |
| expect(IndexHtml('').getBaseHref(), ''); | |
| expect(IndexHtml('<base>').getBaseHref(), ''); | |
| expect(IndexHtml(htmlSample3).getBaseHref(), ''); | |
| }); | |
| test('throws on invalid baseHref', () { | |
| expect(() => IndexHtml('<base href>').getBaseHref(), throwsToolExit()); | |
| expect(() => IndexHtml('<base href="">').getBaseHref(), throwsToolExit()); | |
| expect(() => IndexHtml('<base href="foo/111">').getBaseHref(), throwsToolExit()); | |
| expect( | |
| () => IndexHtml('<base href="foo/111/">').getBaseHref(), | |
| throwsToolExit(), | |
| ); | |
| expect( | |
| () => IndexHtml('<base href="/foo/111">').getBaseHref(), | |
| throwsToolExit(), | |
| ); | |
| }); | |
| test('applies substitutions', () { | |
| final IndexHtml indexHtml = IndexHtml(htmlSample2); | |
| indexHtml.applySubstitutions( | |
| baseHref: '/foo/333/', | |
| serviceWorkerVersion: 'v123xyz', | |
| ); | |
| expect( | |
| indexHtml.content, | |
| htmlSample2Replaced( | |
| baseHref: '/foo/333/', | |
| serviceWorkerVersion: 'v123xyz', | |
| ), | |
| ); | |
| }); | |
| test('applies substitutions with legacy var version syntax', () { | |
| final IndexHtml indexHtml = IndexHtml(htmlSampleLegacyVar); | |
| indexHtml.applySubstitutions( | |
| baseHref: '/foo/333/', | |
| serviceWorkerVersion: 'v123xyz', | |
| ); | |
| expect( | |
| indexHtml.content, | |
| htmlSample2Replaced( | |
| baseHref: '/foo/333/', | |
| serviceWorkerVersion: 'v123xyz', | |
| ), | |
| ); | |
| }); | |
| test('re-parses after substitutions', () { | |
| final IndexHtml indexHtml = IndexHtml(htmlSample2); | |
| expect(indexHtml.getBaseHref(), ''); // Placeholder base href. | |
| indexHtml.applySubstitutions( | |
| baseHref: '/foo/333/', | |
| serviceWorkerVersion: 'v123xyz', | |
| ); | |
| // The parsed base href should be updated after substitutions. | |
| expect(indexHtml.getBaseHref(), 'foo/333'); | |
| }); | |
| } |