1/*
2 * Copyright (C) 2006 Eric Seidel (eric@webkit.org)
3 * Copyright (C) 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
4 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
5 * Copyright (C) 2012 Samsung Electronics. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef EmptyClients_h
30#define EmptyClients_h
31
32#include "ChromeClient.h"
33#include "ContextMenuClient.h"
34#include "DeviceMotionClient.h"
35#include "DeviceOrientationClient.h"
36#include "DragClient.h"
37#include "EditorClient.h"
38#include "TextCheckerClient.h"
39#include "FloatRect.h"
40#include "FocusDirection.h"
41#include "FrameLoaderClient.h"
42#include "InspectorClient.h"
43#include "Page.h"
44#include "ResourceError.h"
45
46/*
47 This file holds empty Client stubs for use by WebCore.
48 Viewless element needs to create a dummy Page->Frame->FrameView tree for use in parsing or executing JavaScript.
49 This tree depends heavily on Clients (usually provided by WebKit classes).
50
51 This file was first created for SVGImage as it had no way to access the current Page (nor should it,
52 since Images are not tied to a page).
53 See http://bugs.webkit.org/show_bug.cgi?id=5971 for the original discussion about this file.
54
55 Ideally, whenever you change a Client class, you should add a stub here.
56 Brittle, yes.  Unfortunate, yes.  Hopefully temporary.
57*/
58
59namespace WebCore {
60
61class GraphicsContext3D;
62
63class EmptyChromeClient : public ChromeClient {
64    WTF_MAKE_FAST_ALLOCATED;
65public:
66    virtual ~EmptyChromeClient() { }
67    virtual void chromeDestroyed() { }
68
69    virtual void setWindowRect(const FloatRect&) { }
70    virtual FloatRect windowRect() { return FloatRect(); }
71
72    virtual FloatRect pageRect() { return FloatRect(); }
73
74    virtual void focus() { }
75    virtual void unfocus() { }
76
77    virtual bool canTakeFocus(FocusDirection) { return false; }
78    virtual void takeFocus(FocusDirection) { }
79
80    virtual void focusedNodeChanged(Node*) { }
81    virtual void focusedFrameChanged(Frame*) { }
82
83    virtual Page* createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures&, const NavigationAction&) { return 0; }
84    virtual void show() { }
85
86    virtual bool canRunModal() { return false; }
87    virtual void runModal() { }
88
89    virtual void setToolbarsVisible(bool) { }
90    virtual bool toolbarsVisible() { return false; }
91
92    virtual void setStatusbarVisible(bool) { }
93    virtual bool statusbarVisible() { return false; }
94
95    virtual void setScrollbarsVisible(bool) { }
96    virtual bool scrollbarsVisible() { return false; }
97
98    virtual void setMenubarVisible(bool) { }
99    virtual bool menubarVisible() { return false; }
100
101    virtual void setResizable(bool) { }
102
103    virtual void addMessageToConsole(MessageSource, MessageLevel, const String&, unsigned, unsigned, const String&) { }
104
105    virtual bool canRunBeforeUnloadConfirmPanel() { return false; }
106    virtual bool runBeforeUnloadConfirmPanel(const String&, Frame*) { return true; }
107
108    virtual void closeWindowSoon() { }
109
110    virtual void runJavaScriptAlert(Frame*, const String&) { }
111    virtual bool runJavaScriptConfirm(Frame*, const String&) { return false; }
112    virtual bool runJavaScriptPrompt(Frame*, const String&, const String&, String&) { return false; }
113    virtual bool shouldInterruptJavaScript() { return false; }
114
115    virtual bool selectItemWritingDirectionIsNatural() { return false; }
116    virtual bool selectItemAlignmentFollowsMenuWritingDirection() { return false; }
117    virtual bool hasOpenedPopup() const OVERRIDE { return false; }
118    virtual PassRefPtr<PopupMenu> createPopupMenu(PopupMenuClient*) const OVERRIDE;
119    virtual PassRefPtr<SearchPopupMenu> createSearchPopupMenu(PopupMenuClient*) const OVERRIDE;
120
121    virtual void setStatusbarText(const String&) { }
122
123    virtual KeyboardUIMode keyboardUIMode() { return KeyboardAccessDefault; }
124
125    virtual IntRect windowResizerRect() const { return IntRect(); }
126
127    virtual void invalidateRootView(const IntRect&, bool) OVERRIDE { }
128    virtual void invalidateContentsAndRootView(const IntRect&, bool) OVERRIDE { }
129    virtual void invalidateContentsForSlowScroll(const IntRect&, bool) OVERRIDE { }
130    virtual void scroll(const IntSize&, const IntRect&, const IntRect&) { }
131#if USE(TILED_BACKING_STORE)
132    virtual void delegatedScrollRequested(const IntPoint&) { }
133#endif
134#if ENABLE(REQUEST_ANIMATION_FRAME) && !USE(REQUEST_ANIMATION_FRAME_TIMER)
135    virtual void scheduleAnimation() { }
136#endif
137
138    virtual IntPoint screenToRootView(const IntPoint& p) const OVERRIDE { return p; }
139    virtual IntRect rootViewToScreen(const IntRect& r) const OVERRIDE { return r; }
140    virtual PlatformPageClient platformPageClient() const { return 0; }
141    virtual void contentsSizeChanged(Frame*, const IntSize&) const { }
142
143    virtual void scrollbarsModeDidChange() const { }
144    virtual void mouseDidMoveOverElement(const HitTestResult&, unsigned) { }
145
146    virtual void setToolTip(const String&, TextDirection) { }
147
148    virtual void print(Frame*) { }
149
150#if ENABLE(SQL_DATABASE)
151    virtual void exceededDatabaseQuota(Frame*, const String&, DatabaseDetails) { }
152#endif
153
154    virtual void reachedMaxAppCacheSize(int64_t) { }
155    virtual void reachedApplicationCacheOriginQuota(SecurityOrigin*, int64_t) { }
156
157#if ENABLE(DIRECTORY_UPLOAD)
158    virtual void enumerateChosenDirectory(FileChooser*) { }
159#endif
160
161#if ENABLE(INPUT_TYPE_COLOR)
162    virtual PassOwnPtr<ColorChooser> createColorChooser(ColorChooserClient*, const Color&) OVERRIDE;
163#endif
164
165#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
166    virtual PassRefPtr<DateTimeChooser> openDateTimeChooser(DateTimeChooserClient*, const DateTimeChooserParameters&) OVERRIDE;
167#endif
168
169    virtual void runOpenPanel(Frame*, PassRefPtr<FileChooser>) OVERRIDE;
170    virtual void loadIconForFiles(const Vector<String>&, FileIconLoader*) { }
171
172    virtual void formStateDidChange(const Node*) { }
173
174    virtual void elementDidFocus(const Node*) { }
175    virtual void elementDidBlur(const Node*) { }
176
177    virtual void setCursor(const Cursor&) { }
178    virtual void setCursorHiddenUntilMouseMoves(bool) { }
179
180    virtual void scrollRectIntoView(const IntRect&) const { }
181
182#if USE(ACCELERATED_COMPOSITING)
183    virtual void attachRootGraphicsLayer(Frame*, GraphicsLayer*) { }
184    virtual void setNeedsOneShotDrawingSynchronization() { }
185    virtual void scheduleCompositingLayerFlush() { }
186#endif
187
188#if PLATFORM(WIN)
189    virtual void setLastSetCursorToCurrentCursor() { }
190    virtual void AXStartFrameLoad() { }
191    virtual void AXFinishFrameLoad() { }
192#endif
193#if ENABLE(TOUCH_EVENTS)
194    virtual void needTouchEvents(bool) { }
195#endif
196
197    virtual void numWheelEventHandlersChanged(unsigned) OVERRIDE { }
198
199    virtual bool shouldRubberBandInDirection(WebCore::ScrollDirection) const { return false; }
200
201    virtual bool isEmptyChromeClient() const { return true; }
202
203    virtual void didAssociateFormControls(const Vector<RefPtr<Element> >&) { }
204    virtual bool shouldNotifyOnFormChanges() { return false; }
205};
206
207// FIXME (bug 116233): Get rid of EmptyFrameLoaderClient. It is a travesty.
208
209class EmptyFrameLoaderClient : public FrameLoaderClient {
210    WTF_MAKE_NONCOPYABLE(EmptyFrameLoaderClient); WTF_MAKE_FAST_ALLOCATED;
211public:
212    EmptyFrameLoaderClient() { }
213    virtual ~EmptyFrameLoaderClient() {  }
214    virtual void frameLoaderDestroyed() { }
215
216    virtual bool hasWebView() const { return true; } // mainly for assertions
217
218    virtual void makeRepresentation(DocumentLoader*) { }
219    virtual void forceLayout() { }
220    virtual void forceLayoutForNonHTML() { }
221
222    virtual void setCopiesOnScroll() { }
223
224    virtual void detachedFromParent2() { }
225    virtual void detachedFromParent3() { }
226
227    virtual void convertMainResourceLoadToDownload(DocumentLoader*, const ResourceRequest&, const ResourceResponse&) OVERRIDE { }
228
229    virtual void assignIdentifierToInitialRequest(unsigned long, DocumentLoader*, const ResourceRequest&) { }
230    virtual bool shouldUseCredentialStorage(DocumentLoader*, unsigned long) { return false; }
231    virtual void dispatchWillSendRequest(DocumentLoader*, unsigned long, ResourceRequest&, const ResourceResponse&) { }
232    virtual void dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, unsigned long, const AuthenticationChallenge&) { }
233    virtual void dispatchDidCancelAuthenticationChallenge(DocumentLoader*, unsigned long, const AuthenticationChallenge&) { }
234#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
235    virtual bool canAuthenticateAgainstProtectionSpace(DocumentLoader*, unsigned long, const ProtectionSpace&) { return false; }
236#endif
237    virtual void dispatchDidReceiveResponse(DocumentLoader*, unsigned long, const ResourceResponse&) { }
238    virtual void dispatchDidReceiveContentLength(DocumentLoader*, unsigned long, int) { }
239    virtual void dispatchDidFinishLoading(DocumentLoader*, unsigned long) { }
240    virtual void dispatchDidFailLoading(DocumentLoader*, unsigned long, const ResourceError&) { }
241    virtual bool dispatchDidLoadResourceFromMemoryCache(DocumentLoader*, const ResourceRequest&, const ResourceResponse&, int) { return false; }
242
243    virtual void dispatchDidHandleOnloadEvents() { }
244    virtual void dispatchDidReceiveServerRedirectForProvisionalLoad() { }
245    virtual void dispatchDidCancelClientRedirect() { }
246    virtual void dispatchWillPerformClientRedirect(const KURL&, double, double) { }
247    virtual void dispatchDidChangeLocationWithinPage() { }
248    virtual void dispatchDidPushStateWithinPage() { }
249    virtual void dispatchDidReplaceStateWithinPage() { }
250    virtual void dispatchDidPopStateWithinPage() { }
251    virtual void dispatchWillClose() { }
252    virtual void dispatchDidReceiveIcon() { }
253    virtual void dispatchDidStartProvisionalLoad() { }
254    virtual void dispatchDidReceiveTitle(const StringWithDirection&) { }
255    virtual void dispatchDidChangeIcons(IconType) { }
256    virtual void dispatchDidCommitLoad() { }
257    virtual void dispatchDidFailProvisionalLoad(const ResourceError&) { }
258    virtual void dispatchDidFailLoad(const ResourceError&) { }
259    virtual void dispatchDidFinishDocumentLoad() { }
260    virtual void dispatchDidFinishLoad() { }
261    virtual void dispatchDidLayout(LayoutMilestones) { }
262
263    virtual Frame* dispatchCreatePage(const NavigationAction&) { return 0; }
264    virtual void dispatchShow() { }
265
266    virtual void dispatchDecidePolicyForResponse(FramePolicyFunction, const ResourceResponse&, const ResourceRequest&) { }
267    virtual void dispatchDecidePolicyForNewWindowAction(FramePolicyFunction, const NavigationAction&, const ResourceRequest&, PassRefPtr<FormState>, const String&) OVERRIDE;
268    virtual void dispatchDecidePolicyForNavigationAction(FramePolicyFunction, const NavigationAction&, const ResourceRequest&, PassRefPtr<FormState>) OVERRIDE;
269    virtual void cancelPolicyCheck() { }
270
271    virtual void dispatchUnableToImplementPolicy(const ResourceError&) { }
272
273    virtual void dispatchWillSendSubmitEvent(PassRefPtr<FormState>) OVERRIDE;
274    virtual void dispatchWillSubmitForm(FramePolicyFunction, PassRefPtr<FormState>) OVERRIDE;
275
276    virtual void revertToProvisionalState(DocumentLoader*) { }
277    virtual void setMainDocumentError(DocumentLoader*, const ResourceError&) { }
278
279    virtual void willChangeEstimatedProgress() { }
280    virtual void didChangeEstimatedProgress() { }
281    virtual void postProgressStartedNotification() { }
282    virtual void postProgressEstimateChangedNotification() { }
283    virtual void postProgressFinishedNotification() { }
284
285    virtual void setMainFrameDocumentReady(bool) { }
286
287    virtual void startDownload(const ResourceRequest&, const String& suggestedName = String()) { UNUSED_PARAM(suggestedName); }
288
289    virtual void willChangeTitle(DocumentLoader*) { }
290    virtual void didChangeTitle(DocumentLoader*) { }
291
292    virtual void committedLoad(DocumentLoader*, const char*, int) { }
293    virtual void finishedLoading(DocumentLoader*) { }
294
295    virtual ResourceError cancelledError(const ResourceRequest&) { ResourceError error("", 0, "", ""); error.setIsCancellation(true); return error; }
296    virtual ResourceError blockedError(const ResourceRequest&) { return ResourceError("", 0, "", ""); }
297    virtual ResourceError cannotShowURLError(const ResourceRequest&) { return ResourceError("", 0, "", ""); }
298    virtual ResourceError interruptedForPolicyChangeError(const ResourceRequest&) { return ResourceError("", 0, "", ""); }
299
300    virtual ResourceError cannotShowMIMETypeError(const ResourceResponse&) { return ResourceError("", 0, "", ""); }
301    virtual ResourceError fileDoesNotExistError(const ResourceResponse&) { return ResourceError("", 0, "", ""); }
302    virtual ResourceError pluginWillHandleLoadError(const ResourceResponse&) { return ResourceError("", 0, "", ""); }
303
304    virtual bool shouldFallBack(const ResourceError&) { return false; }
305
306    virtual bool canHandleRequest(const ResourceRequest&) const { return false; }
307    virtual bool canShowMIMEType(const String&) const { return false; }
308    virtual bool canShowMIMETypeAsHTML(const String&) const { return false; }
309    virtual bool representationExistsForURLScheme(const String&) const { return false; }
310    virtual String generatedMIMETypeForURLScheme(const String&) const { return ""; }
311
312    virtual void frameLoadCompleted() { }
313    virtual void restoreViewState() { }
314    virtual void provisionalLoadStarted() { }
315    virtual bool shouldTreatURLAsSameAsCurrent(const KURL&) const { return false; }
316    virtual void didFinishLoad() { }
317    virtual void prepareForDataSourceReplacement() { }
318
319    virtual PassRefPtr<DocumentLoader> createDocumentLoader(const ResourceRequest&, const SubstituteData&) OVERRIDE;
320    virtual void setTitle(const StringWithDirection&, const KURL&) { }
321
322    virtual String userAgent(const KURL&) { return ""; }
323
324    virtual void savePlatformDataToCachedFrame(CachedFrame*) { }
325    virtual void transitionToCommittedFromCachedFrame(CachedFrame*) { }
326    virtual void transitionToCommittedForNewPage() { }
327
328    virtual void didSaveToPageCache() { }
329    virtual void didRestoreFromPageCache() { }
330
331    virtual void dispatchDidBecomeFrameset(bool) { }
332
333    virtual void updateGlobalHistory() { }
334    virtual void updateGlobalHistoryRedirectLinks() { }
335    virtual bool shouldGoToHistoryItem(HistoryItem*) const { return false; }
336    virtual bool shouldStopLoadingForHistoryItem(HistoryItem*) const { return false; }
337    virtual void updateGlobalHistoryItemForPage() { }
338    virtual void saveViewStateToItem(HistoryItem*) { }
339    virtual bool canCachePage() const { return false; }
340    virtual void didDisplayInsecureContent() { }
341    virtual void didRunInsecureContent(SecurityOrigin*, const KURL&) { }
342    virtual void didDetectXSS(const KURL&, bool) { }
343    virtual PassRefPtr<Frame> createFrame(const KURL&, const String&, HTMLFrameOwnerElement*, const String&, bool, int, int) OVERRIDE;
344    virtual PassRefPtr<Widget> createPlugin(const IntSize&, HTMLPlugInElement*, const KURL&, const Vector<String>&, const Vector<String>&, const String&, bool) OVERRIDE;
345    virtual void recreatePlugin(Widget*) OVERRIDE;
346    virtual PassRefPtr<Widget> createJavaAppletWidget(const IntSize&, HTMLAppletElement*, const KURL&, const Vector<String>&, const Vector<String>&) OVERRIDE;
347#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
348    virtual PassRefPtr<Widget> createMediaPlayerProxyPlugin(const IntSize&, HTMLMediaElement*, const KURL&, const Vector<String>&, const Vector<String>&, const String&) OVERRIDE;
349    virtual void hideMediaPlayerProxyPlugin(Widget*) { }
350    virtual void showMediaPlayerProxyPlugin(Widget*) { }
351#endif
352
353    virtual ObjectContentType objectContentType(const KURL&, const String&, bool) { return ObjectContentType(); }
354    virtual String overrideMediaType() const { return String(); }
355
356    virtual void redirectDataToPlugin(Widget*) { }
357    virtual void dispatchDidClearWindowObjectInWorld(DOMWrapperWorld*) { }
358    virtual void documentElementAvailable() { }
359    virtual void didPerformFirstNavigation() const { }
360
361    virtual void registerForIconNotification(bool) { }
362
363#if PLATFORM(MAC)
364    virtual RemoteAXObjectRef accessibilityRemoteObject() { return 0; }
365    virtual NSCachedURLResponse* willCacheResponse(DocumentLoader*, unsigned long, NSCachedURLResponse* response) const { return response; }
366#endif
367#if PLATFORM(WIN) && USE(CFNETWORK)
368    // FIXME: Windows should use willCacheResponse - <https://bugs.webkit.org/show_bug.cgi?id=57257>.
369    virtual bool shouldCacheResponse(DocumentLoader*, unsigned long, const ResourceResponse&, const unsigned char*, unsigned long long) { return true; }
370#endif
371
372    virtual PassRefPtr<FrameNetworkingContext> createNetworkingContext() OVERRIDE;
373
374    virtual bool isEmptyFrameLoaderClient() OVERRIDE { return true; }
375};
376
377class EmptyTextCheckerClient : public TextCheckerClient {
378public:
379    virtual bool shouldEraseMarkersAfterChangeSelection(TextCheckingType) const { return true; }
380    virtual void ignoreWordInSpellDocument(const String&) { }
381    virtual void learnWord(const String&) { }
382    virtual void checkSpellingOfString(const UChar*, int, int*, int*) { }
383    virtual String getAutoCorrectSuggestionForMisspelledWord(const String&) { return String(); }
384    virtual void checkGrammarOfString(const UChar*, int, Vector<GrammarDetail>&, int*, int*) { }
385
386#if USE(UNIFIED_TEXT_CHECKING)
387    virtual void checkTextOfParagraph(const UChar*, int, TextCheckingTypeMask, Vector<TextCheckingResult>&) { };
388#endif
389
390    virtual void getGuessesForWord(const String&, const String&, Vector<String>&) { }
391    virtual void requestCheckingOfString(PassRefPtr<TextCheckingRequest>) OVERRIDE;
392};
393
394class EmptyEditorClient : public EditorClient {
395    WTF_MAKE_NONCOPYABLE(EmptyEditorClient); WTF_MAKE_FAST_ALLOCATED;
396public:
397    EmptyEditorClient() { }
398    virtual ~EmptyEditorClient() { }
399    virtual void pageDestroyed() { }
400    virtual void frameWillDetachPage(Frame*) { }
401
402    virtual bool shouldDeleteRange(Range*) { return false; }
403    virtual bool smartInsertDeleteEnabled() { return false; }
404    virtual bool isSelectTrailingWhitespaceEnabled() { return false; }
405    virtual bool isContinuousSpellCheckingEnabled() { return false; }
406    virtual void toggleContinuousSpellChecking() { }
407    virtual bool isGrammarCheckingEnabled() { return false; }
408    virtual void toggleGrammarChecking() { }
409    virtual int spellCheckerDocumentTag() { return -1; }
410
411    virtual bool selectWordBeforeMenuEvent() { return false; }
412    virtual bool isEditable() { return false; }
413
414    virtual bool shouldBeginEditing(Range*) { return false; }
415    virtual bool shouldEndEditing(Range*) { return false; }
416    virtual bool shouldInsertNode(Node*, Range*, EditorInsertAction) { return false; }
417    virtual bool shouldInsertText(const String&, Range*, EditorInsertAction) { return false; }
418    virtual bool shouldChangeSelectedRange(Range*, Range*, EAffinity, bool) { return false; }
419
420    virtual bool shouldApplyStyle(StylePropertySet*, Range*) { return false; }
421    virtual bool shouldMoveRangeAfterDelete(Range*, Range*) { return false; }
422
423    virtual void didBeginEditing() { }
424    virtual void respondToChangedContents() { }
425    virtual void respondToChangedSelection(Frame*) { }
426    virtual void didEndEditing() { }
427    virtual void willWriteSelectionToPasteboard(Range*) { }
428    virtual void didWriteSelectionToPasteboard() { }
429    virtual void getClientPasteboardDataForRange(Range*, Vector<String>&, Vector<RefPtr<SharedBuffer> >&) { }
430    virtual void didSetSelectionTypesForPasteboard() { }
431
432    virtual void registerUndoStep(PassRefPtr<UndoStep>) OVERRIDE;
433    virtual void registerRedoStep(PassRefPtr<UndoStep>) OVERRIDE;
434    virtual void clearUndoRedoOperations() { }
435
436    virtual bool canCopyCut(Frame*, bool defaultValue) const { return defaultValue; }
437    virtual bool canPaste(Frame*, bool defaultValue) const { return defaultValue; }
438    virtual bool canUndo() const { return false; }
439    virtual bool canRedo() const { return false; }
440
441    virtual void undo() { }
442    virtual void redo() { }
443
444    virtual void handleKeyboardEvent(KeyboardEvent*) { }
445    virtual void handleInputMethodKeydown(KeyboardEvent*) { }
446
447    virtual void textFieldDidBeginEditing(Element*) { }
448    virtual void textFieldDidEndEditing(Element*) { }
449    virtual void textDidChangeInTextField(Element*) { }
450    virtual bool doTextFieldCommandFromEvent(Element*, KeyboardEvent*) { return false; }
451    virtual void textWillBeDeletedInTextField(Element*) { }
452    virtual void textDidChangeInTextArea(Element*) { }
453
454#if PLATFORM(MAC)
455    virtual void markedTextAbandoned(Frame*) { }
456
457    virtual NSString* userVisibleString(NSURL*) { return 0; }
458    virtual DocumentFragment* documentFragmentFromAttributedString(NSAttributedString*, Vector<RefPtr<ArchiveResource> >&) { return 0; };
459    virtual void setInsertionPasteboard(const String&) { };
460    virtual NSURL* canonicalizeURL(NSURL*) { return 0; }
461    virtual NSURL* canonicalizeURLString(NSString*) { return 0; }
462#endif
463
464#if USE(APPKIT)
465    virtual void uppercaseWord() { }
466    virtual void lowercaseWord() { }
467    virtual void capitalizeWord() { }
468#endif
469
470#if USE(AUTOMATIC_TEXT_REPLACEMENT)
471    virtual void showSubstitutionsPanel(bool) { }
472    virtual bool substitutionsPanelIsShowing() { return false; }
473    virtual void toggleSmartInsertDelete() { }
474    virtual bool isAutomaticQuoteSubstitutionEnabled() { return false; }
475    virtual void toggleAutomaticQuoteSubstitution() { }
476    virtual bool isAutomaticLinkDetectionEnabled() { return false; }
477    virtual void toggleAutomaticLinkDetection() { }
478    virtual bool isAutomaticDashSubstitutionEnabled() { return false; }
479    virtual void toggleAutomaticDashSubstitution() { }
480    virtual bool isAutomaticTextReplacementEnabled() { return false; }
481    virtual void toggleAutomaticTextReplacement() { }
482    virtual bool isAutomaticSpellingCorrectionEnabled() { return false; }
483    virtual void toggleAutomaticSpellingCorrection() { }
484#endif
485
486#if ENABLE(DELETION_UI)
487    virtual bool shouldShowDeleteInterface(HTMLElement*) { return false; }
488#endif
489
490#if PLATFORM(GTK)
491    virtual bool shouldShowUnicodeMenu() { return false; }
492#endif
493    TextCheckerClient* textChecker() { return &m_textCheckerClient; }
494
495    virtual void updateSpellingUIWithGrammarString(const String&, const GrammarDetail&) { }
496    virtual void updateSpellingUIWithMisspelledWord(const String&) { }
497    virtual void showSpellingUI(bool) { }
498    virtual bool spellingUIIsShowing() { return false; }
499
500    virtual void willSetInputMethodState() { }
501    virtual void setInputMethodState(bool) { }
502
503private:
504    EmptyTextCheckerClient m_textCheckerClient;
505};
506
507#if ENABLE(CONTEXT_MENUS)
508class EmptyContextMenuClient : public ContextMenuClient {
509    WTF_MAKE_NONCOPYABLE(EmptyContextMenuClient); WTF_MAKE_FAST_ALLOCATED;
510public:
511    EmptyContextMenuClient() { }
512    virtual ~EmptyContextMenuClient() {  }
513    virtual void contextMenuDestroyed() { }
514
515#if USE(CROSS_PLATFORM_CONTEXT_MENUS)
516    virtual PassOwnPtr<ContextMenu> customizeMenu(PassOwnPtr<ContextMenu>) OVERRIDE;
517#else
518    virtual PlatformMenuDescription getCustomMenuFromDefaultItems(ContextMenu*) { return 0; }
519#endif
520    virtual void contextMenuItemSelected(ContextMenuItem*, const ContextMenu*) { }
521
522    virtual void downloadURL(const KURL&) { }
523    virtual void copyImageToClipboard(const HitTestResult&) { }
524    virtual void searchWithGoogle(const Frame*) { }
525    virtual void lookUpInDictionary(Frame*) { }
526    virtual bool isSpeaking() { return false; }
527    virtual void speak(const String&) { }
528    virtual void stopSpeaking() { }
529
530#if PLATFORM(MAC)
531    virtual void searchWithSpotlight() { }
532#endif
533
534#if USE(ACCESSIBILITY_CONTEXT_MENUS)
535    virtual void showContextMenu() { }
536#endif
537};
538#endif // ENABLE(CONTEXT_MENUS)
539
540#if ENABLE(DRAG_SUPPORT)
541class EmptyDragClient : public DragClient {
542    WTF_MAKE_NONCOPYABLE(EmptyDragClient); WTF_MAKE_FAST_ALLOCATED;
543public:
544    EmptyDragClient() { }
545    virtual ~EmptyDragClient() {}
546    virtual void willPerformDragDestinationAction(DragDestinationAction, DragData*) { }
547    virtual void willPerformDragSourceAction(DragSourceAction, const IntPoint&, Clipboard*) { }
548    virtual DragDestinationAction actionMaskForDrag(DragData*) { return DragDestinationActionNone; }
549    virtual DragSourceAction dragSourceActionMaskForPoint(const IntPoint&) { return DragSourceActionNone; }
550    virtual void startDrag(DragImageRef, const IntPoint&, const IntPoint&, Clipboard*, Frame*, bool) { }
551    virtual void dragControllerDestroyed() { }
552};
553#endif // ENABLE(DRAG_SUPPORT)
554
555class EmptyInspectorClient : public InspectorClient {
556    WTF_MAKE_NONCOPYABLE(EmptyInspectorClient); WTF_MAKE_FAST_ALLOCATED;
557public:
558    EmptyInspectorClient() { }
559    virtual ~EmptyInspectorClient() { }
560
561    virtual void inspectorDestroyed() { }
562
563    virtual InspectorFrontendChannel* openInspectorFrontend(InspectorController*) { return 0; }
564    virtual void closeInspectorFrontend() { }
565    virtual void bringFrontendToFront() { }
566
567    virtual void highlight() { }
568    virtual void hideHighlight() { }
569};
570
571class EmptyDeviceClient : public DeviceClient {
572public:
573    virtual void startUpdating() OVERRIDE { }
574    virtual void stopUpdating() OVERRIDE { }
575};
576
577class EmptyDeviceMotionClient : public DeviceMotionClient {
578public:
579    virtual void setController(DeviceMotionController*) { }
580    virtual DeviceMotionData* lastMotion() const { return 0; }
581    virtual void deviceMotionControllerDestroyed() { }
582};
583
584class EmptyDeviceOrientationClient : public DeviceOrientationClient {
585public:
586    virtual void setController(DeviceOrientationController*) { }
587    virtual DeviceOrientationData* lastOrientation() const { return 0; }
588    virtual void deviceOrientationControllerDestroyed() { }
589};
590
591void fillWithEmptyClients(Page::PageClients&);
592
593}
594
595#endif // EmptyClients_h
596