// 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'); }); }