Web Inspector: Keep Web Inspector window alive across process swaps (PSON) (Local...
[WebKit-https.git] / Source / WebKit / UIProcess / WebInspectorProxy.h
1 /*
2  * Copyright (C) 2010, 2014, 2016 Apple Inc. All rights reserved.
3  * Portions Copyright (c) 2011 Motorola Mobility, Inc.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
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 INC. AND ITS CONTRIBUTORS ``AS IS''
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24  * THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #pragma once
28
29 #include "APIObject.h"
30 #include "Attachment.h"
31 #include "MessageReceiver.h"
32 #include "WebInspectorUtilities.h"
33 #include <JavaScriptCore/InspectorFrontendChannel.h>
34 #include <wtf/Forward.h>
35 #include <wtf/RefPtr.h>
36 #include <wtf/text/WTFString.h>
37
38 #if PLATFORM(MAC)
39 #include "WKGeometry.h"
40 #include <WebCore/IntRect.h>
41 #include <wtf/HashMap.h>
42 #include <wtf/RetainPtr.h>
43 #include <wtf/RunLoop.h>
44
45 OBJC_CLASS NSURL;
46 OBJC_CLASS NSView;
47 OBJC_CLASS NSWindow;
48 OBJC_CLASS WKWebInspectorProxyObjCAdapter;
49 OBJC_CLASS WKInspectorViewController;
50 #elif PLATFORM(WIN)
51 #include "WebView.h"
52 #endif
53
54 namespace WebCore {
55 class URL;
56 }
57
58 namespace WebKit {
59
60 class WebFrameProxy;
61 class WebInspectorProxyClient;
62 class WebPageProxy;
63 class WebPreferences;
64
65 enum class AttachmentSide {
66     Bottom,
67     Right,
68     Left,
69 };
70
71 class WebInspectorProxy
72     : public API::ObjectImpl<API::Object::Type::Inspector>
73     , public IPC::MessageReceiver
74     , public Inspector::FrontendChannel
75 #if PLATFORM(WIN)
76     , public WebCore::WindowMessageListener
77 #endif
78 {
79 public:
80     static Ref<WebInspectorProxy> create(WebPageProxy* inspectedPage)
81     {
82         return adoptRef(*new WebInspectorProxy(inspectedPage));
83     }
84
85     ~WebInspectorProxy();
86
87     void invalidate();
88
89     // Public APIs
90     WebPageProxy* inspectedPage() const { return m_inspectedPage; }
91
92     bool isConnected() const { return !!m_inspectorPage; }
93     bool isVisible() const { return m_isVisible; }
94     bool isFront();
95
96     void connect();
97
98     void show();
99     void hide();
100     void close();
101     void closeForCrash();
102
103     void reset();
104     void updateForNewPageProcess(WebPageProxy*);
105
106 #if PLATFORM(MAC) && WK_API_ENABLED
107     static RetainPtr<NSWindow> createFrontendWindow(NSRect savedWindowFrame);
108
109     void updateInspectorWindowTitle() const;
110     void inspectedViewFrameDidChange(CGFloat = 0);
111     void windowFrameDidChange();
112     void windowFullScreenDidChange();
113     NSWindow* inspectorWindow() const { return m_inspectorWindow.get(); }
114
115     void closeFrontendPage();
116     void closeFrontendAfterInactivityTimerFired();
117
118     void attachmentViewDidChange(NSView *oldView, NSView *newView);
119     void attachmentWillMoveFromWindow(NSWindow *oldWindow);
120     void attachmentDidMoveToWindow(NSWindow *newWindow);
121 #endif
122
123 #if PLATFORM(GTK)
124     GtkWidget* inspectorView() const { return m_inspectorView; };
125     void setClient(std::unique_ptr<WebInspectorProxyClient>&&);
126 #endif
127
128     void showConsole();
129     void showResources();
130     void showTimelines();
131     void showMainResourceForFrame(WebFrameProxy*);
132
133     AttachmentSide attachmentSide() const { return m_attachmentSide; }
134     bool isAttached() const { return m_isAttached; }
135     void attachRight();
136     void attachLeft();
137     void attachBottom();
138     void attach(AttachmentSide = AttachmentSide::Bottom);
139     void detach();
140
141     void setAttachedWindowHeight(unsigned);
142     void setAttachedWindowWidth(unsigned);
143
144     void startWindowDrag();
145
146     bool isProfilingPage() const { return m_isProfilingPage; }
147     void togglePageProfiling();
148
149     bool isElementSelectionActive() const { return m_elementSelectionActive; }
150     void toggleElementSelection();
151
152     bool isUnderTest() const { return m_underTest; }
153
154     // Provided by platform WebInspectorProxy implementations.
155     static String inspectorPageURL();
156     static String inspectorTestPageURL();
157     static String inspectorBaseURL();
158     static bool isMainOrTestInspectorPage(const WebCore::URL&);
159
160     static const unsigned minimumWindowWidth;
161     static const unsigned minimumWindowHeight;
162
163     static const unsigned initialWindowWidth;
164     static const unsigned initialWindowHeight;
165
166 private:
167     explicit WebInspectorProxy(WebPageProxy*);
168
169     void createFrontendPage();
170     void closeFrontendPageAndWindow();
171
172     // IPC::MessageReceiver
173     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
174
175     // Inspector::FrontendChannel
176     void sendMessageToFrontend(const String& message) override;
177     ConnectionType connectionType() const override { return ConnectionType::Local; }
178
179     WebPageProxy* platformCreateFrontendPage();
180     void platformCreateFrontendWindow();
181     void platformCloseFrontendPageAndWindow();
182
183     void platformDidCloseForCrash();
184     void platformInvalidate();
185     void platformBringToFront();
186     void platformBringInspectedPageToFront();
187     void platformHide();
188     bool platformIsFront();
189     void platformAttachAvailabilityChanged(bool);
190     void platformInspectedURLChanged(const String&);
191     unsigned platformInspectedWindowHeight();
192     unsigned platformInspectedWindowWidth();
193     void platformAttach();
194     void platformDetach();
195     void platformSetAttachedWindowHeight(unsigned);
196     void platformSetAttachedWindowWidth(unsigned);
197     void platformStartWindowDrag();
198     void platformSave(const String& filename, const String& content, bool base64Encoded, bool forceSaveAs);
199     void platformAppend(const String& filename, const String& content);
200
201 #if PLATFORM(MAC) && WK_API_ENABLED
202     bool platformCanAttach(bool webProcessCanAttach);
203 #else
204     bool platformCanAttach(bool webProcessCanAttach) { return webProcessCanAttach; }
205 #endif
206
207     // Called by WebInspectorProxy messages
208     void openLocalInspectorFrontend(bool canAttach, bool underTest);
209     void setFrontendConnection(IPC::Attachment);
210
211     void sendMessageToBackend(const String&);
212     void frontendLoaded();
213     void didClose();
214     void bringToFront();
215     void attachAvailabilityChanged(bool);
216     void inspectedURLChanged(const String&);
217     void elementSelectionChanged(bool);
218
219     void save(const String& filename, const String& content, bool base64Encoded, bool forceSaveAs);
220     void append(const String& filename, const String& content);
221
222     bool canAttach() const { return m_canAttach; }
223     bool shouldOpenAttached();
224
225     void open();
226
227     unsigned inspectionLevel() const;
228
229     WebPreferences& inspectorPagePreferences() const;
230
231 #if PLATFORM(GTK) || PLATFORM(WPE)
232     void updateInspectorWindowTitle() const;
233 #endif
234
235 #if PLATFORM(WIN)
236     static LRESULT CALLBACK wndProc(HWND, UINT, WPARAM, LPARAM);
237     bool registerWindowClass();
238     void windowReceivedMessage(HWND, UINT, WPARAM, LPARAM) override;
239 #endif
240
241     WebPageProxy* m_inspectedPage { nullptr };
242     WebPageProxy* m_inspectorPage { nullptr };
243
244     bool m_underTest { false };
245     bool m_isVisible { false };
246     bool m_isAttached { false };
247     bool m_canAttach { false };
248     bool m_isProfilingPage { false };
249     bool m_showMessageSent { false };
250     bool m_ignoreFirstBringToFront { false };
251     bool m_elementSelectionActive { false };
252     bool m_ignoreElementSelectionChange { false };
253     bool m_isOpening { false };
254
255     AttachmentSide m_attachmentSide {AttachmentSide::Bottom};
256
257 #if PLATFORM(MAC) && WK_API_ENABLED
258     RetainPtr<WKInspectorViewController> m_inspectorViewController;
259     RetainPtr<NSWindow> m_inspectorWindow;
260     RetainPtr<WKWebInspectorProxyObjCAdapter> m_objCAdapter;
261     HashMap<String, RetainPtr<NSURL>> m_suggestedToActualURLMap;
262     RunLoop::Timer<WebInspectorProxy> m_closeFrontendAfterInactivityTimer;
263     String m_urlString;
264     bool m_isObservingContentLayoutRect { false };
265 #elif PLATFORM(GTK)
266     std::unique_ptr<WebInspectorProxyClient> m_client;
267     GtkWidget* m_inspectorView { nullptr };
268     GtkWidget* m_inspectorWindow { nullptr };
269     GtkWidget* m_headerBar { nullptr };
270     String m_inspectedURLString;
271 #elif PLATFORM(WIN)
272     HWND m_inspectedViewWindow { nullptr };
273     HWND m_inspectedViewParentWindow { nullptr };
274     HWND m_inspectorViewWindow { nullptr };
275     HWND m_inspectorDetachWindow { nullptr };
276     RefPtr<WebView> m_inspectorView;
277 #endif
278 };
279
280 } // namespace WebKit