Web Inspector: REGRESSION(r238378): reloading WebInspector after a settings change...
[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 CertificateInfo;
56 class URL;
57 }
58
59 namespace WebKit {
60
61 class WebFrameProxy;
62 class WebInspectorProxyClient;
63 class WebPageProxy;
64 class WebPreferences;
65
66 enum class AttachmentSide {
67     Bottom,
68     Right,
69     Left,
70 };
71
72 class WebInspectorProxy
73     : public API::ObjectImpl<API::Object::Type::Inspector>
74     , public IPC::MessageReceiver
75     , public Inspector::FrontendChannel
76 #if PLATFORM(WIN)
77     , public WebCore::WindowMessageListener
78 #endif
79 {
80 public:
81     static Ref<WebInspectorProxy> create(WebPageProxy* inspectedPage)
82     {
83         return adoptRef(*new WebInspectorProxy(inspectedPage));
84     }
85
86     ~WebInspectorProxy();
87
88     void invalidate();
89
90     // Public APIs
91     WebPageProxy* inspectedPage() const { return m_inspectedPage; }
92
93     bool isConnected() const { return !!m_inspectorPage; }
94     bool isVisible() const { return m_isVisible; }
95     bool isFront();
96
97     void connect();
98
99     void show();
100     void hide();
101     void close();
102     void closeForCrash();
103     void reopen();
104
105     void reset();
106     void updateForNewPageProcess(WebPageProxy*);
107
108 #if PLATFORM(MAC) && WK_API_ENABLED
109     static RetainPtr<NSWindow> createFrontendWindow(NSRect savedWindowFrame);
110
111     void updateInspectorWindowTitle() const;
112     void inspectedViewFrameDidChange(CGFloat = 0);
113     void windowFrameDidChange();
114     void windowFullScreenDidChange();
115     NSWindow* inspectorWindow() const { return m_inspectorWindow.get(); }
116
117     void closeFrontendPage();
118     void closeFrontendAfterInactivityTimerFired();
119
120     void attachmentViewDidChange(NSView *oldView, NSView *newView);
121     void attachmentWillMoveFromWindow(NSWindow *oldWindow);
122     void attachmentDidMoveToWindow(NSWindow *newWindow);
123 #endif
124
125 #if PLATFORM(GTK)
126     GtkWidget* inspectorView() const { return m_inspectorView; };
127     void setClient(std::unique_ptr<WebInspectorProxyClient>&&);
128 #endif
129
130     void showConsole();
131     void showResources();
132     void showTimelines();
133     void showMainResourceForFrame(WebFrameProxy*);
134
135     AttachmentSide attachmentSide() const { return m_attachmentSide; }
136     bool isAttached() const { return m_isAttached; }
137     void attachRight();
138     void attachLeft();
139     void attachBottom();
140     void attach(AttachmentSide = AttachmentSide::Bottom);
141     void detach();
142
143     void setAttachedWindowHeight(unsigned);
144     void setAttachedWindowWidth(unsigned);
145
146     void startWindowDrag();
147
148     bool isProfilingPage() const { return m_isProfilingPage; }
149     void togglePageProfiling();
150
151     bool isElementSelectionActive() const { return m_elementSelectionActive; }
152     void toggleElementSelection();
153
154     bool isUnderTest() const { return m_underTest; }
155
156     // Provided by platform WebInspectorProxy implementations.
157     static String inspectorPageURL();
158     static String inspectorTestPageURL();
159     static String inspectorBaseURL();
160     static bool isMainOrTestInspectorPage(const WebCore::URL&);
161
162     static const unsigned minimumWindowWidth;
163     static const unsigned minimumWindowHeight;
164
165     static const unsigned initialWindowWidth;
166     static const unsigned initialWindowHeight;
167
168 private:
169     explicit WebInspectorProxy(WebPageProxy*);
170
171     void createFrontendPage();
172     void closeFrontendPageAndWindow();
173
174     // IPC::MessageReceiver
175     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
176
177     // Inspector::FrontendChannel
178     void sendMessageToFrontend(const String& message) override;
179     ConnectionType connectionType() const override { return ConnectionType::Local; }
180
181     WebPageProxy* platformCreateFrontendPage();
182     void platformCreateFrontendWindow();
183     void platformCloseFrontendPageAndWindow();
184
185     void platformDidCloseForCrash();
186     void platformInvalidate();
187     void platformBringToFront();
188     void platformBringInspectedPageToFront();
189     void platformHide();
190     bool platformIsFront();
191     void platformAttachAvailabilityChanged(bool);
192     void platformInspectedURLChanged(const String&);
193     void platformShowCertificate(const WebCore::CertificateInfo&);
194     unsigned platformInspectedWindowHeight();
195     unsigned platformInspectedWindowWidth();
196     void platformAttach();
197     void platformDetach();
198     void platformSetAttachedWindowHeight(unsigned);
199     void platformSetAttachedWindowWidth(unsigned);
200     void platformStartWindowDrag();
201     void platformSave(const String& filename, const String& content, bool base64Encoded, bool forceSaveAs);
202     void platformAppend(const String& filename, const String& content);
203
204 #if PLATFORM(MAC) && WK_API_ENABLED
205     bool platformCanAttach(bool webProcessCanAttach);
206 #else
207     bool platformCanAttach(bool webProcessCanAttach) { return webProcessCanAttach; }
208 #endif
209
210     // Called by WebInspectorProxy messages
211     void openLocalInspectorFrontend(bool canAttach, bool underTest);
212     void setFrontendConnection(IPC::Attachment);
213
214     void sendMessageToBackend(const String&);
215     void frontendLoaded();
216     void didClose();
217     void bringToFront();
218     void attachAvailabilityChanged(bool);
219     void inspectedURLChanged(const String&);
220     void showCertificate(const WebCore::CertificateInfo&);
221     void elementSelectionChanged(bool);
222
223     void save(const String& filename, const String& content, bool base64Encoded, bool forceSaveAs);
224     void append(const String& filename, const String& content);
225
226     bool canAttach() const { return m_canAttach; }
227     bool shouldOpenAttached();
228
229     void open();
230
231     unsigned inspectionLevel() const;
232
233     WebPreferences& inspectorPagePreferences() const;
234
235 #if PLATFORM(GTK) || PLATFORM(WPE)
236     void updateInspectorWindowTitle() const;
237 #endif
238
239 #if PLATFORM(WIN)
240     static LRESULT CALLBACK wndProc(HWND, UINT, WPARAM, LPARAM);
241     bool registerWindowClass();
242     void windowReceivedMessage(HWND, UINT, WPARAM, LPARAM) override;
243 #endif
244
245     WebPageProxy* m_inspectedPage { nullptr };
246     WebPageProxy* m_inspectorPage { nullptr };
247
248     bool m_underTest { false };
249     bool m_isVisible { false };
250     bool m_isAttached { false };
251     bool m_canAttach { false };
252     bool m_isProfilingPage { false };
253     bool m_showMessageSent { false };
254     bool m_ignoreFirstBringToFront { false };
255     bool m_elementSelectionActive { false };
256     bool m_ignoreElementSelectionChange { false };
257     bool m_isOpening { false };
258     bool m_isActiveFrontend { false };
259
260     AttachmentSide m_attachmentSide {AttachmentSide::Bottom};
261
262 #if PLATFORM(MAC) && WK_API_ENABLED
263     RetainPtr<WKInspectorViewController> m_inspectorViewController;
264     RetainPtr<NSWindow> m_inspectorWindow;
265     RetainPtr<WKWebInspectorProxyObjCAdapter> m_objCAdapter;
266     HashMap<String, RetainPtr<NSURL>> m_suggestedToActualURLMap;
267     RunLoop::Timer<WebInspectorProxy> m_closeFrontendAfterInactivityTimer;
268     String m_urlString;
269     bool m_isObservingContentLayoutRect { false };
270 #elif PLATFORM(GTK)
271     std::unique_ptr<WebInspectorProxyClient> m_client;
272     GtkWidget* m_inspectorView { nullptr };
273     GtkWidget* m_inspectorWindow { nullptr };
274     GtkWidget* m_headerBar { nullptr };
275     String m_inspectedURLString;
276 #elif PLATFORM(WIN)
277     HWND m_inspectedViewWindow { nullptr };
278     HWND m_inspectedViewParentWindow { nullptr };
279     HWND m_inspectorViewWindow { nullptr };
280     HWND m_inspectorDetachWindow { nullptr };
281     RefPtr<WebView> m_inspectorView;
282 #endif
283 };
284
285 } // namespace WebKit