OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 library browser; | 4 library browser; |
5 | 5 |
6 import "dart:async"; | 6 import "dart:async"; |
7 import "dart:convert" show LineSplitter, UTF8, JSON; | 7 import "dart:convert" show LineSplitter, UTF8, JSON; |
8 import "dart:core"; | 8 import "dart:core"; |
9 import "dart:io"; | 9 import "dart:io"; |
10 | 10 |
(...skipping 1448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1459 } | 1459 } |
1460 </style> | 1460 </style> |
1461 <title>Driving page</title> | 1461 <title>Driving page</title> |
1462 <script type='text/javascript'> | 1462 <script type='text/javascript'> |
1463 var STATUS_UPDATE_INTERVAL = 10000; | 1463 var STATUS_UPDATE_INTERVAL = 10000; |
1464 | 1464 |
1465 function startTesting() { | 1465 function startTesting() { |
1466 var number_of_tests = 0; | 1466 var number_of_tests = 0; |
1467 var current_id; | 1467 var current_id; |
1468 var next_id; | 1468 var next_id; |
1469 // Describes a state where we are currently fetching the next test | 1469 |
1470 // from the server. We use this to never double request tasks. | 1470 // Has the test in the current iframe reported that it is done? |
1471 var test_completed = true; | 1471 var test_completed = true; |
| 1472 // Has the test in the current iframe reported that it is started? |
| 1473 var test_started = false; |
1472 var testing_window; | 1474 var testing_window; |
1473 | 1475 |
| 1476 var embedded_iframe_div = document.getElementById('embedded_iframe_div'); |
1474 var embedded_iframe = document.getElementById('embedded_iframe'); | 1477 var embedded_iframe = document.getElementById('embedded_iframe'); |
1475 var number_div = document.getElementById('number'); | 1478 var number_div = document.getElementById('number'); |
1476 var executing_div = document.getElementById('currently_executing'); | 1479 var executing_div = document.getElementById('currently_executing'); |
1477 var error_div = document.getElementById('unhandled_error'); | 1480 var error_div = document.getElementById('unhandled_error'); |
1478 var use_iframe = ${useIframe}; | 1481 var use_iframe = ${useIframe}; |
1479 var start = new Date(); | 1482 var start = new Date(); |
1480 | 1483 |
1481 // Object that holds the state of an HTML test | 1484 // Object that holds the state of an HTML test |
1482 var html_test; | 1485 var html_test; |
1483 | 1486 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1575 number_of_tests++; | 1578 number_of_tests++; |
1576 number_div.innerHTML = number_of_tests; | 1579 number_div.innerHTML = number_of_tests; |
1577 executing_div.innerHTML = url; | 1580 executing_div.innerHTML = url; |
1578 if (use_iframe) { | 1581 if (use_iframe) { |
1579 if (html_test) { | 1582 if (html_test) { |
1580 window.addEventListener('detect_errors', setChildHandlers, false); | 1583 window.addEventListener('detect_errors', setChildHandlers, false); |
1581 embedded_iframe.onload = checkChildHandlersInstalled; | 1584 embedded_iframe.onload = checkChildHandlersInstalled; |
1582 } else { | 1585 } else { |
1583 embedded_iframe.onload = null; | 1586 embedded_iframe.onload = null; |
1584 } | 1587 } |
| 1588 embedded_iframe_div.removeChild(embedded_iframe); |
| 1589 embedded_iframe = document.createElement('iframe'); |
| 1590 embedded_iframe.id = "embedded_iframe"; |
| 1591 embedded_iframe.style="width:100%;height:100%"; |
| 1592 embedded_iframe_div.appendChild(embedded_iframe); |
1585 embedded_iframe.src = url; | 1593 embedded_iframe.src = url; |
1586 } else { | 1594 } else { |
1587 if (typeof testing_window != 'undefined') { | 1595 if (typeof testing_window != 'undefined') { |
1588 testing_window.close(); | 1596 testing_window.close(); |
1589 } | 1597 } |
1590 testing_window = window.open(url); | 1598 testing_window = window.open(url); |
1591 } | 1599 } |
| 1600 test_started = false; |
| 1601 test_completed = false; |
1592 } | 1602 } |
1593 | 1603 |
1594 window.onerror = function (message, url, lineNumber) { | 1604 window.onerror = function (message, url, lineNumber) { |
1595 if (url) { | 1605 if (url) { |
1596 reportError(url + ':' + lineNumber + ':' + message); | 1606 reportError(url + ':' + lineNumber + ':' + message); |
1597 } else { | 1607 } else { |
1598 reportError(message); | 1608 reportError(message); |
1599 } | 1609 } |
1600 } | 1610 } |
1601 | 1611 |
1602 function reportError(msg) { | 1612 function reportError(msg) { |
1603 function handleReady() { | 1613 function handleReady() { |
1604 if (this.readyState == this.DONE && this.status != 200) { | 1614 if (this.readyState == this.DONE && this.status != 200) { |
1605 var error = 'Sending back error did not succeeed: ' + this.status; | 1615 var error = 'Sending back error did not succeeed: ' + this.status; |
1606 error = error + '. Failed to send msg: ' + msg; | 1616 error = error + '. Failed to send msg: ' + msg; |
1607 error_div.innerHTML = error; | 1617 error_div.innerHTML = error; |
1608 } | 1618 } |
1609 } | 1619 } |
1610 contactBrowserController( | 1620 contactBrowserController( |
1611 'POST', '$errorReportingUrl?test=1', handleReady, msg, true); | 1621 'POST', '$errorReportingUrl?test=1', handleReady, msg, true); |
1612 } | 1622 } |
1613 | 1623 |
1614 function reportMessage(msg, isFirstMessage, isStatusUpdate) { | 1624 function reportMessage(msg, isFirstMessage, isStatusUpdate) { |
1615 if (isFirstMessage) { | 1625 if (isFirstMessage) { |
1616 test_completed = false; | 1626 if (test_started) { |
| 1627 reportMessage( |
| 1628 "FAIL: test started more than once (test reloads itself) " + |
| 1629 msg, false, false); |
| 1630 return; |
| 1631 } |
1617 current_id = next_id; | 1632 current_id = next_id; |
| 1633 test_started = true; |
1618 contactBrowserController( | 1634 contactBrowserController( |
1619 'POST', '$startedPath/${browserId}?id=' + current_id, | 1635 'POST', '$startedPath/${browserId}?id=' + current_id, |
1620 function () {}, msg, true); | 1636 function () {}, msg, true); |
1621 } else if (isStatusUpdate) { | 1637 } else if (isStatusUpdate) { |
1622 contactBrowserController( | 1638 contactBrowserController( |
1623 'POST', '$statusUpdatePath/${browserId}?id=' + current_id, | 1639 'POST', '$statusUpdatePath/${browserId}?id=' + current_id, |
1624 function() {}, msg, true); | 1640 function() {}, msg, true); |
1625 } else { | 1641 } else { |
1626 var is_double_report = test_completed; | 1642 var is_double_report = test_completed; |
1627 var retry = 0; | 1643 var retry = 0; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1659 try { | 1675 try { |
1660 parsedData = JSON.parse(result); | 1676 parsedData = JSON.parse(result); |
1661 } catch(error) { } | 1677 } catch(error) { } |
1662 return parsedData; | 1678 return parsedData; |
1663 } | 1679 } |
1664 | 1680 |
1665 // Browser tests send JSON messages to the driver window, handled here. | 1681 // Browser tests send JSON messages to the driver window, handled here. |
1666 function messageHandler(e) { | 1682 function messageHandler(e) { |
1667 var msg = e.data; | 1683 var msg = e.data; |
1668 if (typeof msg != 'string') return; | 1684 if (typeof msg != 'string') return; |
1669 | 1685 var expectedSource = |
| 1686 use_iframe ? embedded_iframe.contentWindow : testing_window; |
| 1687 if (e.source != expectedSource) { |
| 1688 reportError("Message received from old test window: " + msg); |
| 1689 return; |
| 1690 } |
1670 var parsedData = parseResult(msg); | 1691 var parsedData = parseResult(msg); |
1671 if (parsedData) { | 1692 if (parsedData) { |
1672 // Only if the JSON message contains all required parameters, | 1693 // Only if the JSON message contains all required parameters, |
1673 // will we handle it and post it back to the test controller. | 1694 // will we handle it and post it back to the test controller. |
1674 if ('message' in parsedData && | 1695 if ('message' in parsedData && |
1675 'is_first_message' in parsedData && | 1696 'is_first_message' in parsedData && |
1676 'is_status_update' in parsedData && | 1697 'is_status_update' in parsedData && |
1677 'is_done' in parsedData) { | 1698 'is_done' in parsedData) { |
1678 var message = parsedData['message']; | 1699 var message = parsedData['message']; |
1679 var isFirstMessage = parsedData['is_first_message']; | 1700 var isFirstMessage = parsedData['is_first_message']; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1737 getNextTask(); | 1758 getNextTask(); |
1738 } | 1759 } |
1739 </script> | 1760 </script> |
1740 </head> | 1761 </head> |
1741 <body onload="startTesting()"> | 1762 <body onload="startTesting()"> |
1742 <div class="controller box"> | 1763 <div class="controller box"> |
1743 Dart test driver, number of tests: <span id="number"></span><br> | 1764 Dart test driver, number of tests: <span id="number"></span><br> |
1744 Currently executing: <span id="currently_executing"></span><br> | 1765 Currently executing: <span id="currently_executing"></span><br> |
1745 Unhandled error: <span id="unhandled_error"></span> | 1766 Unhandled error: <span id="unhandled_error"></span> |
1746 </div> | 1767 </div> |
1747 <div class="test box"> | 1768 <div id="embedded_iframe_div" class="test box"> |
1748 <iframe style="width:100%;height:100%;" id="embedded_iframe"></iframe> | 1769 <iframe style="width:100%;height:100%;" id="embedded_iframe"></iframe> |
1749 </div> | 1770 </div> |
1750 </body> | 1771 </body> |
1751 </html> | 1772 </html> |
1752 """; | 1773 """; |
1753 return driverContent; | 1774 return driverContent; |
1754 } | 1775 } |
1755 } | 1776 } |
OLD | NEW |