[iOS] Replace "node assistance" terminology in WebKit with "focused element"
[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 }
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     void reopen();
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 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     bool m_isActiveFrontend { false };
258
259     AttachmentSide m_attachmentSide {AttachmentSide::Bottom};
260
261 #if PLATFORM(MAC) && WK_API_ENABLED
262     RetainPtr<WKInspectorViewController> m_inspectorViewController;
263     RetainPtr<NSWindow> m_inspectorWindow;
264     RetainPtr<WKWebInspectorProxyObjCAdapter> m_objCAdapter;
265     HashMap<String, RetainPtr<NSURL>> m_suggestedToActualURLMap;
266     RunLoop::Timer<WebInspectorProxy> m_closeFrontendAfterInactivityTimer;
267     String m_urlString;
268     bool m_isObservingContentLayoutRect { false };
269 #elif PLATFORM(GTK)
270     std::unique_ptr<WebInspectorProxyClient> m_client;
271     GtkWidget* m_inspectorView { nullptr };
272     GtkWidget* m_inspectorWindow { nullptr };
273     GtkWidget* m_headerBar { nullptr };
274     String m_inspectedURLString;
275 #elif PLATFORM(WIN)
276     HWND m_inspectedViewWindow { nullptr };
277     HWND m_inspectedViewParentWindow { nullptr };
278     HWND m_inspectorViewWindow { nullptr };
279     HWND m_inspectorDetachWindow { nullptr };
280     RefPtr<WebView> m_inspectorView;
281 #endif
282 };
283
284 } // namespace WebKit