b56debf53b15b64480ec648e7f77e69914c0924c
[WebKit-https.git] / Source / WebKit2 / UIProcess / PageClient.h
1 /*
2  * Copyright (C) 2010-2016 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 #pragma once
27
28 #include "ShareableBitmap.h"
29 #include "WebColorPicker.h"
30 #include "WebPageProxy.h"
31 #include "WebPopupMenuProxy.h"
32 #include <WebCore/AlternativeTextClient.h>
33 #include <WebCore/EditorClient.h>
34 #include <WebCore/UserInterfaceLayoutDirection.h>
35 #include <WebCore/ValidationBubble.h>
36 #include <wtf/Forward.h>
37
38 #if PLATFORM(COCOA)
39 #include "PluginComplexTextInputState.h"
40
41 OBJC_CLASS CALayer;
42
43 #if USE(APPKIT)
44 OBJC_CLASS WKView;
45 OBJC_CLASS NSTextAlternatives;
46 #endif
47 #endif
48
49 namespace WebCore {
50 class Cursor;
51 class TextIndicator;
52 class WebMediaSessionManager;
53 enum class TextIndicatorWindowLifetime : uint8_t;
54 enum class TextIndicatorWindowDismissalAnimation : uint8_t;
55 struct Highlight;
56 struct ViewportAttributes;
57 }
58
59 namespace WebKit {
60
61 class DrawingAreaProxy;
62 class NativeWebKeyboardEvent;
63 class NativeWebMouseEvent;
64 class RemoteLayerTreeTransaction;
65 class ViewSnapshot;
66 class WebContextMenuProxy;
67 class WebEditCommandProxy;
68 class WebPopupMenuProxy;
69
70 #if ENABLE(TOUCH_EVENTS)
71 class NativeWebTouchEvent;
72 #endif
73
74 #if ENABLE(INPUT_TYPE_COLOR)
75 class WebColorPicker;
76 #endif
77
78 #if ENABLE(FULLSCREEN_API)
79 class WebFullScreenManagerProxyClient;
80 #endif
81
82 #if USE(GSTREAMER)
83 class InstallMissingMediaPluginsPermissionRequest;
84 #endif
85
86 #if PLATFORM(COCOA)
87 struct ColorSpaceData;
88 #endif
89
90 class PageClient {
91 public:
92     virtual ~PageClient() { }
93
94     // Create a new drawing area proxy for the given page.
95     virtual std::unique_ptr<DrawingAreaProxy> createDrawingAreaProxy() = 0;
96
97     // Tell the view to invalidate the given region. The region is in view coordinates.
98     virtual void setViewNeedsDisplay(const WebCore::Region&) = 0;
99
100     // Tell the view to scroll to the given position, and whether this was a programmatic scroll.
101     virtual void requestScroll(const WebCore::FloatPoint& scrollPosition, const WebCore::IntPoint& scrollOrigin, bool isProgrammaticScroll) = 0;
102
103     // Return the current scroll position (not necessarily the same as the WebCore scroll position, because of scaling, insets etc.)
104     virtual WebCore::FloatPoint viewScrollPosition() = 0;
105
106     // Return the size of the view the page is associated with.
107     virtual WebCore::IntSize viewSize() = 0;
108
109     // Return whether the view's containing window is active.
110     virtual bool isViewWindowActive() = 0;
111
112     // Return whether the view is focused.
113     virtual bool isViewFocused() = 0;
114
115     // Return whether the view is visible.
116     virtual bool isViewVisible() = 0;
117
118     // Return whether the view is visible, or occluded by another window.
119     virtual bool isViewVisibleOrOccluded() { return isViewVisible(); }
120
121     // Return whether the view is in a window.
122     virtual bool isViewInWindow() = 0;
123
124     // Return whether the view is visually idle.
125     virtual bool isVisuallyIdle() { return !isViewVisible(); }
126
127     // Return the layer hosting mode for the view.
128     virtual LayerHostingMode viewLayerHostingMode() { return LayerHostingMode::InProcess; }
129
130     virtual void processDidExit() = 0;
131     virtual void didRelaunchProcess() = 0;
132     virtual void pageClosed() = 0;
133
134     virtual void preferencesDidChange() = 0;
135
136     virtual void toolTipChanged(const String&, const String&) = 0;
137
138     virtual bool decidePolicyForGeolocationPermissionRequest(WebFrameProxy&, API::SecurityOrigin&, GeolocationPermissionRequestProxy&)
139     {
140         return false;
141     }
142
143     virtual void didStartProvisionalLoadForMainFrame() { };
144     virtual void didFailProvisionalLoadForMainFrame() { };
145     virtual void didCommitLoadForMainFrame(const String& mimeType, bool useCustomContentProvider) = 0;
146
147 #if USE(COORDINATED_GRAPHICS_MULTIPROCESS)
148     virtual void pageDidRequestScroll(const WebCore::IntPoint&) = 0;
149     virtual void didRenderFrame(const WebCore::IntSize& contentsSize, const WebCore::IntRect& coveredRect) = 0;
150     virtual void pageTransitionViewportReady() = 0;
151     virtual void didFindZoomableArea(const WebCore::IntPoint&, const WebCore::IntRect&) = 0;
152 #endif
153
154     virtual void handleDownloadRequest(DownloadProxy*) = 0;
155
156     virtual bool handleRunOpenPanel(WebPageProxy*, WebFrameProxy*, API::OpenPanelParameters*, WebOpenPanelResultListenerProxy*) { return false; }
157
158     virtual void didChangeContentSize(const WebCore::IntSize&) = 0;
159
160 #if PLATFORM(GTK) && ENABLE(DRAG_SUPPORT)
161     virtual void startDrag(Ref<WebCore::SelectionData>&&, WebCore::DragOperation, RefPtr<ShareableBitmap>&& dragImage) = 0;
162 #endif
163
164     virtual void setCursor(const WebCore::Cursor&) = 0;
165     virtual void setCursorHiddenUntilMouseMoves(bool) = 0;
166     virtual void didChangeViewportProperties(const WebCore::ViewportAttributes&) = 0;
167
168     virtual void registerEditCommand(PassRefPtr<WebEditCommandProxy>, WebPageProxy::UndoOrRedo) = 0;
169     virtual void clearAllEditCommands() = 0;
170     virtual bool canUndoRedo(WebPageProxy::UndoOrRedo) = 0;
171     virtual void executeUndoRedo(WebPageProxy::UndoOrRedo) = 0;
172     virtual void wheelEventWasNotHandledByWebCore(const NativeWebWheelEvent&) = 0;
173 #if PLATFORM(COCOA)
174     virtual void accessibilityWebProcessTokenReceived(const IPC::DataReference&) = 0;
175     virtual bool executeSavedCommandBySelector(const String& selector) = 0;
176     virtual void setDragImage(const WebCore::IntPoint& clientPosition, PassRefPtr<ShareableBitmap> dragImage, WebCore::DragSourceAction) = 0;
177     virtual void updateSecureInputState() = 0;
178     virtual void resetSecureInputState() = 0;
179     virtual void notifyInputContextAboutDiscardedComposition() = 0;
180     virtual void makeFirstResponder() = 0;
181     virtual void setAcceleratedCompositingRootLayer(LayerOrView *) = 0;
182     virtual LayerOrView *acceleratedCompositingRootLayer() const = 0;
183     virtual PassRefPtr<ViewSnapshot> takeViewSnapshot() = 0;
184 #if ENABLE(MAC_GESTURE_EVENTS)
185     virtual void gestureEventWasNotHandledByWebCore(const NativeWebGestureEvent&) = 0;
186 #endif
187 #endif
188
189 #if PLATFORM(COCOA) || PLATFORM(GTK)
190     virtual void selectionDidChange() = 0;
191 #endif
192
193 #if USE(APPKIT)
194     virtual void setPromisedDataForImage(const String& pasteboardName, PassRefPtr<WebCore::SharedBuffer> imageBuffer, const String& filename, const String& extension, const String& title,
195                                  const String& url, const String& visibleUrl, PassRefPtr<WebCore::SharedBuffer> archiveBuffer) = 0;
196 #if ENABLE(ATTACHMENT_ELEMENT)
197     virtual void setPromisedDataForAttachment(const String& pasteboardName, const String& filename, const String& extension, const String& title,
198                                          const String& url, const String& visibleUrl) = 0;
199
200 #endif
201 #endif
202
203     virtual WebCore::FloatRect convertToDeviceSpace(const WebCore::FloatRect&) = 0;
204     virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&) = 0;
205     virtual WebCore::IntPoint screenToRootView(const WebCore::IntPoint&) = 0;
206     virtual WebCore::IntRect rootViewToScreen(const WebCore::IntRect&) = 0;
207 #if PLATFORM(MAC)
208     virtual WebCore::IntRect rootViewToWindow(const WebCore::IntRect&) = 0;
209 #endif
210 #if PLATFORM(IOS)
211     virtual WebCore::IntPoint accessibilityScreenToRootView(const WebCore::IntPoint&) = 0;
212     virtual WebCore::IntRect rootViewToAccessibilityScreen(const WebCore::IntRect&) = 0;
213     virtual void didNotHandleTapAsClick(const WebCore::IntPoint&) = 0;
214     virtual void didCompleteSyntheticClick() = 0;
215 #endif
216     
217     virtual void doneWithKeyEvent(const NativeWebKeyboardEvent&, bool wasEventHandled) = 0;
218 #if ENABLE(TOUCH_EVENTS)
219     virtual void doneWithTouchEvent(const NativeWebTouchEvent&, bool wasEventHandled) = 0;
220 #endif
221
222     virtual RefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy&) = 0;
223 #if ENABLE(CONTEXT_MENUS)
224     virtual std::unique_ptr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy&, const ContextMenuContextData&, const UserData&) = 0;
225 #endif
226
227 #if ENABLE(INPUT_TYPE_COLOR)
228     virtual RefPtr<WebColorPicker> createColorPicker(WebPageProxy*, const WebCore::Color& initialColor, const WebCore::IntRect&) = 0;
229 #endif
230
231 #if PLATFORM(COCOA)
232     virtual Ref<WebCore::ValidationBubble> createValidationBubble(const String& message, const WebCore::ValidationBubble::Settings&) = 0;
233 #endif
234
235 #if PLATFORM(COCOA)
236     virtual void setTextIndicator(Ref<WebCore::TextIndicator>, WebCore::TextIndicatorWindowLifetime) = 0;
237     virtual void clearTextIndicator(WebCore::TextIndicatorWindowDismissalAnimation) = 0;
238     virtual void setTextIndicatorAnimationProgress(float) = 0;
239 #endif
240
241     virtual void enterAcceleratedCompositingMode(const LayerTreeContext&) = 0;
242     virtual void exitAcceleratedCompositingMode() = 0;
243     virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) = 0;
244
245 #if PLATFORM(MAC)
246     virtual void pluginFocusOrWindowFocusChanged(uint64_t pluginComplexTextInputIdentifier, bool pluginHasFocusAndWindowHasFocus) = 0;
247     virtual void setPluginComplexTextInputState(uint64_t pluginComplexTextInputIdentifier, PluginComplexTextInputState) = 0;
248     virtual void didPerformDictionaryLookup(const WebCore::DictionaryPopupInfo&) = 0;
249     virtual void dismissContentRelativeChildWindows(bool withAnimation = true) = 0;
250     virtual void showCorrectionPanel(WebCore::AlternativeTextType, const WebCore::FloatRect& boundingBoxOfReplacedString, const String& replacedString, const String& replacementString, const Vector<String>& alternativeReplacementStrings) = 0;
251     virtual void dismissCorrectionPanel(WebCore::ReasonForDismissingAlternativeText) = 0;
252     virtual String dismissCorrectionPanelSoon(WebCore::ReasonForDismissingAlternativeText) = 0;
253     virtual void recordAutocorrectionResponse(WebCore::AutocorrectionResponse, const String& replacedString, const String& replacementString) = 0;
254     virtual void recommendedScrollbarStyleDidChange(WebCore::ScrollbarStyle) = 0;
255     virtual void handleControlledElementIDResponse(const String&) = 0;
256
257     virtual CGRect boundsOfLayerInLayerBackedWindowCoordinates(CALayer *) const = 0;
258
259     virtual ColorSpaceData colorSpace() = 0;
260
261     virtual void showPlatformContextMenu(NSMenu *, WebCore::IntPoint) = 0;
262
263     virtual void startWindowDrag() = 0;
264     virtual NSWindow *platformWindow() = 0;
265
266 #if WK_API_ENABLED
267     virtual NSView *inspectorAttachmentView() = 0;
268     virtual _WKRemoteObjectRegistry *remoteObjectRegistry() = 0;
269 #endif
270
271 #if USE(APPKIT)
272     virtual void intrinsicContentSizeDidChange(const WebCore::IntSize& intrinsicContentSize) = 0;
273 #if USE(DICTATION_ALTERNATIVES)
274     virtual uint64_t addDictationAlternatives(const RetainPtr<NSTextAlternatives>&) = 0;
275     virtual void removeDictationAlternatives(uint64_t dictationContext) = 0;
276     virtual void showDictationAlternativeUI(const WebCore::FloatRect& boundingBoxOfDictatedText, uint64_t dictationContext) = 0;
277     virtual Vector<String> dictationAlternatives(uint64_t dictationContext) = 0;
278 #endif // USE(DICTATION_ALTERNATIVES)
279 #if USE(INSERTION_UNDO_GROUPING)
280     virtual void registerInsertionUndoGrouping() = 0;
281 #endif // USE(INSERTION_UNDO_GROUPING)
282 #endif // USE(APPKIT)
283     virtual void setEditableElementIsFocused(bool) = 0;
284 #endif // PLATFORM(MAC)
285
286 #if PLATFORM(COCOA)
287     virtual void handleActiveNowPlayingSessionInfoResponse(bool hasActiveSession, const String& title, double duration, double elapsedTime) = 0;
288 #endif
289
290 #if PLATFORM(IOS)
291     virtual void commitPotentialTapFailed() = 0;
292     virtual void didGetTapHighlightGeometries(uint64_t requestID, const WebCore::Color&, const Vector<WebCore::FloatQuad>& highlightedQuads, const WebCore::IntSize& topLeftRadius, const WebCore::IntSize& topRightRadius, const WebCore::IntSize& bottomLeftRadius, const WebCore::IntSize& bottomRightRadius) = 0;
293
294     virtual void didCommitLayerTree(const RemoteLayerTreeTransaction&) = 0;
295     virtual void layerTreeCommitComplete() = 0;
296
297     virtual void dynamicViewportUpdateChangedTarget(double newScale, const WebCore::FloatPoint& newScrollPosition, uint64_t transactionID) = 0;
298     virtual void couldNotRestorePageState() = 0;
299     virtual void restorePageState(std::optional<WebCore::FloatPoint> scrollPosition, const WebCore::FloatPoint& scrollOrigin, const WebCore::FloatSize& obscuredInsetOnSave, double scale) = 0;
300     virtual void restorePageCenterAndScale(std::optional<WebCore::FloatPoint> center, double scale) = 0;
301
302     virtual void startAssistingNode(const AssistedNodeInformation&, bool userIsInteracting, bool blurPreviousNode, API::Object* userData) = 0;
303     virtual void stopAssistingNode() = 0;
304     virtual bool isAssistingNode() = 0;
305     virtual bool interpretKeyEvent(const NativeWebKeyboardEvent&, bool isCharEvent) = 0;
306     virtual void positionInformationDidChange(const InteractionInformationAtPosition&) = 0;
307     virtual void saveImageToLibrary(PassRefPtr<WebCore::SharedBuffer>) = 0;
308     virtual void didUpdateBlockSelectionWithTouch(uint32_t touch, uint32_t flags, float growThreshold, float shrinkThreshold) = 0;
309     virtual void showPlaybackTargetPicker(bool hasVideo, const WebCore::IntRect& elementRect) = 0;
310     virtual void disableDoubleTapGesturesDuringTapIfNecessary(uint64_t requestID) = 0;
311     virtual double minimumZoomScale() const = 0;
312     virtual WebCore::FloatRect documentRect() const = 0;
313     virtual void overflowScrollViewWillStartPanGesture() = 0;
314     virtual void overflowScrollViewDidScroll() = 0;
315     virtual void overflowScrollWillStartScroll() = 0;
316     virtual void overflowScrollDidEndScroll() = 0;
317     virtual Vector<String> mimeTypesWithCustomContentProviders() = 0;
318
319     virtual void showInspectorHighlight(const WebCore::Highlight&) = 0;
320     virtual void hideInspectorHighlight() = 0;
321
322     virtual void showInspectorIndication() = 0;
323     virtual void hideInspectorIndication() = 0;
324
325     virtual void enableInspectorNodeSearch() = 0;
326     virtual void disableInspectorNodeSearch() = 0;
327 #endif
328
329     // Auxiliary Client Creation
330 #if ENABLE(FULLSCREEN_API)
331     virtual WebFullScreenManagerProxyClient& fullScreenManagerProxyClient() = 0;
332 #endif
333
334     // Custom representations.
335     virtual void didFinishLoadingDataForCustomContentProvider(const String& suggestedFilename, const IPC::DataReference&) = 0;
336
337     virtual void navigationGestureDidBegin() = 0;
338     virtual void navigationGestureWillEnd(bool willNavigate, WebBackForwardListItem&) = 0;
339     virtual void navigationGestureDidEnd(bool willNavigate, WebBackForwardListItem&) = 0;
340     virtual void navigationGestureDidEnd() = 0;
341     virtual void willRecordNavigationSnapshot(WebBackForwardListItem&) = 0;
342     virtual void didRemoveNavigationGestureSnapshot() = 0;
343
344     virtual void didFirstVisuallyNonEmptyLayoutForMainFrame() = 0;
345     virtual void didFinishLoadForMainFrame() = 0;
346     virtual void didFailLoadForMainFrame() = 0;
347     virtual void didSameDocumentNavigationForMainFrame(SameDocumentNavigationType) = 0;
348
349     virtual void didChangeBackgroundColor() = 0;
350
351 #if PLATFORM(MAC)
352     virtual void didPerformImmediateActionHitTest(const WebHitTestResultData&, bool contentPreventsDefault, API::Object*) = 0;
353
354     virtual void* immediateActionAnimationControllerForHitTestResult(RefPtr<API::HitTestResult>, uint64_t, RefPtr<API::Object>) = 0;
355
356     virtual void didHandleAcceptedCandidate() = 0;
357
358     virtual void videoControlsManagerDidChange() = 0;
359 #endif
360
361 #if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
362     virtual WebCore::WebMediaSessionManager& mediaSessionManager() = 0;
363 #endif
364
365     virtual void refView() = 0;
366     virtual void derefView() = 0;
367
368 #if ENABLE(VIDEO) && USE(GSTREAMER)
369     virtual bool decidePolicyForInstallMissingMediaPluginsPermissionRequest(InstallMissingMediaPluginsPermissionRequest&) = 0;
370 #endif
371
372     virtual void didRestoreScrollPosition() = 0;
373
374     virtual bool windowIsFrontWindowUnderMouse(const NativeWebMouseEvent&) { return false; }
375
376     virtual WebCore::UserInterfaceLayoutDirection userInterfaceLayoutDirection() = 0;
377
378 #if USE(QUICK_LOOK)
379     virtual void requestPasswordForQuickLookDocument(const String& fileName, std::function<void(const String&)>&&) = 0;
380 #endif
381
382 #if ENABLE(DATA_INTERACTION)
383     virtual void didPerformDataInteractionControllerOperation() = 0;
384     virtual void didHandleStartDataInteractionRequest(bool started) = 0;
385     virtual void startDataInteractionWithImage(const WebCore::IntPoint& clientPosition, const ShareableBitmap::Handle& image, std::optional<WebCore::TextIndicatorData>, const WebCore::FloatPoint& anchorPoint, uint64_t action) = 0;
386     virtual void didConcludeEditDataInteraction(std::optional<WebCore::TextIndicatorData>) = 0;
387     virtual void didChangeDataInteractionCaretRect(const WebCore::IntRect& previousCaretRect, const WebCore::IntRect& caretRect) = 0;
388 #endif
389 };
390
391 } // namespace WebKit