finally blocks should not set the exception stack trace when re-throwing the exception.
[WebKit-https.git] / LayoutTests / http / tests / inspector / inspector-test.js
1 /*
2  * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
14  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
15  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
16  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
17  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
18  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
19  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 // This namespace is injected into every test page. Its functions are invoked by
27 // InspectorTest methods on the inspector page via RuntimeAgent.evaluate() calls.
28 InspectorTestProxy = {};
29 InspectorTestProxy._initializers = [];
30
31 // Helper scripts like `debugger-test.js` must register their initialization
32 // function with this method so it will be marshalled to the inspector page.
33 InspectorTestProxy.registerInitializer = function(initializer)
34 {
35     if (typeof initializer === "function")
36         this._initializers.push(initializer.toString());
37 }
38
39 // This function is called by the test document's body onload handler.
40
41 // It initializes the inspector and loads any `*-test.js` helper scripts
42 // into the inspector page context.
43 function runTest()
44 {
45     // Don't try to use testRunner if running through the browser.
46     if (!window.testRunner)
47         return;
48
49     // Set up the test page before the load event fires.
50     testRunner.dumpAsText();
51     testRunner.waitUntilDone();
52
53     window.internals.setInspectorIsUnderTest(true);
54     testRunner.showWebInspector();
55
56     function runInitializationMethodsInFrontend(initializersArray)
57     {
58         InspectorTest.testPageDidLoad();
59
60         // If the test page reloaded but we started running the test in a previous
61         // navigation, then don't initialize the inspector frontend again.
62         if (InspectorTest.didInjectTestCode)
63             return;
64
65         for (var initializer of initializersArray) {
66             try {
67                 initializer();
68             } catch (e) {
69                 console.error("Exception in test initialization: " + e, e.stack || "(no stack trace)");
70                 InspectorTest.completeTest();
71             }
72         }
73     }
74
75     function runTestMethodInFrontend(testFunction)
76     {
77         if (InspectorTest.didInjectTestCode)
78             return;
79
80         InspectorTest.didInjectTestCode = true;
81
82         try {
83             testFunction();
84         } catch (e) {
85             console.error("Exception during test execution: " + e, e.stack || "(no stack trace)");
86             InspectorTest.completeTest();
87         }
88     }
89
90     var codeStringToEvaluate = "(" + runInitializationMethodsInFrontend.toString() + ")([" + InspectorTestProxy._initializers + "]);";
91     testRunner.evaluateInWebInspector(codeStringToEvaluate);
92
93     // `test` refers to a function defined in global scope in the test HTML page.
94     codeStringToEvaluate = "(" + runTestMethodInFrontend.toString() + ")(" + test.toString() + ");";
95     testRunner.evaluateInWebInspector(codeStringToEvaluate);
96 }
97
98 InspectorTestProxy.completeTest = function()
99 {
100     // Don't try to use testRunner if running through the browser.
101     if (!window.testRunner)
102         return;
103
104     // Close inspector asynchrously in case we want to test tear-down behavior.
105     setTimeout(function() {
106         testRunner.closeWebInspector();
107         setTimeout(function() {
108             testRunner.notifyDone();
109         }, 0);
110     }, 0);
111 }
112
113 // Logs message to unbuffered process stdout, avoiding timeouts.
114 // only be used to debug tests and not to produce normal test output.
115 InspectorTestProxy.debugLog = function(message)
116 {
117     window.alert(message);
118 }
119
120 // Add and clear test output from the results window.
121 InspectorTestProxy.addResult = function(text)
122 {
123     // For early errors triggered when loading the test page, write to stderr.
124     if (!document.body) {
125         this.debugLog(text);
126         this.completeTest();
127     }
128
129     if (!this._resultElement) {
130         this._resultElement = document.createElement("pre");
131         this._resultElement.id = "output";
132         document.body.appendChild(this._resultElement);
133     }
134     this._resultElement.appendChild(document.createTextNode(text));
135     this._resultElement.appendChild(document.createElement("br"));
136 }
137
138 InspectorTestProxy.clearResults = function()
139 {
140     if (this._resultElement) {
141         this._resultElement.parentNode.removeChild(this._resultElement);
142         delete this._resultElement;
143     }
144 }
145
146 InspectorTestProxy.needToSanitizeUncaughtExceptionURLs = false;
147
148 InspectorTestProxy.reportUncaughtException = function(message, url, lineNumber)
149 {
150     if (InspectorTestProxy.needToSanitizeUncaughtExceptionURLs) {
151         if (typeof url == "string") {
152             var lastSlash = url.lastIndexOf("/");
153             var lastBackSlash = url.lastIndexOf("\\");
154             var lastPathSeparator = Math.max(lastSlash, lastBackSlash);
155             if (lastPathSeparator > 0)
156                 url = url.substr(lastPathSeparator + 1);
157         }
158     }
159
160     var result = "Uncaught exception in test page: " + message + " [" + url + ":" + lineNumber + "]";
161     InspectorTestProxy.addResult(result);
162     InspectorTestProxy.completeTest();
163 }
164
165 // Catch syntax errors, type errors, and other exceptions. Run this before loading other files.
166 window.onerror = InspectorTestProxy.reportUncaughtException;