Web Inspector: DOM: provide a way to disable/breakpoint all event listeners for a...
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Views / DebuggerDashboardView.js
1 /*
2  * Copyright (C) 2014-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 APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WI.DebuggerDashboardView = class DebuggerDashboardView extends WI.DashboardView
27 {
28     constructor(representedObject)
29     {
30         super(representedObject, "debugger");
31
32         WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.ActiveCallFrameDidChange, this._rebuildLocation, this);
33
34         this._navigationBar = new WI.NavigationBar;
35         this.element.appendChild(this._navigationBar.element);
36
37         var tooltip = WI.UIString("Continue script execution (%s or %s)").format(WI.pauseOrResumeKeyboardShortcut.displayName, WI.pauseOrResumeAlternateKeyboardShortcut.displayName);
38         this._debuggerResumeButtonItem = new WI.ActivateButtonNavigationItem("debugger-dashboard-pause", tooltip, tooltip, "Images/Resume.svg", 15, 15);
39         this._debuggerResumeButtonItem.activated = true;
40         this._debuggerResumeButtonItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, this._resumeButtonClicked, this);
41         this._navigationBar.addNavigationItem(this._debuggerResumeButtonItem);
42
43         var message = this._messageElement = document.createElement("div");
44         message.classList.add("message");
45         message.title = message.textContent = WI.UIString("Debugger Paused");
46         this.element.appendChild(message);
47
48         var dividerElement = document.createElement("div");
49         dividerElement.classList.add("divider");
50         this.element.appendChild(dividerElement);
51
52         var locationElement = this._locationElement = document.createElement("div");
53         locationElement.classList.add("location");
54         this.element.appendChild(locationElement);
55
56         this._rebuildLocation();
57     }
58
59     // Public
60
61     closed()
62     {
63         WI.debuggerManager.removeEventListener(null, null, this);
64
65         super.closed();
66     }
67
68     // Private
69
70     _rebuildLocation()
71     {
72         if (!WI.debuggerManager.activeCallFrame)
73             return;
74
75         this._locationElement.removeChildren();
76
77         var callFrame = WI.debuggerManager.activeCallFrame;
78         var functionName = callFrame.functionName || WI.UIString("(anonymous function)");
79
80         var iconClassName = WI.DebuggerDashboardView.FunctionIconStyleClassName;
81
82         // This is more than likely an event listener function with an "on" prefix and it is
83         // as long or longer than the shortest event listener name -- "oncut".
84         if (callFrame.functionName && callFrame.functionName.startsWith("on") && callFrame.functionName.length >= 5)
85             iconClassName = WI.DebuggerDashboardView.EventListenerIconStyleClassName;
86
87         var iconElement = document.createElement("div");
88         iconElement.classList.add(iconClassName);
89         this._locationElement.appendChild(iconElement);
90
91         var iconImageElement = document.createElement("img");
92         iconImageElement.className = "icon";
93         iconElement.appendChild(iconImageElement);
94
95         var nameElement = document.createElement("div");
96         nameElement.append(functionName);
97         nameElement.classList.add("function-name");
98         this._locationElement.appendChild(nameElement);
99
100         const options = {
101             dontFloat: true,
102             ignoreNetworkTab: true,
103             ignoreSearchTab: true,
104         };
105         let linkElement = WI.createSourceCodeLocationLink(WI.debuggerManager.activeCallFrame.sourceCodeLocation, options);
106         this._locationElement.appendChild(linkElement);
107     }
108
109     _resumeButtonClicked()
110     {
111         WI.debuggerManager.resume();
112     }
113 };
114
115 WI.DebuggerDashboardView.FunctionIconStyleClassName = WI.CallFrameView.FunctionIconStyleClassName;
116 WI.DebuggerDashboardView.EventListenerIconStyleClassName = WI.CallFrameView.EventListenerIconStyleClassName;