Web Inspector: Keep Web Inspector window alive across process swaps (PSON) (Local...
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Test / Test.js
1 /*
2  * Copyright (C) 2013-2015 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 WI.loaded = function()
27 {
28     // Register observers for events from the InspectorBackend.
29     // The initialization order should match the same in Main.js.
30     InspectorBackend.registerTargetDispatcher(new WI.TargetObserver);
31     InspectorBackend.registerInspectorDispatcher(new WI.InspectorObserver);
32     InspectorBackend.registerPageDispatcher(new WI.PageObserver);
33     InspectorBackend.registerConsoleDispatcher(new WI.ConsoleObserver);
34     InspectorBackend.registerNetworkDispatcher(new WI.NetworkObserver);
35     InspectorBackend.registerDOMDispatcher(new WI.DOMObserver);
36     InspectorBackend.registerDebuggerDispatcher(new WI.DebuggerObserver);
37     InspectorBackend.registerHeapDispatcher(new WI.HeapObserver);
38     InspectorBackend.registerMemoryDispatcher(new WI.MemoryObserver);
39     InspectorBackend.registerDOMStorageDispatcher(new WI.DOMStorageObserver);
40     InspectorBackend.registerScriptProfilerDispatcher(new WI.ScriptProfilerObserver);
41     InspectorBackend.registerTimelineDispatcher(new WI.TimelineObserver);
42     InspectorBackend.registerCSSDispatcher(new WI.CSSObserver);
43     InspectorBackend.registerLayerTreeDispatcher(new WI.LayerTreeObserver);
44     InspectorBackend.registerRuntimeDispatcher(new WI.RuntimeObserver);
45     InspectorBackend.registerWorkerDispatcher(new WI.WorkerObserver);
46     InspectorBackend.registerCanvasDispatcher(new WI.CanvasObserver);
47
48     // Instantiate controllers used by tests.
49     WI.managers = [
50         WI.targetManager = new WI.TargetManager,
51         WI.networkManager = new WI.NetworkManager,
52         WI.domStorageManager = new WI.DOMStorageManager,
53         WI.domManager = new WI.DOMManager,
54         WI.cssManager = new WI.CSSManager,
55         WI.consoleManager = new WI.ConsoleManager,
56         WI.runtimeManager = new WI.RuntimeManager,
57         WI.heapManager = new WI.HeapManager,
58         WI.memoryManager = new WI.MemoryManager,
59         WI.timelineManager = new WI.TimelineManager,
60         WI.debuggerManager = new WI.DebuggerManager,
61         WI.layerTreeManager = new WI.LayerTreeManager,
62         WI.workerManager = new WI.WorkerManager,
63         WI.domDebuggerManager = new WI.DOMDebuggerManager,
64         WI.canvasManager = new WI.CanvasManager,
65         WI.auditManager = new WI.AuditManager,
66     ];
67
68     // Register for events.
69     document.addEventListener("DOMContentLoaded", this.contentLoaded);
70
71     // Non-default global setting values for tests.
72     WI.settings.showShadowDOM.value = true;
73
74     // Targets.
75     WI.backendTarget = null;
76     WI.pageTarget = null;
77
78     // FIXME: Eliminate `TargetAgent.exists`.
79     TargetAgent.exists((error) => {
80         if (error)
81             WI.targetManager.createDirectBackendTarget();
82     });
83 };
84
85 WI.initializeBackendTarget = function(target)
86 {
87     WI.backendTarget = target;
88
89     WI.resetMainExecutionContext();
90 };
91
92 WI.initializePageTarget = function(target)
93 {
94     WI.pageTarget = target;
95
96     WI.redirectGlobalAgentsToConnection(WI.pageTarget.connection);
97
98     WI.resetMainExecutionContext();
99 };
100
101 WI.transitionPageTarget = function(target)
102 {
103     console.error("WI.transitionPageTarget should not be reached in tests.");
104 };
105
106 WI.terminatePageTarget = function(target)
107 {
108     console.error("WI.terminatePageTarget should not be reached in tests.");
109 };
110
111 WI.resetMainExecutionContext = function()
112 {
113     if (WI.mainTarget instanceof WI.MultiplexingBackendTarget)
114         return;
115
116     if (WI.mainTarget.executionContext)
117         WI.runtimeManager.activeExecutionContext = WI.mainTarget.executionContext;
118 };
119
120 WI.redirectGlobalAgentsToConnection = function(connection)
121 {
122     // This makes global window.FooAgent dispatch to the active page target.
123     for (let [domain, agent] of Object.entries(InspectorBackend._agents)) {
124         if (domain !== "Target")
125             agent.connection = connection;
126     }
127 };
128
129 WI.contentLoaded = function()
130 {
131     // Signal that the frontend is now ready to receive messages.
132     InspectorFrontendAPI.loadCompleted();
133
134     // Tell the InspectorFrontendHost we loaded, which causes the window to display
135     // and pending InspectorFrontendAPI commands to be sent.
136     InspectorFrontendHost.loaded();
137 };
138
139 WI.performOneTimeFrontendInitializationsUsingTarget = function(target)
140 {
141     if (!WI.__didPerformConsoleInitialization && target.ConsoleAgent) {
142         WI.__didPerformConsoleInitialization = true;
143         WI.consoleManager.initializeLogChannels(target);
144     }
145
146     // FIXME: This slows down test debug logging considerably.
147     if (!WI.__didPerformCSSInitialization && target.CSSAgent) {
148         WI.__didPerformCSSInitialization = true;
149         WI.CSSCompletions.initializeCSSCompletions(target);
150     }
151 };
152
153 Object.defineProperty(WI, "mainTarget",
154 {
155     get() { return WI.pageTarget || WI.backendTarget; }
156 });
157
158 Object.defineProperty(WI, "targets",
159 {
160     get() { return WI.targetManager.targets; }
161 });
162
163 WI.assumingMainTarget = () => WI.mainTarget;
164
165 WI.isDebugUIEnabled = () => false;
166
167 WI.unlocalizedString = (string) => string;
168 WI.UIString = (string) => string;
169
170 WI.indentString = () => "    ";
171
172 WI.LayoutDirection = {
173     System: "system",
174     LTR: "ltr",
175     RTL: "rtl",
176 };
177
178 WI.resolvedLayoutDirection = () => { return InspectorFrontendHost.userInterfaceLayoutDirection(); }
179
180 // Add stubs that are called by the frontend API.
181 WI.updateDockedState = () => {};
182 WI.updateDockingAvailability = () => {};
183 WI.updateVisibilityState = () => {};
184
185 window.InspectorTest = new FrontendTestHarness();
186
187 InspectorTest.redirectConsoleToTestOutput();
188
189 WI.reportInternalError = (e) => { console.error(e); };
190
191 window.reportUnhandledRejection = InspectorTest.reportUnhandledRejection.bind(InspectorTest);
192 window.onerror = InspectorTest.reportUncaughtExceptionFromEvent.bind(InspectorTest);