f496364a115bbfd4515d36b7490eef8b865b3b77
[WebKit-https.git] / LayoutTests / http / tests / inspector-protocol / resources / InspectorTest.js
1 /*
2  * Copyright (C) 2012 Samsung Electronics. 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 InspectorFrontendAPI = {};
26
27 InspectorTest = {};
28 InspectorTest._dispatchTable = [];
29 InspectorTest._requestId = -1;
30 InspectorTest.eventHandler = {};
31
32 /**
33  * @param {string} method
34  * @param {object} params
35  * @param {function({object} messageObject)=} handler
36  */
37 InspectorTest.sendCommand = function(method, params, handler)
38 {
39     this._dispatchTable[++this._requestId] = handler;
40
41     var messageObject = { "method": method,
42                           "params": params,
43                           "id": this._requestId };
44
45     InspectorFrontendHost.sendMessageToBackend(JSON.stringify(messageObject));
46
47     return this._requestId;
48 }
49
50 /**
51  * @param {object} messageObject
52  */
53 InspectorFrontendAPI.dispatchMessageAsync = function(messageObject)
54 {
55     var messageId = messageObject["id"];
56     if (typeof messageId === "number") {
57         var handler = InspectorTest._dispatchTable[messageId];
58         if (handler && typeof handler === "function")
59             handler(messageObject);
60     } else {
61         var eventName = messageObject["method"];
62         var eventHandler = InspectorTest.eventHandler[eventName];
63         if (eventHandler)
64             eventHandler(messageObject);
65     }
66 }
67
68 /**
69 * Logs message to document.
70 * @param {string} message
71 */
72 InspectorTest.log = function(message)
73 {
74     this.sendCommand("Runtime.evaluate", { "expression": "log(" + JSON.stringify(message) + ")" } );
75 }
76
77 /**
78 * Logs message directly to process stdout via alert function (hopefully followed by flush call).
79 * This message should survive process crash or kill by timeout.
80 * @param {string} message
81 */
82 InspectorTest.debugLog = function(message)
83 {
84     this.sendCommand("Runtime.evaluate", { "expression": "debugLog(" + JSON.stringify(message) + ")" } );
85 }
86
87 InspectorTest.completeTest = function()
88 {
89     this.sendCommand("Runtime.evaluate", { "expression": "closeTest();"} );
90 }
91
92 InspectorTest.checkForError = function(responseObject)
93 {
94     if (responseObject.error) {
95         InspectorTest.log("PROTOCOL ERROR: " + responseObject.error.message);
96         InspectorTest.completeTest();
97         throw "PROTOCOL ERROR";
98     }
99 }
100
101 /**
102  * @param {string} scriptName
103  */
104 InspectorTest.importScript = function(scriptName)
105 {
106     var xhr = new XMLHttpRequest();
107     xhr.open("GET", scriptName, false);
108     xhr.send(null);
109     if (xhr.status !== 0 && xhr.status !== 200)
110         throw new Error("Invalid script URL: " + scriptName);
111     var script = "try { " + xhr.responseText + "} catch (e) { alert(" + JSON.stringify("Error in: " + scriptName) + "); throw e; }";
112     window.eval(script);
113 }
114
115 InspectorTest.importInspectorScripts = function()
116 {
117     // Note: This function overwrites the InspectorFrontendAPI, so there's currently no
118     // way to intercept the messages from the backend.
119
120     var inspectorScripts = [
121         "Utilities",
122         "WebInspector",
123         "Object",
124         "InspectorBackend",
125         "InspectorFrontendAPI",
126         "InspectorFrontendHostStub",
127         "InspectorBackendCommands",
128         "URLUtilities",
129         "MessageDispatcher",
130         "Setting",
131         "PageObserver",
132         "DOMObserver",
133         "FrameResourceManager",
134         "RuntimeManager",
135         "Frame",
136         "Revision",
137         "SourceCodeRevision",
138         "SourceCode",
139         "Resource",
140         "ResourceCollection",
141         "DOMTreeManager",
142         "DOMNode",
143         "ContentFlow",
144         "DOMTree",
145         "ExecutionContext",
146         "ExecutionContextList"
147     ];
148     for (var i = 0; i < inspectorScripts.length; ++i)
149         InspectorTest.importScript("../../../../../Source/WebInspectorUI/UserInterface/" + inspectorScripts[i] + ".js");
150
151     // The initialization should be in sync with WebInspector.loaded in Main.js.
152     // FIXME: As soon as we can support all the observers and managers we should remove UI related tasks 
153     // from WebInspector.loaded, so that it can be used from the LayoutTests.
154
155     InspectorBackend.registerPageDispatcher(new WebInspector.PageObserver);
156     InspectorBackend.registerDOMDispatcher(new WebInspector.DOMObserver);
157
158     WebInspector.frameResourceManager = new WebInspector.FrameResourceManager;
159     WebInspector.domTreeManager = new WebInspector.DOMTreeManager;
160
161     InspectorFrontendHost.loaded();
162 }
163
164
165 window.addEventListener("message", function(event) {
166     try {
167         eval(event.data);
168     } catch (e) {
169         alert(e.stack);
170         InspectorTest.completeTest();
171         throw e;
172     }
173 });