summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/page/ChromeClient.h
blob: 0ec366b24f04aa015922f5c57d147f3f59fc4dff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
/*
 * Copyright (C) 2006, 2007, 2008, 2009 Apple, Inc. All rights reserved.
 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef ChromeClient_h
#define ChromeClient_h

#include "AXObjectCache.h"
#include "Console.h"
#include "Cursor.h"
#include "FocusDirection.h"
#include "GraphicsContext.h"
#include "HostWindow.h"
#include "PopupMenu.h"
#include "PopupMenuClient.h"
#include "ScrollTypes.h"
#include "SearchPopupMenu.h"
#include "WebCoreKeyboardUIMode.h"
#include <wtf/Forward.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/Vector.h>

#ifndef __OBJC__
class NSMenu;
class NSResponder;
#endif

namespace WebCore {

    class AccessibilityObject;
    class Element;
    class FileChooser;
    class FloatRect;
    class Frame;
    class Geolocation;
    class GraphicsLayer;
    class HitTestResult;
    class IntRect;
    class NavigationAction;
    class Node;
    class Page;
    class PopupMenuClient;
    class SecurityOrigin;
    class SharedGraphicsContext3D;
    class Widget;

    struct FrameLoadRequest;
    struct ViewportArguments;
    struct WindowFeatures;

#if USE(ACCELERATED_COMPOSITING)
    class GraphicsLayer;
#endif

#if ENABLE(NOTIFICATIONS)
    class NotificationPresenter;
#endif

    class ChromeClient {
    public:
        virtual void chromeDestroyed() = 0;
        
        virtual void setWindowRect(const FloatRect&) = 0;
        virtual FloatRect windowRect() = 0;
        
        virtual FloatRect pageRect() = 0;
        
        virtual float scaleFactor() = 0;
    
        virtual void focus() = 0;
        virtual void unfocus() = 0;

        virtual bool canTakeFocus(FocusDirection) = 0;
        virtual void takeFocus(FocusDirection) = 0;

        virtual void focusedNodeChanged(Node*) = 0;
        virtual void focusedFrameChanged(Frame*) = 0;

        // The Frame pointer provides the ChromeClient with context about which
        // Frame wants to create the new Page.  Also, the newly created window
        // should not be shown to the user until the ChromeClient of the newly
        // created Page has its show method called.
        // The FrameLoadRequest parameter is only for ChromeClient to check if the
        // request could be fulfilled.  The ChromeClient should not load the request.
        virtual Page* createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures&, const NavigationAction&) = 0;
        virtual void show() = 0;

        virtual bool canRunModal() = 0;
        virtual void runModal() = 0;

        virtual void setToolbarsVisible(bool) = 0;
        virtual bool toolbarsVisible() = 0;
        
        virtual void setStatusbarVisible(bool) = 0;
        virtual bool statusbarVisible() = 0;
        
        virtual void setScrollbarsVisible(bool) = 0;
        virtual bool scrollbarsVisible() = 0;
        
        virtual void setMenubarVisible(bool) = 0;
        virtual bool menubarVisible() = 0;

        virtual void setResizable(bool) = 0;
        
        virtual void addMessageToConsole(MessageSource, MessageType, MessageLevel, const String& message, unsigned int lineNumber, const String& sourceID) = 0;

        virtual bool canRunBeforeUnloadConfirmPanel() = 0;
        virtual bool runBeforeUnloadConfirmPanel(const String& message, Frame* frame) = 0;

        virtual void closeWindowSoon() = 0;
        
        virtual void runJavaScriptAlert(Frame*, const String&) = 0;
        virtual bool runJavaScriptConfirm(Frame*, const String&) = 0;
        virtual bool runJavaScriptPrompt(Frame*, const String& message, const String& defaultValue, String& result) = 0;
        virtual void setStatusbarText(const String&) = 0;
        virtual bool shouldInterruptJavaScript() = 0;
        virtual KeyboardUIMode keyboardUIMode() = 0;

        virtual void* webView() const = 0;

#if ENABLE(REGISTER_PROTOCOL_HANDLER)
        virtual void registerProtocolHandler(const String& scheme, const String& baseURL, const String& url, const String& title) = 0;
#endif

        virtual IntRect windowResizerRect() const = 0;

        // Methods used by HostWindow.
        virtual void invalidateWindow(const IntRect&, bool) = 0;
        virtual void invalidateContentsAndWindow(const IntRect&, bool) = 0;
        virtual void invalidateContentsForSlowScroll(const IntRect&, bool) = 0;
        virtual void scroll(const IntSize&, const IntRect&, const IntRect&) = 0;
#if ENABLE(TILED_BACKING_STORE)
        virtual void delegatedScrollRequested(const IntPoint&) = 0;
#endif
        virtual IntPoint screenToWindow(const IntPoint&) const = 0;
        virtual IntRect windowToScreen(const IntRect&) const = 0;
        virtual PlatformPageClient platformPageClient() const = 0;
        virtual void scrollbarsModeDidChange() const = 0;
        virtual void setCursor(const Cursor&) = 0;
#if ENABLE(REQUEST_ANIMATION_FRAME)
        virtual void scheduleAnimation() = 0;
#endif
        // End methods used by HostWindow.

        virtual void dispatchViewportDataDidChange(const ViewportArguments&) const { }

        virtual void contentsSizeChanged(Frame*, const IntSize&) const = 0;
        virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const = 0; // Currently only Mac has a non empty implementation.
       
        virtual bool shouldMissingPluginMessageBeButton() const { return false; }
        virtual void missingPluginButtonClicked(Element*) const { }
        virtual void mouseDidMoveOverElement(const HitTestResult&, unsigned modifierFlags) = 0;

        virtual void setToolTip(const String&, TextDirection) = 0;

        virtual void print(Frame*) = 0;

#if ENABLE(DATABASE)
        virtual void exceededDatabaseQuota(Frame*, const String& databaseName) = 0;
#endif

#if ENABLE(OFFLINE_WEB_APPLICATIONS)
        // Callback invoked when the application cache fails to save a cache object
        // because storing it would grow the database file past its defined maximum
        // size or past the amount of free space on the device. 
        // The chrome client would need to take some action such as evicting some
        // old caches.
        virtual void reachedMaxAppCacheSize(int64_t spaceNeeded) = 0;

        // Callback invoked when the application cache origin quota is reached. This
        // means that the resources attempting to be cached via the manifest are
        // more than allowed on this origin. This callback allows the chrome client
        // to take action, such as prompting the user to ask to increase the quota
        // for this origin.
        virtual void reachedApplicationCacheOriginQuota(SecurityOrigin* origin) = 0;
#endif

#if ENABLE(DASHBOARD_SUPPORT)
        virtual void dashboardRegionsChanged();
#endif

#if ENABLE(NOTIFICATIONS)
        virtual NotificationPresenter* notificationPresenter() const = 0;
#endif

        virtual void populateVisitedLinks();

        virtual FloatRect customHighlightRect(Node*, const AtomicString& type, const FloatRect& lineRect);
        virtual void paintCustomHighlight(Node*, const AtomicString& type, const FloatRect& boxRect, const FloatRect& lineRect,
            bool behindText, bool entireLine);
            
        virtual bool shouldReplaceWithGeneratedFileForUpload(const String& path, String& generatedFilename);
        virtual String generateReplacementFile(const String& path);

        virtual bool paintCustomScrollbar(GraphicsContext*, const FloatRect&, ScrollbarControlSize, 
                                          ScrollbarControlState, ScrollbarPart pressedPart, bool vertical,
                                          float value, float proportion, ScrollbarControlPartMask);
        virtual bool paintCustomScrollCorner(GraphicsContext*, const FloatRect&);

        virtual bool paintCustomOverhangArea(GraphicsContext*, const IntRect&, const IntRect&, const IntRect&);

        // FIXME: Remove once all ports are using client-based geolocation. https://bugs.webkit.org/show_bug.cgi?id=40373
        // For client-based geolocation, these two methods have moved to GeolocationClient. https://bugs.webkit.org/show_bug.cgi?id=50061
        // This can be either a synchronous or asynchronous call. The ChromeClient can display UI asking the user for permission
        // to use Geolocation.
        virtual void requestGeolocationPermissionForFrame(Frame*, Geolocation*) = 0;
        virtual void cancelGeolocationPermissionRequestForFrame(Frame*, Geolocation*) = 0;

        virtual void runOpenPanel(Frame*, PassRefPtr<FileChooser>) = 0;
        // Asynchronous request to load an icon for specified filenames.
        virtual void chooseIconForFiles(const Vector<String>&, FileChooser*) = 0;

#if ENABLE(DIRECTORY_UPLOAD)
        // Asychronous request to enumerate all files in a directory chosen by the user.
        virtual void enumerateChosenDirectory(const String&, FileChooser*) = 0;
#endif

        // Notification that the given form element has changed. This function
        // will be called frequently, so handling should be very fast.
        virtual void formStateDidChange(const Node*) = 0;
        
        virtual void formDidFocus(const Node*) { };
        virtual void formDidBlur(const Node*) { };

#if USE(ACCELERATED_COMPOSITING)
        // Pass 0 as the GraphicsLayer to detatch the root layer.
        virtual void attachRootGraphicsLayer(Frame*, GraphicsLayer*) = 0;
        // Sets a flag to specify that the next time content is drawn to the window,
        // the changes appear on the screen in synchrony with updates to GraphicsLayers.
        virtual void setNeedsOneShotDrawingSynchronization() = 0;
        // Sets a flag to specify that the view needs to be updated, so we need
        // to do an eager layout before the drawing.
        virtual void scheduleCompositingLayerSync() = 0;
        // Returns whether or not the client can render the composited layer,
        // regardless of the settings.
        virtual bool allowsAcceleratedCompositing() const { return true; }

        enum CompositingTrigger {
            ThreeDTransformTrigger = 1 << 0,
            VideoTrigger = 1 << 1,
            PluginTrigger = 1 << 2,
            CanvasTrigger = 1 << 3,
            AnimationTrigger = 1 << 4,
            AllTriggers = 0xFFFFFFFF
        };
        typedef unsigned CompositingTriggerFlags;

        // Returns a bitfield indicating conditions that can trigger the compositor.
        virtual CompositingTriggerFlags allowedCompositingTriggers() const { return static_cast<CompositingTriggerFlags>(AllTriggers); }
#endif

        virtual bool supportsFullscreenForNode(const Node*) { return false; }
        virtual void enterFullscreenForNode(Node*) { }
        virtual void exitFullscreenForNode(Node*) { }
        virtual bool requiresFullscreenForVideoPlayback() { return false; } 

#if ENABLE(FULLSCREEN_API)
        virtual bool supportsFullScreenForElement(const Element*, bool) { return false; }
        virtual void enterFullScreenForElement(Element*) { }
        virtual void exitFullScreenForElement(Element*) { }
        virtual void fullScreenRendererChanged(RenderBox*) { }
        virtual void setRootFullScreenLayer(GraphicsLayer*) { }
#endif
        
#if ENABLE(TILED_BACKING_STORE)
        virtual IntRect visibleRectForTiledBackingStore() const { return IntRect(); }
#endif

#if PLATFORM(MAC)
        virtual NSResponder *firstResponder() { return 0; }
        virtual void makeFirstResponder(NSResponder *) { }

        virtual void willPopUpMenu(NSMenu *) { }
#endif

#if PLATFORM(WIN)
        virtual void setLastSetCursorToCurrentCursor() = 0;
#endif

#if ENABLE(TOUCH_EVENTS)
        virtual void needTouchEvents(bool) = 0;
#endif

        virtual bool selectItemWritingDirectionIsNatural() = 0;
        virtual bool selectItemAlignmentFollowsMenuWritingDirection() = 0;
        virtual PassRefPtr<PopupMenu> createPopupMenu(PopupMenuClient*) const = 0;
        virtual PassRefPtr<SearchPopupMenu> createSearchPopupMenu(PopupMenuClient*) const = 0;

#if ENABLE(CONTEXT_MENUS)
        virtual void showContextMenu() = 0;
#endif

        virtual void postAccessibilityNotification(AccessibilityObject*, AXObjectCache::AXNotification) { }

        virtual void didCompleteRubberBandForMainFrame(const IntSize&) const { }

        enum DialogType {
            AlertDialog = 0,
            ConfirmDialog = 1,
            PromptDialog = 2,
            HTMLDialog = 3,
            NumDialogTypes = 4
        };
        virtual void willRunModalDialogDuringPageDismissal(const DialogType&) const { }

    protected:
        virtual ~ChromeClient() { }
    };

}

#endif // ChromeClient_h