2b71abefa7c97f3abcdedbed2c4adde8ebc306cd
[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 "LayerTreeContext.h"
29 #include "SameDocumentNavigationType.h"
30 #include "ShareableBitmap.h"
31 #include "WebColorPicker.h"
32 #include "WebDataListSuggestionsDropdown.h"
33 #include "WebPopupMenuProxy.h"
34 #include <WebCore/AlternativeTextClient.h>
35 #include <WebCore/EditorClient.h>
36 #include <WebCore/FocusDirection.h>
37 #include <WebCore/InputMode.h>
38 #include <WebCore/UserInterfaceLayoutDirection.h>
39 #include <WebCore/ValidationBubble.h>
40 #include <wtf/CompletionHandler.h>
41 #include <wtf/Forward.h>
42 #include <wtf/URL.h>
43 #include <wtf/Variant.h>
44 #include <wtf/WeakPtr.h>
45
46 #if PLATFORM(COCOA)
47 #include "PluginComplexTextInputState.h"
48 #include "RemoteLayerTreeNode.h"
49 #include "WKFoundation.h"
50
51 OBJC_CLASS CALayer;
52 OBJC_CLASS NSFileWrapper;
53 OBJC_CLASS NSMenu;
54 OBJC_CLASS NSSet;
55 OBJC_CLASS WKDrawingView;
56 OBJC_CLASS _WKRemoteObjectRegistry;
57
58 #if USE(APPKIT)
59 OBJC_CLASS WKView;
60 OBJC_CLASS NSTextAlternatives;
61 #endif
62 #endif
63
64 namespace API {
65 class Attachment;
66 class HitTestResult;
67 class Object;
68 class OpenPanelParameters;
69 class SecurityOrigin;
70 }
71
72 namespace IPC {
73 class DataReference;
74 }
75
76 namespace WebCore {
77 class Color;
78 class Cursor;
79 class FloatQuad;
80 class Region;
81 class TextIndicator;
82 class WebMediaSessionManager;
83
84 enum class RouteSharingPolicy : uint8_t;
85 enum class ScrollbarStyle;
86 enum class TextIndicatorWindowLifetime : uint8_t;
87 enum class TextIndicatorWindowDismissalAnimation : uint8_t;
88
89 struct DictionaryPopupInfo;
90 struct Highlight;
91 struct TextIndicatorData;
92 struct ViewportAttributes;
93 struct ShareDataWithParsedURL;
94
95 template <typename> class RectEdges;
96 using FloatBoxExtent = RectEdges<float>;
97 }
98
99 #if ENABLE(DRAG_SUPPORT)
100 namespace WebCore {
101 struct DragItem;
102 }
103 #endif
104
105 namespace WebKit {
106
107 enum class UndoOrRedo : bool;
108
109 class ContextMenuContextData;
110 class DownloadProxy;
111 class DrawingAreaProxy;
112 class NativeWebGestureEvent;
113 class NativeWebKeyboardEvent;
114 class NativeWebMouseEvent;
115 class NativeWebWheelEvent;
116 class RemoteLayerTreeTransaction;
117 class SafeBrowsingWarning;
118 class UserData;
119 class ViewSnapshot;
120 class WebBackForwardListItem;
121 class WebContextMenuProxy;
122 class WebEditCommandProxy;
123 class WebFrameProxy;
124 class WebOpenPanelResultListenerProxy;
125 class WebPageProxy;
126 class WebPopupMenuProxy;
127 class WebProcessProxy;
128
129 enum class ContinueUnsafeLoad : bool { No, Yes };
130
131 struct FocusedElementInformation;
132 struct InteractionInformationAtPosition;
133 struct WebHitTestResultData;
134
135 #if ENABLE(TOUCH_EVENTS)
136 class NativeWebTouchEvent;
137 #endif
138
139 #if ENABLE(INPUT_TYPE_COLOR)
140 class WebColorPicker;
141 #endif
142
143 #if ENABLE(DATALIST_ELEMENT)
144 class WebDataListSuggestionsDropdown;
145 #endif
146
147 #if ENABLE(FULLSCREEN_API)
148 class WebFullScreenManagerProxyClient;
149 #endif
150
151 #if USE(GSTREAMER)
152 class InstallMissingMediaPluginsPermissionRequest;
153 #endif
154
155 #if PLATFORM(COCOA)
156 struct ColorSpaceData;
157 #endif
158
159 class PageClient : public CanMakeWeakPtr<PageClient> {
160 public:
161     virtual ~PageClient() { }
162
163     // Create a new drawing area proxy for the given page.
164     virtual std::unique_ptr<DrawingAreaProxy> createDrawingAreaProxy(WebProcessProxy&) = 0;
165
166     // Tell the view to invalidate the given region. The region is in view coordinates.
167     virtual void setViewNeedsDisplay(const WebCore::Region&) = 0;
168
169     // Tell the view to scroll to the given position, and whether this was a programmatic scroll.
170     virtual void requestScroll(const WebCore::FloatPoint& scrollPosition, const WebCore::IntPoint& scrollOrigin, bool isProgrammaticScroll) = 0;
171
172     // Return the current scroll position (not necessarily the same as the WebCore scroll position, because of scaling, insets etc.)
173     virtual WebCore::FloatPoint viewScrollPosition() = 0;
174
175     // Return the size of the view the page is associated with.
176     virtual WebCore::IntSize viewSize() = 0;
177
178     // Return whether the view's containing window is active.
179     virtual bool isViewWindowActive() = 0;
180
181     // Return whether the view is focused.
182     virtual bool isViewFocused() = 0;
183
184     // Return whether the view is visible.
185     virtual bool isViewVisible() = 0;
186
187     // Return whether the view is visible, or occluded by another window.
188     virtual bool isViewVisibleOrOccluded() { return isViewVisible(); }
189
190     // Return whether the view is in a window.
191     virtual bool isViewInWindow() = 0;
192
193     // Return whether the view is visually idle.
194     virtual bool isVisuallyIdle() { return !isViewVisible(); }
195
196     // Return the layer hosting mode for the view.
197     virtual LayerHostingMode viewLayerHostingMode() { return LayerHostingMode::InProcess; }
198
199     virtual void processDidExit() = 0;
200     virtual void processWillSwap() { processDidExit(); }
201     virtual void didRelaunchProcess() = 0;
202     virtual void pageClosed() = 0;
203
204     virtual void preferencesDidChange() = 0;
205
206     virtual void toolTipChanged(const String&, const String&) = 0;
207
208 #if PLATFORM(IOS_FAMILY)
209     // FIXME: Adopt the WKUIDelegatePrivate callback on iOS and remove this.
210     virtual void decidePolicyForGeolocationPermissionRequest(WebFrameProxy&, API::SecurityOrigin&, Function<void(bool)>&) = 0;
211 #endif
212
213     virtual void didStartProvisionalLoadForMainFrame() { };
214     virtual void didFailProvisionalLoadForMainFrame() { };
215     virtual void didCommitLoadForMainFrame(const String& mimeType, bool useCustomContentProvider) = 0;
216
217     virtual void handleDownloadRequest(DownloadProxy*) = 0;
218
219     virtual bool handleRunOpenPanel(WebPageProxy*, WebFrameProxy*, API::OpenPanelParameters*, WebOpenPanelResultListenerProxy*) { return false; }
220     virtual bool showShareSheet(const WebCore::ShareDataWithParsedURL&, WTF::CompletionHandler<void (bool)>&&) { return false; }
221
222     virtual void didChangeContentSize(const WebCore::IntSize&) = 0;
223
224     virtual void showSafeBrowsingWarning(const SafeBrowsingWarning&, CompletionHandler<void(Variant<ContinueUnsafeLoad, URL>&&)>&& completionHandler) { completionHandler(ContinueUnsafeLoad::Yes); }
225     virtual void clearSafeBrowsingWarning() { }
226     virtual void clearSafeBrowsingWarningIfForMainFrameNavigation() { }
227     
228 #if ENABLE(DRAG_SUPPORT)
229 #if PLATFORM(GTK)
230     virtual void startDrag(Ref<WebCore::SelectionData>&&, WebCore::DragOperation, RefPtr<ShareableBitmap>&& dragImage) = 0;
231 #else
232     virtual void startDrag(const WebCore::DragItem&, const ShareableBitmap::Handle&) { }
233 #endif
234     virtual void didPerformDragOperation(bool) { }
235 #endif // ENABLE(DRAG_SUPPORT)
236
237     virtual void setCursor(const WebCore::Cursor&) = 0;
238     virtual void setCursorHiddenUntilMouseMoves(bool) = 0;
239     virtual void didChangeViewportProperties(const WebCore::ViewportAttributes&) = 0;
240
241     virtual void registerEditCommand(Ref<WebEditCommandProxy>&&, UndoOrRedo) = 0;
242     virtual void clearAllEditCommands() = 0;
243     virtual bool canUndoRedo(UndoOrRedo) = 0;
244     virtual void executeUndoRedo(UndoOrRedo) = 0;
245     virtual void wheelEventWasNotHandledByWebCore(const NativeWebWheelEvent&) = 0;
246 #if PLATFORM(COCOA)
247     virtual void accessibilityWebProcessTokenReceived(const IPC::DataReference&) = 0;
248     virtual bool executeSavedCommandBySelector(const String& selector) = 0;
249     virtual void updateSecureInputState() = 0;
250     virtual void resetSecureInputState() = 0;
251     virtual void notifyInputContextAboutDiscardedComposition() = 0;
252     virtual void makeFirstResponder() = 0;
253     virtual void assistiveTechnologyMakeFirstResponder() = 0;
254     virtual void setRemoteLayerTreeRootNode(RemoteLayerTreeNode*) = 0;
255     virtual CALayer *acceleratedCompositingRootLayer() const = 0;
256     virtual RefPtr<ViewSnapshot> takeViewSnapshot() = 0;
257 #if ENABLE(MAC_GESTURE_EVENTS)
258     virtual void gestureEventWasNotHandledByWebCore(const NativeWebGestureEvent&) = 0;
259 #endif
260 #endif
261
262 #if PLATFORM(COCOA) || PLATFORM(GTK)
263     virtual void selectionDidChange() = 0;
264 #endif
265
266 #if USE(APPKIT)
267     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;
268 #endif
269
270     virtual WebCore::FloatRect convertToDeviceSpace(const WebCore::FloatRect&) = 0;
271     virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&) = 0;
272     virtual WebCore::IntPoint screenToRootView(const WebCore::IntPoint&) = 0;
273     virtual WebCore::IntRect rootViewToScreen(const WebCore::IntRect&) = 0;
274 #if PLATFORM(MAC)
275     virtual WebCore::IntRect rootViewToWindow(const WebCore::IntRect&) = 0;
276 #endif
277 #if PLATFORM(IOS_FAMILY)
278     virtual WebCore::IntPoint accessibilityScreenToRootView(const WebCore::IntPoint&) = 0;
279     virtual WebCore::IntRect rootViewToAccessibilityScreen(const WebCore::IntRect&) = 0;
280     virtual void didNotHandleTapAsClick(const WebCore::IntPoint&) = 0;
281     virtual void didCompleteSyntheticClick() = 0;
282 #endif
283     
284     virtual void doneWithKeyEvent(const NativeWebKeyboardEvent&, bool wasEventHandled) = 0;
285 #if ENABLE(TOUCH_EVENTS)
286     virtual void doneWithTouchEvent(const NativeWebTouchEvent&, bool wasEventHandled) = 0;
287 #endif
288
289     virtual RefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy&) = 0;
290 #if ENABLE(CONTEXT_MENUS)
291     virtual Ref<WebContextMenuProxy> createContextMenuProxy(WebPageProxy&, ContextMenuContextData&&, const UserData&) = 0;
292 #endif
293
294 #if ENABLE(INPUT_TYPE_COLOR)
295     virtual RefPtr<WebColorPicker> createColorPicker(WebPageProxy*, const WebCore::Color& initialColor, const WebCore::IntRect&, Vector<WebCore::Color>&&) = 0;
296 #endif
297
298 #if ENABLE(DATALIST_ELEMENT)
299     virtual RefPtr<WebDataListSuggestionsDropdown> createDataListSuggestionsDropdown(WebPageProxy&) = 0;
300 #endif
301
302 #if PLATFORM(COCOA)
303     virtual Ref<WebCore::ValidationBubble> createValidationBubble(const String& message, const WebCore::ValidationBubble::Settings&) = 0;
304 #endif
305
306 #if PLATFORM(COCOA)
307     virtual void setTextIndicator(Ref<WebCore::TextIndicator>, WebCore::TextIndicatorWindowLifetime) = 0;
308     virtual void clearTextIndicator(WebCore::TextIndicatorWindowDismissalAnimation) = 0;
309     virtual void setTextIndicatorAnimationProgress(float) = 0;
310     
311     virtual void didPerformDictionaryLookup(const WebCore::DictionaryPopupInfo&) = 0;
312 #endif
313
314     virtual void enterAcceleratedCompositingMode(const LayerTreeContext&) = 0;
315     virtual void exitAcceleratedCompositingMode() = 0;
316     virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) = 0;
317
318     virtual void takeFocus(WebCore::FocusDirection) { }
319
320 #if PLATFORM(MAC)
321     virtual void pluginFocusOrWindowFocusChanged(uint64_t pluginComplexTextInputIdentifier, bool pluginHasFocusAndWindowHasFocus) = 0;
322     virtual void setPluginComplexTextInputState(uint64_t pluginComplexTextInputIdentifier, PluginComplexTextInputState) = 0;
323     virtual void showCorrectionPanel(WebCore::AlternativeTextType, const WebCore::FloatRect& boundingBoxOfReplacedString, const String& replacedString, const String& replacementString, const Vector<String>& alternativeReplacementStrings) = 0;
324     virtual void dismissCorrectionPanel(WebCore::ReasonForDismissingAlternativeText) = 0;
325     virtual String dismissCorrectionPanelSoon(WebCore::ReasonForDismissingAlternativeText) = 0;
326     virtual void recordAutocorrectionResponse(WebCore::AutocorrectionResponse, const String& replacedString, const String& replacementString) = 0;
327     virtual void recommendedScrollbarStyleDidChange(WebCore::ScrollbarStyle) = 0;
328     virtual void handleControlledElementIDResponse(const String&) = 0;
329
330     virtual CGRect boundsOfLayerInLayerBackedWindowCoordinates(CALayer *) const = 0;
331
332     virtual ColorSpaceData colorSpace() = 0;
333
334     virtual void showPlatformContextMenu(NSMenu *, WebCore::IntPoint) = 0;
335
336     virtual void startWindowDrag() = 0;
337     virtual NSWindow *platformWindow() = 0;
338     virtual void setShouldSuppressFirstResponderChanges(bool) = 0;
339
340     virtual bool effectiveAppearanceIsDark() const = 0;
341
342 #if WK_API_ENABLED
343     virtual NSView *inspectorAttachmentView() = 0;
344     virtual _WKRemoteObjectRegistry *remoteObjectRegistry() = 0;
345 #endif
346
347 #if USE(APPKIT)
348     virtual void intrinsicContentSizeDidChange(const WebCore::IntSize& intrinsicContentSize) = 0;
349 #if USE(DICTATION_ALTERNATIVES)
350     virtual uint64_t addDictationAlternatives(const RetainPtr<NSTextAlternatives>&) = 0;
351     virtual void removeDictationAlternatives(uint64_t dictationContext) = 0;
352     virtual void showDictationAlternativeUI(const WebCore::FloatRect& boundingBoxOfDictatedText, uint64_t dictationContext) = 0;
353     virtual Vector<String> dictationAlternatives(uint64_t dictationContext) = 0;
354 #endif // USE(DICTATION_ALTERNATIVES)
355 #if USE(INSERTION_UNDO_GROUPING)
356     virtual void registerInsertionUndoGrouping() = 0;
357 #endif // USE(INSERTION_UNDO_GROUPING)
358 #endif // USE(APPKIT)
359     virtual void setEditableElementIsFocused(bool) = 0;
360 #endif // PLATFORM(MAC)
361
362 #if PLATFORM(IOS_FAMILY)
363     virtual void commitPotentialTapFailed() = 0;
364     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, bool nodeHasBuiltInClickHandling) = 0;
365
366     virtual void didCommitLayerTree(const RemoteLayerTreeTransaction&) = 0;
367     virtual void layerTreeCommitComplete() = 0;
368
369     virtual void couldNotRestorePageState() = 0;
370     virtual void restorePageState(Optional<WebCore::FloatPoint> scrollPosition, const WebCore::FloatPoint& scrollOrigin, const WebCore::FloatBoxExtent& obscuredInsetsOnSave, double scale) = 0;
371     virtual void restorePageCenterAndScale(Optional<WebCore::FloatPoint> center, double scale) = 0;
372
373     virtual void elementDidFocus(const FocusedElementInformation&, bool userIsInteracting, bool blurPreviousNode, bool changingActivityState, API::Object* userData) = 0;
374     virtual void elementDidBlur() = 0;
375     virtual void focusedElementDidChangeInputMode(WebCore::InputMode) = 0;
376     virtual void didReceiveEditorStateUpdateAfterFocus() = 0;
377     virtual bool isFocusingElement() = 0;
378     virtual bool interpretKeyEvent(const NativeWebKeyboardEvent&, bool isCharEvent) = 0;
379     virtual void positionInformationDidChange(const InteractionInformationAtPosition&) = 0;
380     virtual void saveImageToLibrary(Ref<WebCore::SharedBuffer>&&) = 0;
381     virtual void showPlaybackTargetPicker(bool hasVideo, const WebCore::IntRect& elementRect, WebCore::RouteSharingPolicy, const String&) = 0;
382     virtual void disableDoubleTapGesturesDuringTapIfNecessary(uint64_t requestID) = 0;
383     virtual double minimumZoomScale() const = 0;
384     virtual WebCore::FloatRect documentRect() const = 0;
385     virtual void scrollingNodeScrollViewWillStartPanGesture() = 0;
386     virtual void scrollingNodeScrollViewDidScroll() = 0;
387     virtual void scrollingNodeScrollWillStartScroll() = 0;
388     virtual void scrollingNodeScrollDidEndScroll() = 0;
389     virtual Vector<String> mimeTypesWithCustomContentProviders() = 0;
390
391     virtual void showInspectorHighlight(const WebCore::Highlight&) = 0;
392     virtual void hideInspectorHighlight() = 0;
393
394     virtual void showInspectorIndication() = 0;
395     virtual void hideInspectorIndication() = 0;
396
397     virtual void enableInspectorNodeSearch() = 0;
398     virtual void disableInspectorNodeSearch() = 0;
399 #endif
400
401     // Auxiliary Client Creation
402 #if ENABLE(FULLSCREEN_API)
403     virtual WebFullScreenManagerProxyClient& fullScreenManagerProxyClient() = 0;
404 #endif
405
406     // Custom representations.
407     virtual void didFinishLoadingDataForCustomContentProvider(const String& suggestedFilename, const IPC::DataReference&) = 0;
408
409     virtual void navigationGestureDidBegin() = 0;
410     virtual void navigationGestureWillEnd(bool willNavigate, WebBackForwardListItem&) = 0;
411     virtual void navigationGestureDidEnd(bool willNavigate, WebBackForwardListItem&) = 0;
412     virtual void navigationGestureDidEnd() = 0;
413     virtual void willRecordNavigationSnapshot(WebBackForwardListItem&) = 0;
414     virtual void didRemoveNavigationGestureSnapshot() = 0;
415
416     virtual void didFirstVisuallyNonEmptyLayoutForMainFrame() = 0;
417     virtual void didFinishLoadForMainFrame() = 0;
418     virtual void didFailLoadForMainFrame() = 0;
419     virtual void didSameDocumentNavigationForMainFrame(SameDocumentNavigationType) = 0;
420
421     virtual void didChangeBackgroundColor() = 0;
422     virtual void isPlayingAudioWillChange() = 0;
423     virtual void isPlayingAudioDidChange() = 0;
424     virtual void pinnedStateWillChange() { }
425     virtual void pinnedStateDidChange() { }
426
427     virtual bool hasSafeBrowsingWarning() const { return false; }
428     
429 #if PLATFORM(MAC)
430     virtual void didPerformImmediateActionHitTest(const WebHitTestResultData&, bool contentPreventsDefault, API::Object*) = 0;
431     virtual NSObject *immediateActionAnimationControllerForHitTestResult(RefPtr<API::HitTestResult>, uint64_t, RefPtr<API::Object>) = 0;
432     virtual void didHandleAcceptedCandidate() = 0;
433 #endif
434
435     virtual void didFinishProcessingAllPendingMouseEvents() = 0;
436
437     virtual void videoControlsManagerDidChange() { }
438
439 #if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS_FAMILY)
440     virtual WebCore::WebMediaSessionManager& mediaSessionManager() = 0;
441 #endif
442
443     virtual void refView() = 0;
444     virtual void derefView() = 0;
445
446 #if ENABLE(VIDEO) && USE(GSTREAMER)
447     virtual bool decidePolicyForInstallMissingMediaPluginsPermissionRequest(InstallMissingMediaPluginsPermissionRequest&) = 0;
448 #endif
449
450     virtual void didRestoreScrollPosition() = 0;
451
452     virtual bool windowIsFrontWindowUnderMouse(const NativeWebMouseEvent&) { return false; }
453
454     virtual WebCore::UserInterfaceLayoutDirection userInterfaceLayoutDirection() = 0;
455
456 #if USE(QUICK_LOOK)
457     virtual void requestPasswordForQuickLookDocument(const String& fileName, WTF::Function<void(const String&)>&&) = 0;
458 #endif
459
460 #if ENABLE(DATA_INTERACTION)
461     virtual void didHandleStartDataInteractionRequest(bool started) = 0;
462     virtual void didHandleAdditionalDragItemsRequest(bool added) = 0;
463     virtual void didConcludeEditDataInteraction(Optional<WebCore::TextIndicatorData>) = 0;
464     virtual void didChangeDataInteractionCaretRect(const WebCore::IntRect& previousCaretRect, const WebCore::IntRect& caretRect) = 0;
465 #endif
466
467 #if ENABLE(ATTACHMENT_ELEMENT)
468     virtual void didInsertAttachment(API::Attachment&, const String& source) { }
469     virtual void didRemoveAttachment(API::Attachment&) { }
470     virtual void didInvalidateDataForAttachment(API::Attachment&) { }
471 #if PLATFORM(COCOA)
472     virtual NSFileWrapper *allocFileWrapperInstance() const { return nullptr; }
473     virtual NSSet *serializableFileWrapperClasses() const { return nullptr; }
474 #endif
475 #endif
476
477 #if HAVE(PENCILKIT)
478     virtual RetainPtr<WKDrawingView> createDrawingView(WebCore::GraphicsLayer::EmbeddedViewID) { return nullptr; }
479 #endif
480 };
481
482 } // namespace WebKit