| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 library polymer.test.build.import_inliner_test; | |
| 6 | |
| 7 import 'dart:convert'; | |
| 8 import 'package:polymer/src/build/common.dart'; | |
| 9 import 'package:polymer/src/build/import_inliner.dart'; | |
| 10 import 'package:polymer/src/build/messages.dart'; | |
| 11 import 'package:unittest/compact_vm_config.dart'; | |
| 12 import 'package:unittest/unittest.dart'; | |
| 13 import 'common.dart'; | |
| 14 | |
| 15 part 'code_extractor.dart'; | |
| 16 | |
| 17 final phases = [[new ImportInliner(new TransformOptions())]]; | |
| 18 | |
| 19 void main() { | |
| 20 useCompactVMConfiguration(); | |
| 21 group('rel=import', importTests); | |
| 22 group('rel=stylesheet', stylesheetTests); | |
| 23 group('script type=dart', codeExtractorTests); | |
| 24 group('url attributes', urlAttributeTests); | |
| 25 group('deep entrypoints', entryPointTests); | |
| 26 } | |
| 27 | |
| 28 void importTests() { | |
| 29 testPhases('no changes', phases, { | |
| 30 'a|web/test.html': '<!DOCTYPE html><html></html>', | |
| 31 }, { | |
| 32 'a|web/test.html': '<!DOCTYPE html><html></html>', | |
| 33 'a|web/test.html._data': EMPTY_DATA, | |
| 34 }); | |
| 35 | |
| 36 testPhases('empty import', phases, { | |
| 37 'a|web/test.html': | |
| 38 '<!DOCTYPE html><html><head>' | |
| 39 '<link rel="import" href="">' // empty href | |
| 40 '</head></html>', | |
| 41 'a|web/test2.html': | |
| 42 '<!DOCTYPE html><html><head>' | |
| 43 '<link rel="import">' // no href | |
| 44 '</head></html>', | |
| 45 }, { | |
| 46 'a|web/test.html': | |
| 47 '<!DOCTYPE html><html><head>' | |
| 48 '</head><body></body></html>', | |
| 49 'a|web/test.html._data': EMPTY_DATA, | |
| 50 'a|web/test2.html': | |
| 51 '<!DOCTYPE html><html><head>' | |
| 52 '</head><body></body></html>', | |
| 53 'a|web/test2.html._data': EMPTY_DATA, | |
| 54 }); | |
| 55 | |
| 56 testPhases('shallow, no elements', phases, { | |
| 57 'a|web/test.html': | |
| 58 '<!DOCTYPE html><html><head>' | |
| 59 '<link rel="import" href="test2.html">' | |
| 60 '</head></html>', | |
| 61 'a|web/test2.html': | |
| 62 '<!DOCTYPE html><html><head>' | |
| 63 '</head></html>', | |
| 64 }, { | |
| 65 'a|web/test.html': | |
| 66 '<!DOCTYPE html><html><head>' | |
| 67 '</head><body></body></html>', | |
| 68 'a|web/test.html._data': EMPTY_DATA, | |
| 69 'a|web/test2.html': | |
| 70 '<!DOCTYPE html><html><head>' | |
| 71 '</head></html>', | |
| 72 'a|web/test2.html._data': EMPTY_DATA, | |
| 73 }); | |
| 74 | |
| 75 testPhases('shallow, elements, one import', phases, | |
| 76 { | |
| 77 'a|web/test.html': | |
| 78 '<!DOCTYPE html><html><head>' | |
| 79 '<link rel="import" href="test2.html">' | |
| 80 '</head></html>', | |
| 81 'a|web/test2.html': | |
| 82 '<!DOCTYPE html><html><head>' | |
| 83 '</head><body><polymer-element>2</polymer-element></html>', | |
| 84 }, { | |
| 85 'a|web/test.html': | |
| 86 '<!DOCTYPE html><html><head>' | |
| 87 '</head><body>' | |
| 88 '<div hidden="">' | |
| 89 '<polymer-element>2</polymer-element>' | |
| 90 '</div>' | |
| 91 '</body></html>', | |
| 92 'a|web/test.html._data': EMPTY_DATA, | |
| 93 'a|web/test2.html': | |
| 94 '<!DOCTYPE html><html><head>' | |
| 95 '</head><body><polymer-element>2</polymer-element></html>', | |
| 96 'a|web/test2.html._data': EMPTY_DATA, | |
| 97 }); | |
| 98 | |
| 99 testPhases('preserves order of scripts', phases, | |
| 100 { | |
| 101 'a|web/test.html': | |
| 102 '<!DOCTYPE html><html><head>' | |
| 103 '<script type="text/javascript">/*first*/</script>' | |
| 104 '<script src="second.js"></script>' | |
| 105 '<link rel="import" href="test2.html">' | |
| 106 '<script>/*forth*/</script>' | |
| 107 '</head></html>', | |
| 108 'a|web/test2.html': | |
| 109 '<!DOCTYPE html><html><head><script>/*third*/</script>' | |
| 110 '</head><body><polymer-element>2</polymer-element></html>', | |
| 111 'a|web/second.js': '/*second*/' | |
| 112 }, { | |
| 113 'a|web/test.html': | |
| 114 '<!DOCTYPE html><html><head>' | |
| 115 '<script type="text/javascript">/*first*/</script>' | |
| 116 '<script src="second.js"></script>' | |
| 117 '</head><body>' | |
| 118 '<div hidden="">' | |
| 119 '<script>/*third*/</script>' | |
| 120 '<polymer-element>2</polymer-element>' | |
| 121 '<script>/*forth*/</script>' | |
| 122 '</div>' | |
| 123 '</body></html>', | |
| 124 'a|web/test.html._data': EMPTY_DATA, | |
| 125 'a|web/test2.html': | |
| 126 '<!DOCTYPE html><html><head><script>/*third*/</script>' | |
| 127 '</head><body><polymer-element>2</polymer-element></html>', | |
| 128 'a|web/test2.html._data': EMPTY_DATA, | |
| 129 'a|web/second.js': '/*second*/' | |
| 130 }); | |
| 131 | |
| 132 testPhases('preserves order of scripts, extract Dart scripts', phases, | |
| 133 { | |
| 134 'a|web/test.html': | |
| 135 '<!DOCTYPE html><html><head>' | |
| 136 '<script type="text/javascript">/*first*/</script>' | |
| 137 '<script src="second.js"></script>' | |
| 138 '<link rel="import" href="test2.html">' | |
| 139 '<script type="application/dart">/*fifth*/</script>' | |
| 140 '</head></html>', | |
| 141 'a|web/test2.html': | |
| 142 '<!DOCTYPE html><html><head><script>/*third*/</script>' | |
| 143 '<script type="application/dart">/*forth*/</script>' | |
| 144 '</head><body><polymer-element>2</polymer-element></html>', | |
| 145 'a|web/second.js': '/*second*/' | |
| 146 }, { | |
| 147 'a|web/test.html': | |
| 148 '<!DOCTYPE html><html><head>' | |
| 149 '<script type="text/javascript">/*first*/</script>' | |
| 150 '<script src="second.js"></script>' | |
| 151 '</head><body>' | |
| 152 '<div hidden="">' | |
| 153 '<script>/*third*/</script>' | |
| 154 '<polymer-element>2</polymer-element>' | |
| 155 '</div>' | |
| 156 '</body></html>', | |
| 157 'a|web/test.html._data': expectedData([ | |
| 158 'web/test.html.1.dart','web/test.html.0.dart']), | |
| 159 'a|web/test.html.1.dart': 'library a.web.test2_html_0;\n/*forth*/', | |
| 160 'a|web/test.html.0.dart': 'library a.web.test_html_0;\n/*fifth*/', | |
| 161 'a|web/test2.html': | |
| 162 '<!DOCTYPE html><html><head>' | |
| 163 '<script>/*third*/</script>' | |
| 164 '</head><body>' | |
| 165 '<polymer-element>2</polymer-element>' | |
| 166 '</body></html>', | |
| 167 'a|web/test2.html._data': expectedData(['web/test2.html.0.dart']), | |
| 168 'a|web/test2.html.0.dart': 'library a.web.test2_html_0;\n/*forth*/', | |
| 169 'a|web/second.js': '/*second*/' | |
| 170 }); | |
| 171 | |
| 172 testLogOutput( | |
| 173 (options) => new ImportInliner(options), | |
| 174 'removes duplicate scripts', { | |
| 175 'a|web/test.html': | |
| 176 '<!DOCTYPE html><html><head>' | |
| 177 '<link rel="import" href="packages/a/x_a.html">' | |
| 178 '<link rel="import" href="packages/a/x_b.html">' | |
| 179 '</head></html>', | |
| 180 'a|lib/x_a.html': | |
| 181 '<script type="application/dart" src="bar.dart"></script>', | |
| 182 'a|lib/x_b.html': | |
| 183 '<script type="application/dart" src="bar.dart"></script>', | |
| 184 'a|lib/bar.dart': 'var i = 0;' | |
| 185 }, { | |
| 186 'a|web/test.html': | |
| 187 '<!DOCTYPE html><html><head></head><body></body></html>', | |
| 188 'a|web/test.html._data': expectedData(['lib/bar.dart']), | |
| 189 }, [ | |
| 190 'warning: ${SCRIPT_INCLUDED_MORE_THAN_ONCE.create( | |
| 191 {'url': 'packages/a/bar.dart'}).snippet} (lib/x_b.html 0 0)' | |
| 192 ]); | |
| 193 | |
| 194 final cspPhases = [[new ImportInliner( | |
| 195 new TransformOptions(contentSecurityPolicy: true))]]; | |
| 196 testPhases('extract Js scripts in CSP mode', cspPhases, | |
| 197 { | |
| 198 'a|web/test.html': | |
| 199 '<!DOCTYPE html><html><head>' | |
| 200 '<script type="text/javascript">/*first*/</script>' | |
| 201 '<script src="second.js"></script>' | |
| 202 '<link rel="import" href="test2.html">' | |
| 203 '<script type="application/dart">/*fifth*/</script>' | |
| 204 '</head></html>', | |
| 205 'a|web/test2.html': | |
| 206 '<!DOCTYPE html><html><head><script>/*third*/</script>' | |
| 207 '<script type="application/dart">/*forth*/</script>' | |
| 208 '</head><body><polymer-element>2</polymer-element></html>', | |
| 209 'a|web/second.js': '/*second*/' | |
| 210 }, { | |
| 211 'a|web/test.html': | |
| 212 '<!DOCTYPE html><html><head>' | |
| 213 '<script type="text/javascript" src="test.html.0.js"></script>' | |
| 214 '<script src="second.js"></script>' | |
| 215 '</head><body>' | |
| 216 '<div hidden="">' | |
| 217 '<script src="test.html.2.js"></script>' | |
| 218 '<polymer-element>2</polymer-element>' | |
| 219 '</div>' | |
| 220 '</body></html>', | |
| 221 'a|web/test.html._data': expectedData([ | |
| 222 'web/test.html.3.dart','web/test.html.1.dart']), | |
| 223 'a|web/test.html.3.dart': 'library a.web.test2_html_0;\n/*forth*/', | |
| 224 'a|web/test.html.1.dart': 'library a.web.test_html_0;\n/*fifth*/', | |
| 225 'a|web/test.html.0.js': '/*first*/', | |
| 226 'a|web/test.html.2.js': '/*third*/', | |
| 227 'a|web/test2.html': | |
| 228 '<!DOCTYPE html><html><head>' | |
| 229 '<script src="test2.html.0.js"></script>' | |
| 230 '</head><body>' | |
| 231 '<polymer-element>2</polymer-element></body></html>', | |
| 232 'a|web/test2.html._data': expectedData(['web/test2.html.1.dart']), | |
| 233 'a|web/test2.html.0.js': '/*third*/', | |
| 234 'a|web/test2.html.1.dart': 'library a.web.test2_html_0;\n/*forth*/', | |
| 235 'a|web/second.js': '/*second*/' | |
| 236 }); | |
| 237 | |
| 238 testPhases('Cleans library names generated from file paths.', phases, | |
| 239 { | |
| 240 'a|web/01_test.html': | |
| 241 '<!DOCTYPE html><html><head>' | |
| 242 '<script type="application/dart">/*1*/</script>' | |
| 243 '</head></html>', | |
| 244 'a|web/foo_02_test.html': | |
| 245 '<!DOCTYPE html><html><head>' | |
| 246 '<script type="application/dart">/*2*/</script>' | |
| 247 '</head></html>', | |
| 248 'a|web/test_03.html': | |
| 249 '<!DOCTYPE html><html><head>' | |
| 250 '<script type="application/dart">/*3*/</script>' | |
| 251 '</head></html>', | |
| 252 'a|web/*test_%foo_04!.html': | |
| 253 '<!DOCTYPE html><html><head>' | |
| 254 '<script type="application/dart">/*4*/</script>' | |
| 255 '</head></html>', | |
| 256 'a|web/%05_test.html': | |
| 257 '<!DOCTYPE html><html><head>' | |
| 258 '<script type="application/dart">/*5*/</script>' | |
| 259 '</head></html>', | |
| 260 }, { | |
| 261 'a|web/01_test.html.0.dart': | |
| 262 'library a.web._01_test_html_0;\n/*1*/', // Appends an _ if i
t starts with a number. | |
| 263 'a|web/foo_02_test.html.0.dart': | |
| 264 'library a.web.foo_02_test_html_0;\n/*2*/', // Allows numbers in
the middle. | |
| 265 'a|web/test_03.html.0.dart': | |
| 266 'library a.web.test_03_html_0;\n/*3*/', // Allows numbers at
the end. | |
| 267 'a|web/*test_%foo_04!.html.0.dart': | |
| 268 'library a.web._test__foo_04__html_0;\n/*4*/', // Replaces invalid
characters with _. | |
| 269 'a|web/%05_test.html.0.dart': | |
| 270 'library a.web._05_test_html_0;\n/*5*/', // Replace invalid c
haracter followed by number. | |
| 271 }); | |
| 272 | |
| 273 testPhases('no transformation outside web/', phases, | |
| 274 { | |
| 275 'a|lib/test.html': | |
| 276 '<!DOCTYPE html><html><head>' | |
| 277 '<link rel="import" href="test2.html">' | |
| 278 '</head></html>', | |
| 279 'a|lib/test2.html': | |
| 280 '<!DOCTYPE html><html><head>' | |
| 281 '</head><body><polymer-element>2</polymer-element></html>', | |
| 282 }, { | |
| 283 'a|lib/test.html': | |
| 284 '<!DOCTYPE html><html><head>' | |
| 285 '<link rel="import" href="test2.html">' | |
| 286 '</head></html>', | |
| 287 'a|lib/test2.html': | |
| 288 '<!DOCTYPE html><html><head>' | |
| 289 '</head><body><polymer-element>2</polymer-element></html>', | |
| 290 }); | |
| 291 | |
| 292 testPhases('shallow, elements, many', phases, | |
| 293 { | |
| 294 'a|web/test.html': | |
| 295 '<!DOCTYPE html><html><head>' | |
| 296 '<link rel="import" href="test2.html">' | |
| 297 '<link rel="import" href="test3.html">' | |
| 298 '</head></html>', | |
| 299 'a|web/test2.html': | |
| 300 '<!DOCTYPE html><html><head>' | |
| 301 '</head><body><polymer-element>2</polymer-element></html>', | |
| 302 'a|web/test3.html': | |
| 303 '<!DOCTYPE html><html><head>' | |
| 304 '</head><body><polymer-element>3</polymer-element></html>', | |
| 305 }, { | |
| 306 'a|web/test.html': | |
| 307 '<!DOCTYPE html><html><head>' | |
| 308 '</head><body>' | |
| 309 '<div hidden="">' | |
| 310 '<polymer-element>2</polymer-element>' | |
| 311 '<polymer-element>3</polymer-element>' | |
| 312 '</div>' | |
| 313 '</body></html>', | |
| 314 'a|web/test2.html': | |
| 315 '<!DOCTYPE html><html><head>' | |
| 316 '</head><body><polymer-element>2</polymer-element></html>', | |
| 317 'a|web/test3.html': | |
| 318 '<!DOCTYPE html><html><head>' | |
| 319 '</head><body><polymer-element>3</polymer-element></html>', | |
| 320 }); | |
| 321 | |
| 322 testPhases('deep, elements, one per file', phases, { | |
| 323 'a|web/test.html': | |
| 324 '<!DOCTYPE html><html><head>' | |
| 325 '<link rel="import" href="test2.html">' | |
| 326 '</head></html>', | |
| 327 'a|web/test2.html': | |
| 328 '<!DOCTYPE html><html><head>' | |
| 329 '<link rel="import" href="assets/b/test3.html">' | |
| 330 '</head><body><polymer-element>2</polymer-element></html>', | |
| 331 'b|asset/test3.html': | |
| 332 '<!DOCTYPE html><html><head>' | |
| 333 '<link rel="import" href="../../packages/c/test4.html">' | |
| 334 '</head><body><polymer-element>3</polymer-element></html>', | |
| 335 'c|lib/test4.html': | |
| 336 '<!DOCTYPE html><html><head>' | |
| 337 '</head><body><polymer-element>4</polymer-element></html>', | |
| 338 }, { | |
| 339 'a|web/test.html': | |
| 340 '<!DOCTYPE html><html><head>' | |
| 341 '</head><body>' | |
| 342 '<div hidden="">' | |
| 343 '<polymer-element>4</polymer-element>' | |
| 344 '<polymer-element>3</polymer-element>' | |
| 345 '<polymer-element>2</polymer-element>' | |
| 346 '</div>' | |
| 347 '</body></html>', | |
| 348 'a|web/test2.html': | |
| 349 '<!DOCTYPE html><html><head>' | |
| 350 '</head><body>' | |
| 351 '<div hidden="">' | |
| 352 '<polymer-element>4</polymer-element>' | |
| 353 '<polymer-element>3</polymer-element>' | |
| 354 '</div>' | |
| 355 '<polymer-element>2</polymer-element>' | |
| 356 '</body></html>', | |
| 357 'b|asset/test3.html': | |
| 358 '<!DOCTYPE html><html><head>' | |
| 359 '<link rel="import" href="../../packages/c/test4.html">' | |
| 360 '</head><body><polymer-element>3</polymer-element></html>', | |
| 361 'c|lib/test4.html': | |
| 362 '<!DOCTYPE html><html><head>' | |
| 363 '</head><body><polymer-element>4</polymer-element></html>', | |
| 364 }); | |
| 365 | |
| 366 testPhases('deep, elements, many imports', phases, { | |
| 367 'a|web/test.html': | |
| 368 '<!DOCTYPE html><html><head>' | |
| 369 '<link rel="import" href="test2a.html">' | |
| 370 '<link rel="import" href="test2b.html">' | |
| 371 '</head></html>', | |
| 372 'a|web/test2a.html': | |
| 373 '<!DOCTYPE html><html><head>' | |
| 374 '<link rel="import" href="test3a.html">' | |
| 375 '<link rel="import" href="test3b.html">' | |
| 376 '</head><body><polymer-element>2a</polymer-element></body></html>', | |
| 377 'a|web/test2b.html': | |
| 378 '<!DOCTYPE html><html><head>' | |
| 379 '<link rel="import" href="test4a.html">' | |
| 380 '<link rel="import" href="test4b.html">' | |
| 381 '</head><body><polymer-element>2b</polymer-element></body></html>', | |
| 382 'a|web/test3a.html': | |
| 383 '<!DOCTYPE html><html><head>' | |
| 384 '</head><body><polymer-element>3a</polymer-element></body></html>', | |
| 385 'a|web/test3b.html': | |
| 386 '<!DOCTYPE html><html><head>' | |
| 387 '</head><body><polymer-element>3b</polymer-element></body></html>', | |
| 388 'a|web/test4a.html': | |
| 389 '<!DOCTYPE html><html><head>' | |
| 390 '</head><body><polymer-element>4a</polymer-element></body></html>', | |
| 391 'a|web/test4b.html': | |
| 392 '<!DOCTYPE html><html><head>' | |
| 393 '</head><body><polymer-element>4b</polymer-element></body></html>', | |
| 394 }, { | |
| 395 'a|web/test.html': | |
| 396 '<!DOCTYPE html><html><head>' | |
| 397 '</head><body>' | |
| 398 '<div hidden="">' | |
| 399 '<polymer-element>3a</polymer-element>' | |
| 400 '<polymer-element>3b</polymer-element>' | |
| 401 '<polymer-element>2a</polymer-element>' | |
| 402 '<polymer-element>4a</polymer-element>' | |
| 403 '<polymer-element>4b</polymer-element>' | |
| 404 '<polymer-element>2b</polymer-element>' | |
| 405 '</div>' | |
| 406 '</body></html>', | |
| 407 'a|web/test2a.html': | |
| 408 '<!DOCTYPE html><html><head>' | |
| 409 '</head><body>' | |
| 410 '<div hidden="">' | |
| 411 '<polymer-element>3a</polymer-element>' | |
| 412 '<polymer-element>3b</polymer-element>' | |
| 413 '</div>' | |
| 414 '<polymer-element>2a</polymer-element>' | |
| 415 '</body></html>', | |
| 416 'a|web/test2b.html': | |
| 417 '<!DOCTYPE html><html><head>' | |
| 418 '</head><body>' | |
| 419 '<div hidden="">' | |
| 420 '<polymer-element>4a</polymer-element>' | |
| 421 '<polymer-element>4b</polymer-element>' | |
| 422 '</div>' | |
| 423 '<polymer-element>2b</polymer-element>' | |
| 424 '</body></html>', | |
| 425 'a|web/test3a.html': | |
| 426 '<!DOCTYPE html><html><head>' | |
| 427 '</head><body>' | |
| 428 '<polymer-element>3a</polymer-element>' | |
| 429 '</body></html>', | |
| 430 'a|web/test3b.html': | |
| 431 '<!DOCTYPE html><html><head>' | |
| 432 '</head><body>' | |
| 433 '<polymer-element>3b</polymer-element>' | |
| 434 '</body></html>', | |
| 435 'a|web/test4a.html': | |
| 436 '<!DOCTYPE html><html><head>' | |
| 437 '</head><body>' | |
| 438 '<polymer-element>4a</polymer-element>' | |
| 439 '</body></html>', | |
| 440 'a|web/test4b.html': | |
| 441 '<!DOCTYPE html><html><head>' | |
| 442 '</head><body>' | |
| 443 '<polymer-element>4b</polymer-element>' | |
| 444 '</body></html>', | |
| 445 }); | |
| 446 | |
| 447 testPhases('imports cycle, 1-step lasso', phases, { | |
| 448 'a|web/test.html': | |
| 449 '<!DOCTYPE html><html><head>' | |
| 450 '<link rel="import" href="test_1.html">' | |
| 451 '</head></html>', | |
| 452 'a|web/test_1.html': | |
| 453 '<!DOCTYPE html><html><head>' | |
| 454 '<link rel="import" href="test_2.html">' | |
| 455 '</head><body><polymer-element>1</polymer-element></html>', | |
| 456 'a|web/test_2.html': | |
| 457 '<!DOCTYPE html><html><head>' | |
| 458 '<link rel="import" href="test_1.html">' | |
| 459 '</head><body><polymer-element>2</polymer-element></html>', | |
| 460 }, { | |
| 461 'a|web/test.html': | |
| 462 '<!DOCTYPE html><html><head>' | |
| 463 '</head><body>' | |
| 464 '<div hidden="">' | |
| 465 '<polymer-element>2</polymer-element>' | |
| 466 '<polymer-element>1</polymer-element>' | |
| 467 '</div>' | |
| 468 '</body></html>', | |
| 469 'a|web/test_1.html': | |
| 470 '<!DOCTYPE html><html><head>' | |
| 471 '</head><body>' | |
| 472 '<div hidden="">' | |
| 473 '<polymer-element>2</polymer-element>' | |
| 474 '</div>' | |
| 475 '<polymer-element>1</polymer-element></body></html>', | |
| 476 'a|web/test_2.html': | |
| 477 '<!DOCTYPE html><html><head>' | |
| 478 '</head><body>' | |
| 479 '<div hidden="">' | |
| 480 '<polymer-element>1</polymer-element>' | |
| 481 '</div>' | |
| 482 '<polymer-element>2</polymer-element></body></html>', | |
| 483 }); | |
| 484 | |
| 485 testPhases('imports cycle, 1-step lasso, scripts too', phases, { | |
| 486 'a|web/test.html': | |
| 487 '<!DOCTYPE html><html><head>' | |
| 488 '<link rel="import" href="test_1.html">' | |
| 489 '</head></html>', | |
| 490 'a|web/test_1.html': | |
| 491 '<!DOCTYPE html><html><head>' | |
| 492 '<link rel="import" href="test_2.html">' | |
| 493 '</head><body><polymer-element>1</polymer-element>' | |
| 494 '<script src="s1"></script></html>', | |
| 495 'a|web/test_2.html': | |
| 496 '<!DOCTYPE html><html><head>' | |
| 497 '<link rel="import" href="test_1.html">' | |
| 498 '</head><body><polymer-element>2</polymer-element>' | |
| 499 '<script src="s2"></script></html>', | |
| 500 }, { | |
| 501 'a|web/test.html': | |
| 502 '<!DOCTYPE html><html><head>' | |
| 503 '</head><body>' | |
| 504 '<div hidden="">' | |
| 505 '<polymer-element>2</polymer-element>' | |
| 506 '<script src="s2"></script>' | |
| 507 '<polymer-element>1</polymer-element>' | |
| 508 '<script src="s1"></script>' | |
| 509 '</div>' | |
| 510 '</body></html>', | |
| 511 'a|web/test.html._data': EMPTY_DATA, | |
| 512 'a|web/test_1.html': | |
| 513 '<!DOCTYPE html><html><head>' | |
| 514 '</head><body>' | |
| 515 '<div hidden="">' | |
| 516 '<polymer-element>2</polymer-element>' | |
| 517 '<script src="s2"></script>' | |
| 518 '</div>' | |
| 519 '<polymer-element>1</polymer-element>' | |
| 520 '<script src="s1"></script></body></html>', | |
| 521 'a|web/test_1.html._data': EMPTY_DATA, | |
| 522 'a|web/test_2.html': | |
| 523 '<!DOCTYPE html><html><head>' | |
| 524 '</head><body>' | |
| 525 '<div hidden="">' | |
| 526 '<polymer-element>1</polymer-element>' | |
| 527 '<script src="s1"></script>' | |
| 528 '</div>' | |
| 529 '<polymer-element>2</polymer-element>' | |
| 530 '<script src="s2"></script></body></html>', | |
| 531 'a|web/test_2.html._data': EMPTY_DATA, | |
| 532 }); | |
| 533 | |
| 534 testPhases('imports cycle, 1-step lasso, Dart scripts too', phases, { | |
| 535 'a|web/test.html': | |
| 536 '<!DOCTYPE html><html><head>' | |
| 537 '<link rel="import" href="test_1.html">' | |
| 538 '</head></html>', | |
| 539 'a|web/test_1.html': | |
| 540 '<!DOCTYPE html><html><head>' | |
| 541 '<link rel="import" href="test_2.html">' | |
| 542 '</head><body><polymer-element>1</polymer-element>' | |
| 543 '<script type="application/dart" src="s1.dart">' | |
| 544 '</script></html>', | |
| 545 'a|web/test_2.html': | |
| 546 '<!DOCTYPE html><html><head>' | |
| 547 '<link rel="import" href="test_1.html">' | |
| 548 '</head><body><polymer-element>2' | |
| 549 '<script type="application/dart" src="s2.dart"></script>' | |
| 550 '</polymer-element>' | |
| 551 '</html>', | |
| 552 'a|web/s1.dart': '', | |
| 553 'a|web/s2.dart': '', | |
| 554 }, { | |
| 555 'a|web/test.html': | |
| 556 '<!DOCTYPE html><html><head>' | |
| 557 '</head><body>' | |
| 558 '<div hidden="">' | |
| 559 '<polymer-element>2</polymer-element>' | |
| 560 '<polymer-element>1</polymer-element>' | |
| 561 '</div>' | |
| 562 '</body></html>', | |
| 563 'a|web/test.html._data': expectedData(['web/s2.dart', 'web/s1.dart']), | |
| 564 'a|web/test_1.html': | |
| 565 '<!DOCTYPE html><html><head>' | |
| 566 '</head><body>' | |
| 567 '<div hidden="">' | |
| 568 '<polymer-element>2</polymer-element>' | |
| 569 '</div>' | |
| 570 '<polymer-element>1</polymer-element>' | |
| 571 '</body></html>', | |
| 572 'a|web/test_1.html._data': expectedData(['web/s2.dart', 'web/s1.dart']), | |
| 573 'a|web/test_2.html': | |
| 574 '<!DOCTYPE html><html><head>' | |
| 575 '</head><body>' | |
| 576 '<div hidden="">' | |
| 577 '<polymer-element>1</polymer-element>' | |
| 578 '</div>' | |
| 579 '<polymer-element>2' | |
| 580 '</polymer-element>' | |
| 581 '</body></html>', | |
| 582 'a|web/test_2.html._data': expectedData(['web/s1.dart', 'web/s2.dart']), | |
| 583 }); | |
| 584 | |
| 585 testPhases('imports with Dart script after JS script', phases, { | |
| 586 'a|web/test.html': | |
| 587 '<!DOCTYPE html><html><head>' | |
| 588 '<link rel="import" href="test_1.html">' | |
| 589 '</head></html>', | |
| 590 'a|web/test_1.html': | |
| 591 '<!DOCTYPE html><html><head>' | |
| 592 '<link rel="import" href="test_1.html">' | |
| 593 '</head><body>' | |
| 594 '<foo>42</foo><bar-baz></bar-baz>' | |
| 595 '<polymer-element>1' | |
| 596 '<script src="s1.js"></script>' | |
| 597 '<script type="application/dart" src="s1.dart"></script>' | |
| 598 '</polymer-element>' | |
| 599 'FOO</body></html>', | |
| 600 'a|web/s1.dart': '', | |
| 601 }, { | |
| 602 'a|web/test.html': | |
| 603 '<!DOCTYPE html><html><head>' | |
| 604 '</head><body>' | |
| 605 '<div hidden="">' | |
| 606 '<foo>42</foo><bar-baz></bar-baz>' | |
| 607 '<polymer-element>1' | |
| 608 '<script src="s1.js"></script>' | |
| 609 '</polymer-element>' | |
| 610 'FOO' | |
| 611 '</div>' | |
| 612 '</body></html>', | |
| 613 'a|web/test.html._data': expectedData(['web/s1.dart']), | |
| 614 'a|web/test_1.html': | |
| 615 '<!DOCTYPE html><html><head>' | |
| 616 '</head><body>' | |
| 617 '<foo>42</foo><bar-baz></bar-baz>' | |
| 618 '<polymer-element>1' | |
| 619 '<script src="s1.js"></script>' | |
| 620 '</polymer-element>' | |
| 621 'FOO</body></html>', | |
| 622 'a|web/test_1.html._data': expectedData(['web/s1.dart']), | |
| 623 }); | |
| 624 | |
| 625 testPhases('imports cycle, 2-step lasso', phases, { | |
| 626 'a|web/test.html': | |
| 627 '<!DOCTYPE html><html><head>' | |
| 628 '<link rel="import" href="test_1.html">' | |
| 629 '</head></html>', | |
| 630 'a|web/test_1.html': | |
| 631 '<!DOCTYPE html><html><head>' | |
| 632 '<link rel="import" href="test_2.html">' | |
| 633 '</head><body><polymer-element>1</polymer-element></html>', | |
| 634 'a|web/test_2.html': | |
| 635 '<!DOCTYPE html><html><head>' | |
| 636 '<link rel="import" href="test_3.html">' | |
| 637 '</head><body><polymer-element>2</polymer-element></html>', | |
| 638 'a|web/test_3.html': | |
| 639 '<!DOCTYPE html><html><head>' | |
| 640 '<link rel="import" href="test_1.html">' | |
| 641 '</head><body><polymer-element>3</polymer-element></html>', | |
| 642 }, { | |
| 643 'a|web/test.html': | |
| 644 '<!DOCTYPE html><html><head>' | |
| 645 '</head><body>' | |
| 646 '<div hidden="">' | |
| 647 '<polymer-element>3</polymer-element>' | |
| 648 '<polymer-element>2</polymer-element>' | |
| 649 '<polymer-element>1</polymer-element>' | |
| 650 '</div>' | |
| 651 '</body></html>', | |
| 652 'a|web/test_1.html': | |
| 653 '<!DOCTYPE html><html><head>' | |
| 654 '</head><body>' | |
| 655 '<div hidden="">' | |
| 656 '<polymer-element>3</polymer-element>' | |
| 657 '<polymer-element>2</polymer-element>' | |
| 658 '</div>' | |
| 659 '<polymer-element>1</polymer-element></body></html>', | |
| 660 'a|web/test_2.html': | |
| 661 '<!DOCTYPE html><html><head>' | |
| 662 '</head><body>' | |
| 663 '<div hidden="">' | |
| 664 '<polymer-element>1</polymer-element>' | |
| 665 '<polymer-element>3</polymer-element>' | |
| 666 '</div>' | |
| 667 '<polymer-element>2</polymer-element></body></html>', | |
| 668 'a|web/test_3.html': | |
| 669 '<!DOCTYPE html><html><head>' | |
| 670 '</head><body>' | |
| 671 '<div hidden="">' | |
| 672 '<polymer-element>2</polymer-element>' | |
| 673 '<polymer-element>1</polymer-element>' | |
| 674 '</div>' | |
| 675 '<polymer-element>3</polymer-element></body></html>', | |
| 676 }); | |
| 677 | |
| 678 testPhases('imports cycle, self cycle', phases, { | |
| 679 'a|web/test.html': | |
| 680 '<!DOCTYPE html><html><head>' | |
| 681 '<link rel="import" href="test_1.html">' | |
| 682 '</head></html>', | |
| 683 'a|web/test_1.html': | |
| 684 '<!DOCTYPE html><html><head>' | |
| 685 '<link rel="import" href="test_1.html">' | |
| 686 '</head><body><polymer-element>1</polymer-element></html>', | |
| 687 }, { | |
| 688 'a|web/test.html': | |
| 689 '<!DOCTYPE html><html><head>' | |
| 690 '</head><body>' | |
| 691 '<div hidden="">' | |
| 692 '<polymer-element>1</polymer-element>' | |
| 693 '</div>' | |
| 694 '</body></html>', | |
| 695 'a|web/test_1.html': | |
| 696 '<!DOCTYPE html><html><head>' | |
| 697 '</head><body>' | |
| 698 '<polymer-element>1</polymer-element></body></html>', | |
| 699 }); | |
| 700 | |
| 701 testPhases('imports DAG', phases, { | |
| 702 'a|web/test.html': | |
| 703 '<!DOCTYPE html><html><head>' | |
| 704 '<link rel="import" href="test_1.html">' | |
| 705 '<link rel="import" href="test_2.html">' | |
| 706 '</head></html>', | |
| 707 'a|web/test_1.html': | |
| 708 '<!DOCTYPE html><html><head>' | |
| 709 '<link rel="import" href="test_3.html">' | |
| 710 '</head><body><polymer-element>1</polymer-element></body></html>', | |
| 711 'a|web/test_2.html': | |
| 712 '<!DOCTYPE html><html><head>' | |
| 713 '<link rel="import" href="test_3.html">' | |
| 714 '</head><body><polymer-element>2</polymer-element></body></html>', | |
| 715 'a|web/test_3.html': | |
| 716 '<!DOCTYPE html><html><head>' | |
| 717 '</head><body><polymer-element>3</polymer-element></body></html>', | |
| 718 }, { | |
| 719 'a|web/test.html': | |
| 720 '<!DOCTYPE html><html><head>' | |
| 721 '</head><body>' | |
| 722 '<div hidden="">' | |
| 723 '<polymer-element>3</polymer-element>' | |
| 724 '<polymer-element>1</polymer-element>' | |
| 725 '<polymer-element>2</polymer-element>' | |
| 726 '</div>' | |
| 727 '</body></html>', | |
| 728 'a|web/test_1.html': | |
| 729 '<!DOCTYPE html><html><head>' | |
| 730 '</head><body>' | |
| 731 '<div hidden="">' | |
| 732 '<polymer-element>3</polymer-element>' | |
| 733 '</div>' | |
| 734 '<polymer-element>1</polymer-element></body></html>', | |
| 735 'a|web/test_2.html': | |
| 736 '<!DOCTYPE html><html><head>' | |
| 737 '</head><body>' | |
| 738 '<div hidden="">' | |
| 739 '<polymer-element>3</polymer-element>' | |
| 740 '</div>' | |
| 741 '<polymer-element>2</polymer-element></body></html>', | |
| 742 'a|web/test_3.html': | |
| 743 '<!DOCTYPE html><html><head>' | |
| 744 '</head><body>' | |
| 745 '<polymer-element>3</polymer-element></body></html>', | |
| 746 }); | |
| 747 | |
| 748 testLogOutput( | |
| 749 (options) => new ImportInliner(options), | |
| 750 "missing styles don't throw errors and are not inlined", { | |
| 751 'a|web/test.html': | |
| 752 '<!DOCTYPE html><html><head>' | |
| 753 '<link rel="stylesheet" href="foo.css">' | |
| 754 '</head></html>', | |
| 755 }, { | |
| 756 'a|web/test.html': | |
| 757 '<!DOCTYPE html><html><head>' | |
| 758 '<link rel="stylesheet" href="foo.css">' | |
| 759 '</head><body>' | |
| 760 '</body></html>', | |
| 761 }, [ | |
| 762 'warning: Failed to inline stylesheet: ' | |
| 763 'Could not find asset a|web/foo.css. (web/test.html 0 27)', | |
| 764 ]); | |
| 765 | |
| 766 testLogOutput( | |
| 767 (options) => new ImportInliner(options), | |
| 768 "missing html imports throw errors", { | |
| 769 'a|web/test.html': | |
| 770 '<!DOCTYPE html><html><head>' | |
| 771 '<link rel="import" href="foo.html">' | |
| 772 '</head></html>', | |
| 773 }, { | |
| 774 'a|web/test.html._buildLogs.1': | |
| 775 '{"polymer#25":[{' | |
| 776 '"level":"Error",' | |
| 777 '"message":{' | |
| 778 '"id":"polymer#25",' | |
| 779 '"snippet":"Failed to inline HTML import: ' | |
| 780 'Could not find asset a|web/foo.html."' | |
| 781 '},' | |
| 782 '"span":{' | |
| 783 '"start":{' | |
| 784 '"url":"web/test.html",' | |
| 785 '"offset":27,' | |
| 786 '"line":0,' | |
| 787 '"column":27' | |
| 788 '},' | |
| 789 '"end":{' | |
| 790 '"url":"web/test.html",' | |
| 791 '"offset":62,' | |
| 792 '"line":0,' | |
| 793 '"column":62' | |
| 794 '},' | |
| 795 '"text":"<link rel=\\"import\\" href=\\"foo.html\\">"' | |
| 796 '}' | |
| 797 '}]}', | |
| 798 }, [ | |
| 799 'error: ${INLINE_IMPORT_FAIL.create({ | |
| 800 'error': 'Could not find asset a|web/foo.html.'}).snippet} ' | |
| 801 '(web/test.html 0 27)', | |
| 802 ]); | |
| 803 } | |
| 804 | |
| 805 void stylesheetTests() { | |
| 806 | |
| 807 testPhases('empty stylesheet', phases, { | |
| 808 'a|web/test.html': | |
| 809 '<!DOCTYPE html><html><head>' | |
| 810 '<link rel="stylesheet" href="">' // empty href | |
| 811 '</head></html>', | |
| 812 'a|web/test2.html': | |
| 813 '<!DOCTYPE html><html><head>' | |
| 814 '<link rel="stylesheet">' // no href | |
| 815 '</head></html>', | |
| 816 }, { | |
| 817 'a|web/test.html': | |
| 818 '<!DOCTYPE html><html><head>' | |
| 819 '<link rel="stylesheet" href="">' // empty href | |
| 820 '</head></html>', | |
| 821 'a|web/test.html._data': EMPTY_DATA, | |
| 822 'a|web/test2.html': | |
| 823 '<!DOCTYPE html><html><head>' | |
| 824 '<link rel="stylesheet">' // no href | |
| 825 '</head></html>', | |
| 826 'a|web/test2.html._data': EMPTY_DATA, | |
| 827 }); | |
| 828 | |
| 829 testPhases('absolute uri', phases, { | |
| 830 'a|web/test.html': | |
| 831 '<!DOCTYPE html><html><head>' | |
| 832 '<link rel="stylesheet" href="/foo.css">' | |
| 833 '</head></html>', | |
| 834 'a|web/test2.html': | |
| 835 '<!DOCTYPE html><html><head>' | |
| 836 '<link rel="stylesheet" href="http://example.com/bar.css">' | |
| 837 '</head></html>', | |
| 838 }, { | |
| 839 'a|web/test.html': | |
| 840 '<!DOCTYPE html><html><head>' | |
| 841 '<link rel="stylesheet" href="/foo.css">' | |
| 842 '</head></html>', | |
| 843 'a|web/test.html._data': EMPTY_DATA, | |
| 844 'a|web/test2.html': | |
| 845 '<!DOCTYPE html><html><head>' | |
| 846 '<link rel="stylesheet" href="http://example.com/bar.css">' | |
| 847 '</head></html>', | |
| 848 'a|web/test2.html._data': EMPTY_DATA, | |
| 849 }); | |
| 850 | |
| 851 testPhases('shallow, inlines css', phases, { | |
| 852 'a|web/test.html': | |
| 853 '<!DOCTYPE html><html><head>' | |
| 854 '<link rel="stylesheet" href="test2.css">' | |
| 855 '</head></html>', | |
| 856 'a|web/test2.css': | |
| 857 'h1 { font-size: 70px; }', | |
| 858 }, { | |
| 859 'a|web/test.html': | |
| 860 '<!DOCTYPE html><html><head>' | |
| 861 '<style>h1 { font-size: 70px; }</style>' | |
| 862 '</head><body>' | |
| 863 '</body></html>', | |
| 864 'a|web/test.html._data': EMPTY_DATA, | |
| 865 'a|web/test2.css': | |
| 866 'h1 { font-size: 70px; }', | |
| 867 }); | |
| 868 | |
| 869 testPhases('deep, inlines css', phases, { | |
| 870 'a|web/test.html': | |
| 871 '<!DOCTYPE html><html><head>' | |
| 872 '<link rel="import" href="test2.html">' | |
| 873 '</head></html>', | |
| 874 'a|web/test2.html': | |
| 875 '<polymer-element>2' | |
| 876 '<link rel="stylesheet" href="assets/b/test3.css">' | |
| 877 '</polymer-element>', | |
| 878 'b|asset/test3.css': | |
| 879 'body {\n background: #eaeaea url("../../assets/b/test4.png");\n}\n' | |
| 880 '.foo {\n background: url("../../packages/c/test5.png");\n}', | |
| 881 'b|asset/test4.png': 'PNG', | |
| 882 'c|lib/test5.png': 'PNG', | |
| 883 }, { | |
| 884 'a|web/test.html': | |
| 885 '<!DOCTYPE html><html><head></head><body>' | |
| 886 '<div hidden="">' | |
| 887 '<polymer-element>2' | |
| 888 '<style>' | |
| 889 'body {\n background: #eaeaea url(assets/b/test4.png);\n}\n' | |
| 890 '.foo {\n background: url(packages/c/test5.png);\n}' | |
| 891 '</style>' | |
| 892 '</polymer-element>' | |
| 893 '</div>' | |
| 894 '</body></html>', | |
| 895 'a|web/test2.html': | |
| 896 '<html><head></head><body>' | |
| 897 '<polymer-element>2' | |
| 898 '<style>' | |
| 899 'body {\n background: #eaeaea url(assets/b/test4.png);\n}\n' | |
| 900 '.foo {\n background: url(packages/c/test5.png);\n}' | |
| 901 '</style>' | |
| 902 '</polymer-element>' | |
| 903 '</body></html>', | |
| 904 'b|asset/test3.css': | |
| 905 'body {\n background: #eaeaea url("../../assets/b/test4.png");\n}\n' | |
| 906 '.foo {\n background: url("../../packages/c/test5.png");\n}', | |
| 907 'b|asset/test4.png': 'PNG', | |
| 908 'c|lib/test5.png': 'PNG', | |
| 909 }); | |
| 910 | |
| 911 testPhases('deep, inlines css, multiple nesting', phases, { | |
| 912 'a|web/test.html': | |
| 913 '<!DOCTYPE html><html><head>' | |
| 914 '<link rel="import" href="foo/test2.html">' | |
| 915 '</head></html>', | |
| 916 'a|web/foo/test2.html': | |
| 917 // When parsed, this is in the <head>. | |
| 918 '<link rel="import" href="bar/test3.html">' | |
| 919 // This is where the parsed <body> starts. | |
| 920 '<polymer-element>2' | |
| 921 '<link rel="stylesheet" href="test.css">' | |
| 922 '</polymer-element>', | |
| 923 'a|web/foo/bar/test3.html': | |
| 924 '<img src="qux.png">', | |
| 925 'a|web/foo/test.css': | |
| 926 'body {\n background: #eaeaea url("test4.png");\n}\n' | |
| 927 '.foo {\n background: url("test5.png");\n}', | |
| 928 }, { | |
| 929 'a|web/test.html': | |
| 930 '<!DOCTYPE html><html><head></head><body>' | |
| 931 '<div hidden="">' | |
| 932 '<img src="foo/bar/qux.png">' | |
| 933 '<polymer-element>2' | |
| 934 '<style>' | |
| 935 'body {\n background: #eaeaea url(foo/test4.png);\n}\n' | |
| 936 '.foo {\n background: url(foo/test5.png);\n}' | |
| 937 '</style></polymer-element>' | |
| 938 '</div>' | |
| 939 '</body></html>', | |
| 940 'a|web/foo/test2.html': | |
| 941 '<html><head></head><body>' | |
| 942 '<div hidden="">' | |
| 943 '<img src="bar/qux.png">' | |
| 944 '</div>' | |
| 945 '<polymer-element>2' | |
| 946 '<style>' | |
| 947 'body {\n background: #eaeaea url(test4.png);\n}\n' | |
| 948 '.foo {\n background: url(test5.png);\n}' | |
| 949 '</style></polymer-element>' | |
| 950 '</body></html>', | |
| 951 'a|web/foo/bar/test3.html': | |
| 952 '<img src="qux.png">', | |
| 953 'a|web/foo/test.css': | |
| 954 'body {\n background: #eaeaea url("test4.png");\n}\n' | |
| 955 '.foo {\n background: url("test5.png");\n}', | |
| 956 }); | |
| 957 | |
| 958 testPhases('shallow, inlines css and preserves order', phases, { | |
| 959 'a|web/test.html': | |
| 960 '<!DOCTYPE html><html><head>' | |
| 961 '<style>.first { color: black }</style>' | |
| 962 '<link rel="stylesheet" href="test2.css">' | |
| 963 '<style>.second { color: black }</style>' | |
| 964 '</head></html>', | |
| 965 'a|web/test2.css': | |
| 966 'h1 { font-size: 70px; }', | |
| 967 }, { | |
| 968 'a|web/test.html': | |
| 969 '<!DOCTYPE html><html><head>' | |
| 970 '<style>.first { color: black }</style>' | |
| 971 '<style>h1 { font-size: 70px; }</style>' | |
| 972 '<style>.second { color: black }</style>' | |
| 973 '</head><body>' | |
| 974 '</body></html>', | |
| 975 'a|web/test.html._data': EMPTY_DATA, | |
| 976 'a|web/test2.css': | |
| 977 'h1 { font-size: 70px; }', | |
| 978 }); | |
| 979 | |
| 980 testPhases('inlined tags keep original attributes', phases, { | |
| 981 'a|web/test.html': | |
| 982 '<!DOCTYPE html><html><head>' | |
| 983 '<link rel="stylesheet" href="foo.css" no-shim>' | |
| 984 '<link rel="stylesheet" href="bar.css" shim-shadow foo>' | |
| 985 '</head></html>', | |
| 986 'a|web/foo.css': | |
| 987 'h1 { font-size: 70px; }', | |
| 988 'a|web/bar.css': | |
| 989 'h2 { font-size: 35px; }', | |
| 990 }, { | |
| 991 'a|web/test.html': | |
| 992 '<!DOCTYPE html><html><head>' | |
| 993 '<style no-shim="">h1 { font-size: 70px; }</style>' | |
| 994 '<style shim-shadow="" foo="">h2 { font-size: 35px; }</style>' | |
| 995 '</head><body>' | |
| 996 '</body></html>', | |
| 997 'a|web/foo.css': | |
| 998 'h1 { font-size: 70px; }', | |
| 999 'a|web/bar.css': | |
| 1000 'h2 { font-size: 35px; }', | |
| 1001 }); | |
| 1002 | |
| 1003 testPhases( | |
| 1004 'can configure default stylesheet inlining', | |
| 1005 [[new ImportInliner(new TransformOptions( | |
| 1006 inlineStylesheets: {'default': false}))]], { | |
| 1007 'a|web/test.html': | |
| 1008 '<!DOCTYPE html><html><head></head><body>' | |
| 1009 '<link rel="stylesheet" href="foo.css">' | |
| 1010 '</body></html>', | |
| 1011 'a|web/foo.css': | |
| 1012 'h1 { font-size: 70px; }', | |
| 1013 }, { | |
| 1014 'a|web/test.html': | |
| 1015 '<!DOCTYPE html><html><head></head><body>' | |
| 1016 '<link rel="stylesheet" href="foo.css">' | |
| 1017 '</body></html>', | |
| 1018 }); | |
| 1019 | |
| 1020 testPhases( | |
| 1021 'can override default stylesheet inlining', | |
| 1022 [[new ImportInliner(new TransformOptions( | |
| 1023 inlineStylesheets: { | |
| 1024 'default': false, | |
| 1025 'web/foo.css': true, | |
| 1026 'b|lib/baz.css': true, | |
| 1027 }))]], | |
| 1028 { | |
| 1029 'a|web/test.html': | |
| 1030 '<!DOCTYPE html><html><head></head><body>' | |
| 1031 '<link rel="stylesheet" href="bar.css">' | |
| 1032 '<link rel="stylesheet" href="foo.css">' | |
| 1033 '<link rel="stylesheet" href="packages/b/baz.css">' | |
| 1034 '<link rel="stylesheet" href="packages/c/buz.css">' | |
| 1035 '</body></html>', | |
| 1036 'a|web/foo.css': | |
| 1037 'h1 { font-size: 70px; }', | |
| 1038 'a|web/bar.css': | |
| 1039 'h1 { font-size: 35px; }', | |
| 1040 'b|lib/baz.css': | |
| 1041 'h1 { font-size: 20px; }', | |
| 1042 'c|lib/buz.css': | |
| 1043 'h1 { font-size: 10px; }', | |
| 1044 }, { | |
| 1045 'a|web/test.html': | |
| 1046 '<!DOCTYPE html><html><head></head><body>' | |
| 1047 '<link rel="stylesheet" href="bar.css">' | |
| 1048 '<style>h1 { font-size: 70px; }</style>' | |
| 1049 '<style>h1 { font-size: 20px; }</style>' | |
| 1050 '<link rel="stylesheet" href="packages/c/buz.css">' | |
| 1051 '</body></html>', | |
| 1052 }); | |
| 1053 | |
| 1054 testLogOutput( | |
| 1055 (options) => new ImportInliner(options), | |
| 1056 'warns about multiple inlinings of the same css', { | |
| 1057 'a|web/test.html': | |
| 1058 '<!DOCTYPE html><html><head>' | |
| 1059 '<link rel="stylesheet" href="packages/a/foo.css">' | |
| 1060 '<link rel="stylesheet" href="packages/a/foo.css">' | |
| 1061 '</head><body></body></html>', | |
| 1062 'a|web/test1.html': | |
| 1063 '<!DOCTYPE html><html><head>' | |
| 1064 '<link rel="stylesheet" href="packages/a/foo.css">' | |
| 1065 '<link rel="import" href="packages/a/import1.html">' | |
| 1066 '</head><body></body></html>', | |
| 1067 'a|web/test2.html': | |
| 1068 '<!DOCTYPE html><html><head>' | |
| 1069 '<link rel="import" href="packages/a/import1.html">' | |
| 1070 '<link rel="import" href="packages/a/import2.html">' | |
| 1071 '</head><body></body></html>', | |
| 1072 'a|lib/import1.html': | |
| 1073 '<link rel="stylesheet" href="foo.css">', | |
| 1074 'a|lib/import2.html': | |
| 1075 '<link rel="stylesheet" href="foo.css">', | |
| 1076 'a|lib/foo.css': | |
| 1077 'body {position: relative;}', | |
| 1078 }, {}, [ | |
| 1079 'warning: ${CSS_FILE_INLINED_MULTIPLE_TIMES.create( | |
| 1080 {'url': 'lib/foo.css'}).snippet}' | |
| 1081 ' (web/test.html 0 76)', | |
| 1082 'warning: ${CSS_FILE_INLINED_MULTIPLE_TIMES.create( | |
| 1083 {'url': 'lib/foo.css'}).snippet}' | |
| 1084 ' (lib/import1.html 0 0)', | |
| 1085 'warning: ${CSS_FILE_INLINED_MULTIPLE_TIMES.create( | |
| 1086 {'url': 'lib/foo.css'}).snippet}' | |
| 1087 ' (lib/import2.html 0 0)', | |
| 1088 ]); | |
| 1089 | |
| 1090 testPhases( | |
| 1091 'doesn\'t warn about multiple css inlinings if overriden', | |
| 1092 [[new ImportInliner(new TransformOptions( | |
| 1093 inlineStylesheets: {'lib/foo.css': true}))]], { | |
| 1094 'a|web/test.html': | |
| 1095 '<!DOCTYPE html><html><head>' | |
| 1096 '<link rel="stylesheet" href="packages/a/foo.css">' | |
| 1097 '<link rel="stylesheet" href="packages/a/foo.css">' | |
| 1098 '</head><body></body></html>', | |
| 1099 'a|web/test1.html': | |
| 1100 '<!DOCTYPE html><html><head>' | |
| 1101 '<link rel="stylesheet" href="packages/a/foo.css">' | |
| 1102 '<link rel="import" href="packages/a/import1.html">' | |
| 1103 '</head><body></body></html>', | |
| 1104 'a|web/test2.html': | |
| 1105 '<!DOCTYPE html><html><head>' | |
| 1106 '<link rel="import" href="packages/a/import1.html">' | |
| 1107 '<link rel="import" href="packages/a/import2.html">' | |
| 1108 '</head><body></body></html>', | |
| 1109 'a|lib/import1.html': | |
| 1110 '<link rel="stylesheet" href="foo.css">', | |
| 1111 'a|lib/import2.html': | |
| 1112 '<link rel="stylesheet" href="foo.css">', | |
| 1113 'a|lib/foo.css': | |
| 1114 'body {position: relative;}', | |
| 1115 }, {}, []); | |
| 1116 } | |
| 1117 | |
| 1118 void urlAttributeTests() { | |
| 1119 | |
| 1120 testPhases('url attributes are normalized', phases, { | |
| 1121 'a|web/test.html': | |
| 1122 '<!DOCTYPE html><html><head>' | |
| 1123 '<link rel="import" href="foo/test_1.html">' | |
| 1124 '<link rel="import" href="foo/test_2.html">' | |
| 1125 '</head></html>', | |
| 1126 'a|web/foo/test_1.html': | |
| 1127 '<script src="baz.jpg"></script>', | |
| 1128 'a|web/foo/test_2.html': | |
| 1129 '<foo-element src="baz.jpg"></foo-element>' | |
| 1130 }, { | |
| 1131 'a|web/test.html': | |
| 1132 '<!DOCTYPE html><html><head></head><body>' | |
| 1133 '<div hidden="">' | |
| 1134 '<script src="foo/baz.jpg"></script>' // normalized | |
| 1135 '<foo-element src="baz.jpg"></foo-element>' // left alone (custom) | |
| 1136 '</div>' | |
| 1137 '</body></html>', | |
| 1138 'a|web/foo/test_1.html': | |
| 1139 '<script src="baz.jpg"></script>', | |
| 1140 'a|web/foo/test_2.html': | |
| 1141 '<foo-element src="baz.jpg"></foo-element>', | |
| 1142 }); | |
| 1143 | |
| 1144 testPhases('paths with a binding prefix are not normalized', phases, { | |
| 1145 'a|web/test.html': | |
| 1146 '<!DOCTYPE html><html><head>' | |
| 1147 '<link rel="import" href="foo/test.html">' | |
| 1148 '</head></html>', | |
| 1149 'a|web/foo/test.html': | |
| 1150 '<img src="{{bar}}">' | |
| 1151 '<img src="[[bar]]">', | |
| 1152 }, { | |
| 1153 'a|web/test.html': | |
| 1154 '<!DOCTYPE html><html><head></head><body>' | |
| 1155 '<div hidden="">' | |
| 1156 '<img src="{{bar}}">' | |
| 1157 '<img src="[[bar]]">' | |
| 1158 '</div>' | |
| 1159 '</body></html>', | |
| 1160 'a|web/foo/test.html': | |
| 1161 '<img src="{{bar}}">' | |
| 1162 '<img src="[[bar]]">', | |
| 1163 }); | |
| 1164 | |
| 1165 testPhases('relative paths followed by bindings are normalized', phases, { | |
| 1166 'a|web/test.html': | |
| 1167 '<!DOCTYPE html><html><head>' | |
| 1168 '<link rel="import" href="foo/test.html">' | |
| 1169 '</head></html>', | |
| 1170 'a|web/foo/test.html': | |
| 1171 '<img src="baz/{{bar}}">' | |
| 1172 '<img src="./{{bar}}">', | |
| 1173 }, { | |
| 1174 'a|web/test.html': | |
| 1175 '<!DOCTYPE html><html><head></head><body>' | |
| 1176 '<div hidden="">' | |
| 1177 '<img src="foo/baz/{{bar}}">' | |
| 1178 '<img src="foo/{{bar}}">' | |
| 1179 '</div>' | |
| 1180 '</body></html>', | |
| 1181 }); | |
| 1182 | |
| 1183 testPhases('relative paths in _* attributes are normalized', phases, { | |
| 1184 'a|web/test.html': | |
| 1185 '<!DOCTYPE html><html><head>' | |
| 1186 '<link rel="import" href="foo/test.html">' | |
| 1187 '</head></html>', | |
| 1188 'a|web/foo/test.html': | |
| 1189 '<img _src="./{{bar}}">' | |
| 1190 '<a _href="./{{bar}}">test</a>', | |
| 1191 }, { | |
| 1192 'a|web/test.html': | |
| 1193 '<!DOCTYPE html><html><head></head><body>' | |
| 1194 '<div hidden="">' | |
| 1195 '<img _src="foo/{{bar}}">' | |
| 1196 '<a _href="foo/{{bar}}">test</a>' | |
| 1197 '</div>' | |
| 1198 '</body></html>', | |
| 1199 }); | |
| 1200 | |
| 1201 | |
| 1202 testLogOutput( | |
| 1203 (options) => new ImportInliner(options), | |
| 1204 'warnings are given about _* attributes', { | |
| 1205 'a|web/test.html': | |
| 1206 '<!DOCTYPE html><html><head></head><body>' | |
| 1207 '<img src="foo/{{bar}}">' | |
| 1208 '<a _href="foo/bar">test</a>' | |
| 1209 '</body></html>', | |
| 1210 }, {}, [ | |
| 1211 'warning: When using bindings with the "src" attribute you may ' | |
| 1212 'experience errors in certain browsers. Please use the "_src" ' | |
| 1213 'attribute instead. (web/test.html 0 40)', | |
| 1214 'warning: The "_href" attribute is only supported when using ' | |
| 1215 'bindings. Please change to the "href" attribute. ' | |
| 1216 '(web/test.html 0 63)', | |
| 1217 | |
| 1218 ]); | |
| 1219 | |
| 1220 testPhases('arbitrary bindings can exist in paths', phases, { | |
| 1221 'a|web/test.html': | |
| 1222 '<!DOCTYPE html><html><head></head><body>' | |
| 1223 '<img src="./{{(bar[2] + baz[\'foo\']) * 14 / foobar() - 0.5}}.jpg">' | |
| 1224 '<img src="./[[bar[2]]].jpg">' | |
| 1225 '</body></html>', | |
| 1226 }, { | |
| 1227 'a|web/test.html': | |
| 1228 '<!DOCTYPE html><html><head></head><body>' | |
| 1229 '<img src="{{(bar[2] + baz[\'foo\']) * 14 / foobar() - 0.5}}.jpg">' | |
| 1230 '<img src="[[bar[2]]].jpg">' | |
| 1231 '</body></html>', | |
| 1232 }); | |
| 1233 | |
| 1234 testPhases('multiple bindings can exist in paths', phases, { | |
| 1235 'a|web/test.html': | |
| 1236 '<!DOCTYPE html><html><head></head><body>' | |
| 1237 '<img src="./{{bar[0]}}/{{baz[1]}}.{{extension}}">' | |
| 1238 '</body></html>', | |
| 1239 }, { | |
| 1240 'a|web/test.html': | |
| 1241 '<!DOCTYPE html><html><head></head><body>' | |
| 1242 '<img src="{{bar[0]}}/{{baz[1]}}.{{extension}}">' | |
| 1243 '</body></html>', | |
| 1244 }); | |
| 1245 } | |
| 1246 | |
| 1247 void entryPointTests() { | |
| 1248 testPhases('one level deep entry points normalize correctly', phases, { | |
| 1249 'a|web/test/test.html': | |
| 1250 '<!DOCTYPE html><html><head>' | |
| 1251 '<link rel="import" href="../../packages/a/foo/foo.html">' | |
| 1252 '</head></html>', | |
| 1253 'a|lib/foo/foo.html': | |
| 1254 '<script rel="import" href="../../../packages/b/bar/bar.js">' | |
| 1255 '</script>', | |
| 1256 'b|lib/bar/bar.js': | |
| 1257 'console.log("here");', | |
| 1258 }, { | |
| 1259 'a|web/test/test.html': | |
| 1260 '<!DOCTYPE html><html><head></head><body>' | |
| 1261 '<div hidden="">' | |
| 1262 '<script rel="import" href="../packages/b/bar/bar.js"></script>' | |
| 1263 '</div>' | |
| 1264 '</body></html>', | |
| 1265 }); | |
| 1266 | |
| 1267 testPhases('includes in entry points normalize correctly', phases, { | |
| 1268 'a|web/test/test.html': | |
| 1269 '<!DOCTYPE html><html><head>' | |
| 1270 '<script src="packages/a/foo/bar.js"></script>' | |
| 1271 '</head></html>', | |
| 1272 'a|lib/foo/bar.js': | |
| 1273 'console.log("here");', | |
| 1274 }, { | |
| 1275 'a|web/test/test.html': | |
| 1276 '<!DOCTYPE html><html><head>' | |
| 1277 '<script src="../packages/a/foo/bar.js"></script>' | |
| 1278 '</head><body>' | |
| 1279 '</body></html>', | |
| 1280 }); | |
| 1281 | |
| 1282 testPhases('two level deep entry points normalize correctly', phases, { | |
| 1283 'a|web/test/well/test.html': | |
| 1284 '<!DOCTYPE html><html><head>' | |
| 1285 '<link rel="import" href="../../../packages/a/foo/foo.html">' | |
| 1286 '</head></html>', | |
| 1287 'a|lib/foo/foo.html': | |
| 1288 '<script rel="import" href="../../../packages/b/bar/bar.js"></script>', | |
| 1289 'b|lib/bar/bar.js': | |
| 1290 'console.log("here");', | |
| 1291 }, { | |
| 1292 'a|web/test/well/test.html': | |
| 1293 '<!DOCTYPE html><html><head></head><body>' | |
| 1294 '<div hidden="">' | |
| 1295 '<script rel="import" href="../../packages/b/bar/bar.js"></script>' | |
| 1296 '</div>' | |
| 1297 '</body></html>', | |
| 1298 }); | |
| 1299 } | |
| OLD | NEW |