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