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