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