Allow UI clients to handle vertical wheel events.
[WebKit-https.git] / Source / WebCore / page / Page.h
1 /*
2  * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef Page_h
22 #define Page_h
23
24 #include "FeatureObserver.h"
25 #include "FindOptions.h"
26 #include "FrameLoaderTypes.h"
27 #include "LayoutMilestones.h"
28 #include "LayoutRect.h"
29 #include "PageVisibilityState.h"
30 #include "Pagination.h"
31 #include "PlatformScreen.h"
32 #include "Region.h"
33 #include "Supplementable.h"
34 #include "ViewportArguments.h"
35 #include <wtf/Forward.h>
36 #include <wtf/HashMap.h>
37 #include <wtf/HashSet.h>
38 #include <wtf/Noncopyable.h>
39 #include <wtf/text/WTFString.h>
40
41 #if OS(SOLARIS)
42 #include <sys/time.h> // For time_t structure.
43 #endif
44
45 #if PLATFORM(MAC)
46 #include "SchedulePair.h"
47 #endif
48
49 namespace JSC {
50 class Debugger;
51 }
52
53 namespace WebCore {
54
55 class AlternativeTextClient;
56 class BackForwardController;
57 class BackForwardList;
58 class Chrome;
59 class ChromeClient;
60 class ClientRectList;
61 class ContextMenuClient;
62 class ContextMenuController;
63 class Document;
64 class DragCaretController;
65 class DragClient;
66 class DragController;
67 class EditorClient;
68 class FocusController;
69 class Frame;
70 class FrameSelection;
71 class HaltablePlugin;
72 class HistoryItem;
73 class InspectorClient;
74 class InspectorController;
75 class MediaCanStartListener;
76 class Node;
77 class PageGroup;
78 class PlugInClient;
79 class PluginData;
80 class PluginViewBase;
81 class PointerLockController;
82 class ProgressTracker;
83 class Range;
84 class RenderObject;
85 class RenderTheme;
86 class VisibleSelection;
87 class ScrollableArea;
88 class ScrollingCoordinator;
89 class Settings;
90 class StorageNamespace;
91 class ValidationMessageClient;
92
93 typedef uint64_t LinkHash;
94
95 enum FindDirection { FindDirectionForward, FindDirectionBackward };
96
97 float deviceScaleFactor(Frame*);
98
99 struct ArenaSize {
100     ArenaSize(size_t treeSize, size_t allocated)
101         : treeSize(treeSize)
102         , allocated(allocated)
103     {
104     }
105     size_t treeSize;
106     size_t allocated;
107 };
108
109 class Page : public Supplementable<Page> {
110     WTF_MAKE_NONCOPYABLE(Page);
111     friend class Settings;
112 public:
113     static void scheduleForcedStyleRecalcForAllPages();
114
115     // It is up to the platform to ensure that non-null clients are provided where required.
116     struct PageClients {
117         WTF_MAKE_NONCOPYABLE(PageClients); WTF_MAKE_FAST_ALLOCATED;
118     public:
119         PageClients();
120         ~PageClients();
121
122         AlternativeTextClient* alternativeTextClient;
123         ChromeClient* chromeClient;
124 #if ENABLE(CONTEXT_MENUS)
125         ContextMenuClient* contextMenuClient;
126 #endif
127         EditorClient* editorClient;
128         DragClient* dragClient;
129         InspectorClient* inspectorClient;
130         PlugInClient* plugInClient;
131         RefPtr<BackForwardList> backForwardClient;
132         ValidationMessageClient* validationMessageClient;
133     };
134
135     explicit Page(PageClients&);
136     ~Page();
137
138     ArenaSize renderTreeSize() const;
139
140     void setNeedsRecalcStyleInAllFrames();
141
142     RenderTheme* theme() const { return m_theme.get(); }
143
144     ViewportArguments viewportArguments() const;
145
146     static void refreshPlugins(bool reload);
147     PluginData* pluginData() const;
148
149     void setCanStartMedia(bool);
150     bool canStartMedia() const { return m_canStartMedia; }
151
152     EditorClient* editorClient() const { return m_editorClient; }
153     PlugInClient* plugInClient() const { return m_plugInClient; }
154
155     void setMainFrame(PassRefPtr<Frame>);
156     Frame* mainFrame() const { return m_mainFrame.get(); }
157
158     bool openedByDOM() const;
159     void setOpenedByDOM();
160
161     // DEPRECATED. Use backForward() instead of the following 6 functions.
162     BackForwardList* backForwardList() const;
163     bool goBack();
164     bool goForward();
165     bool canGoBackOrForward(int distance) const;
166     void goBackOrForward(int distance);
167     int getHistoryLength();
168
169     void goToItem(HistoryItem*, FrameLoadType);
170
171     void setGroupName(const String&);
172     const String& groupName() const;
173
174     PageGroup& group();
175     PageGroup* groupPtr() { return m_group; } // can return 0
176
177     void incrementSubframeCount() { ++m_subframeCount; }
178     void decrementSubframeCount() { ASSERT(m_subframeCount); --m_subframeCount; }
179     int subframeCount() const { checkSubframeCountConsistency(); return m_subframeCount; }
180
181     Chrome* chrome() const { return m_chrome.get(); }
182     DragCaretController* dragCaretController() const { return m_dragCaretController.get(); }
183 #if ENABLE(DRAG_SUPPORT)
184     DragController* dragController() const { return m_dragController.get(); }
185 #endif
186     FocusController* focusController() const { return m_focusController.get(); }
187 #if ENABLE(CONTEXT_MENUS)
188     ContextMenuController* contextMenuController() const { return m_contextMenuController.get(); }
189 #endif
190 #if ENABLE(INSPECTOR)
191     InspectorController* inspectorController() const { return m_inspectorController.get(); }
192 #endif
193 #if ENABLE(POINTER_LOCK)
194     PointerLockController* pointerLockController() const { return m_pointerLockController.get(); }
195 #endif
196     ValidationMessageClient* validationMessageClient() const { return m_validationMessageClient; }
197
198     ScrollingCoordinator* scrollingCoordinator();
199
200     String scrollingStateTreeAsText();
201     String mainThreadScrollingReasonsAsText();
202     PassRefPtr<ClientRectList> nonFastScrollableRects(const Frame*);
203
204     Settings* settings() const { return m_settings.get(); }
205     ProgressTracker* progress() const { return m_progress.get(); }
206     BackForwardController* backForward() const { return m_backForwardController.get(); }
207
208     FeatureObserver* featureObserver() { return &m_featureObserver; }
209
210     enum ViewMode {
211         ViewModeInvalid,
212         ViewModeWindowed,
213         ViewModeFloating,
214         ViewModeFullscreen,
215         ViewModeMaximized,
216         ViewModeMinimized
217     };
218     static ViewMode stringToViewMode(const String&);
219
220     ViewMode viewMode() const { return m_viewMode; }
221     void setViewMode(ViewMode);
222
223     void setTabKeyCyclesThroughElements(bool b) { m_tabKeyCyclesThroughElements = b; }
224     bool tabKeyCyclesThroughElements() const { return m_tabKeyCyclesThroughElements; }
225
226     bool findString(const String&, FindOptions);
227     // FIXME: Switch callers over to the FindOptions version and retire this one.
228     bool findString(const String&, TextCaseSensitivity, FindDirection, bool shouldWrap);
229
230     PassRefPtr<Range> rangeOfString(const String&, Range*, FindOptions);
231
232     unsigned markAllMatchesForText(const String&, FindOptions, bool shouldHighlight, unsigned);
233     // FIXME: Switch callers over to the FindOptions version and retire this one.
234     unsigned markAllMatchesForText(const String&, TextCaseSensitivity, bool shouldHighlight, unsigned);
235     void unmarkAllTextMatches();
236
237     // find all the Ranges for the matching text.
238     // Upon return, indexForSelection will be one of the following:
239     // 0 if there is no user selection
240     // the index of the first range after the user selection
241     // NoMatchBeforeUserSelection if there is no matching text after the user selection.
242     enum { NoMatchBeforeUserSelection = -1 };
243     void findStringMatchingRanges(const String&, FindOptions, int maxCount, Vector<RefPtr<Range> >*, int& indexForSelection);
244 #if PLATFORM(MAC)
245     void addSchedulePair(PassRefPtr<SchedulePair>);
246     void removeSchedulePair(PassRefPtr<SchedulePair>);
247     SchedulePairHashSet* scheduledRunLoopPairs() { return m_scheduledRunLoopPairs.get(); }
248
249     OwnPtr<SchedulePairHashSet> m_scheduledRunLoopPairs;
250 #endif
251
252     const VisibleSelection& selection() const;
253
254     void setDefersLoading(bool);
255     bool defersLoading() const { return m_defersLoading; }
256
257     void clearUndoRedoOperations();
258
259     bool inLowQualityImageInterpolationMode() const;
260     void setInLowQualityImageInterpolationMode(bool = true);
261
262     float mediaVolume() const { return m_mediaVolume; }
263     void setMediaVolume(float);
264
265     void setPageScaleFactor(float scale, const IntPoint& origin);
266     float pageScaleFactor() const { return m_pageScaleFactor; }
267
268     float deviceScaleFactor() const { return m_deviceScaleFactor; }
269     void setDeviceScaleFactor(float);
270
271     bool shouldSuppressScrollbarAnimations() const { return m_suppressScrollbarAnimations; }
272     void setShouldSuppressScrollbarAnimations(bool suppressAnimations);
273
274     bool rubberBandsAtBottom();
275     void setRubberBandsAtBottom(bool);
276     bool rubberBandsAtTop();
277     void setRubberBandsAtTop(bool);
278
279     // Page and FrameView both store a Pagination value. Page::pagination() is set only by API,
280     // and FrameView::pagination() is set only by CSS. Page::pagination() will affect all
281     // FrameViews in the page cache, but FrameView::pagination() only affects the current
282     // FrameView.
283     const Pagination& pagination() const { return m_pagination; }
284     void setPagination(const Pagination&);
285
286     unsigned pageCount() const;
287
288     // Notifications when the Page starts and stops being presented via a native window.
289     void didMoveOnscreen();
290     void willMoveOffscreen();
291     bool isOnscreen() const { return m_isOnscreen; }
292
293     void windowScreenDidChange(PlatformDisplayID);
294
295     void suspendScriptedAnimations();
296     void resumeScriptedAnimations();
297     bool scriptedAnimationsSuspended() const { return m_scriptedAnimationsSuspended; }
298
299     void userStyleSheetLocationChanged();
300     const String& userStyleSheet() const;
301
302     void dnsPrefetchingStateChanged();
303     void storageBlockingStateChanged();
304     void privateBrowsingStateChanged();
305
306     static void setDebuggerForAllPages(JSC::Debugger*);
307     void setDebugger(JSC::Debugger*);
308     JSC::Debugger* debugger() const { return m_debugger; }
309
310     static void removeAllVisitedLinks();
311
312     static void allVisitedStateChanged(PageGroup*);
313     static void visitedStateChanged(PageGroup*, LinkHash visitedHash);
314
315     StorageNamespace* sessionStorage(bool optionalCreate = true);
316     void setSessionStorage(PassRefPtr<StorageNamespace>);
317
318     void setCustomHTMLTokenizerTimeDelay(double);
319     bool hasCustomHTMLTokenizerTimeDelay() const { return m_customHTMLTokenizerTimeDelay != -1; }
320     double customHTMLTokenizerTimeDelay() const { ASSERT(m_customHTMLTokenizerTimeDelay != -1); return m_customHTMLTokenizerTimeDelay; }
321
322     void setCustomHTMLTokenizerChunkSize(int);
323     bool hasCustomHTMLTokenizerChunkSize() const { return m_customHTMLTokenizerChunkSize != -1; }
324     int customHTMLTokenizerChunkSize() const { ASSERT(m_customHTMLTokenizerChunkSize != -1); return m_customHTMLTokenizerChunkSize; }
325
326     void setMemoryCacheClientCallsEnabled(bool);
327     bool areMemoryCacheClientCallsEnabled() const { return m_areMemoryCacheClientCallsEnabled; }
328
329     // Don't allow more than a certain number of frames in a page.
330     // This seems like a reasonable upper bound, and otherwise mutually
331     // recursive frameset pages can quickly bring the program to its knees
332     // with exponential growth in the number of frames.
333     static const int maxNumberOfFrames = 1000;
334
335     void setEditable(bool isEditable) { m_isEditable = isEditable; }
336     bool isEditable() { return m_isEditable; }
337
338 #if ENABLE(PAGE_VISIBILITY_API)
339     PageVisibilityState visibilityState() const;
340 #endif
341 #if ENABLE(PAGE_VISIBILITY_API) || ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
342     void setVisibilityState(PageVisibilityState, bool);
343 #endif
344
345     PlatformDisplayID displayID() const { return m_displayID; }
346
347     void addLayoutMilestones(LayoutMilestones);
348     LayoutMilestones layoutMilestones() const { return m_layoutMilestones; }
349
350     bool isCountingRelevantRepaintedObjects() const;
351     void startCountingRelevantRepaintedObjects();
352     void resetRelevantPaintedObjectCounter();
353     void addRelevantRepaintedObject(RenderObject*, const LayoutRect& objectPaintRect);
354     void addRelevantUnpaintedObject(RenderObject*, const LayoutRect& objectPaintRect);
355
356     void suspendActiveDOMObjectsAndAnimations();
357     void resumeActiveDOMObjectsAndAnimations();
358 #ifndef NDEBUG
359     void setIsPainting(bool painting) { m_isPainting = painting; }
360     bool isPainting() const { return m_isPainting; }
361 #endif
362
363     AlternativeTextClient* alternativeTextClient() const { return m_alternativeTextClient; }
364
365     bool hasSeenPlugin(const String& serviceType) const;
366     bool hasSeenAnyPlugin() const;
367     void sawPlugin(const String& serviceType);
368     void resetSeenPlugins();
369
370     bool hasSeenMediaEngine(const String& engineName) const;
371     bool hasSeenAnyMediaEngine() const;
372     void sawMediaEngine(const String& engineName);
373     void resetSeenMediaEngines();
374
375     void reportMemoryUsage(MemoryObjectInfo*) const;
376
377 private:
378     void initGroup();
379
380 #if ASSERT_DISABLED
381     void checkSubframeCountConsistency() const { }
382 #else
383     void checkSubframeCountConsistency() const;
384 #endif
385
386     MediaCanStartListener* takeAnyMediaCanStartListener();
387
388     void setMinimumTimerInterval(double);
389     double minimumTimerInterval() const;
390
391     void setTimerAlignmentInterval(double);
392     double timerAlignmentInterval() const;
393
394     void collectPluginViews(Vector<RefPtr<PluginViewBase>, 32>& pluginViewBases);
395
396     OwnPtr<Chrome> m_chrome;
397     OwnPtr<DragCaretController> m_dragCaretController;
398
399 #if ENABLE(DRAG_SUPPORT)
400     OwnPtr<DragController> m_dragController;
401 #endif
402     OwnPtr<FocusController> m_focusController;
403 #if ENABLE(CONTEXT_MENUS)
404     OwnPtr<ContextMenuController> m_contextMenuController;
405 #endif
406 #if ENABLE(INSPECTOR)
407     OwnPtr<InspectorController> m_inspectorController;
408 #endif
409 #if ENABLE(POINTER_LOCK)
410     OwnPtr<PointerLockController> m_pointerLockController;
411 #endif
412     RefPtr<ScrollingCoordinator> m_scrollingCoordinator;
413
414     OwnPtr<Settings> m_settings;
415     OwnPtr<ProgressTracker> m_progress;
416
417     OwnPtr<BackForwardController> m_backForwardController;
418     RefPtr<Frame> m_mainFrame;
419
420     mutable RefPtr<PluginData> m_pluginData;
421
422     RefPtr<RenderTheme> m_theme;
423
424     EditorClient* m_editorClient;
425     PlugInClient* m_plugInClient;
426     ValidationMessageClient* m_validationMessageClient;
427
428     FeatureObserver m_featureObserver;
429
430     int m_subframeCount;
431     String m_groupName;
432     bool m_openedByDOM;
433
434     bool m_tabKeyCyclesThroughElements;
435     bool m_defersLoading;
436     unsigned m_defersLoadingCallCount;
437
438     bool m_inLowQualityInterpolationMode;
439     bool m_cookieEnabled;
440     bool m_areMemoryCacheClientCallsEnabled;
441     float m_mediaVolume;
442
443     float m_pageScaleFactor;
444     float m_deviceScaleFactor;
445
446     bool m_suppressScrollbarAnimations;
447
448     Pagination m_pagination;
449
450     String m_userStyleSheetPath;
451     mutable String m_userStyleSheet;
452     mutable bool m_didLoadUserStyleSheet;
453     mutable time_t m_userStyleSheetModificationTime;
454
455     OwnPtr<PageGroup> m_singlePageGroup;
456     PageGroup* m_group;
457
458     JSC::Debugger* m_debugger;
459
460     double m_customHTMLTokenizerTimeDelay;
461     int m_customHTMLTokenizerChunkSize;
462
463     bool m_canStartMedia;
464
465     RefPtr<StorageNamespace> m_sessionStorage;
466
467     ViewMode m_viewMode;
468
469     double m_minimumTimerInterval;
470
471     double m_timerAlignmentInterval;
472
473     bool m_isEditable;
474     bool m_isOnscreen;
475
476 #if ENABLE(PAGE_VISIBILITY_API)
477     PageVisibilityState m_visibilityState;
478 #endif
479     PlatformDisplayID m_displayID;
480
481     LayoutMilestones m_layoutMilestones;
482
483     HashSet<RenderObject*> m_relevantUnpaintedRenderObjects;
484     Region m_relevantPaintedRegion;
485     Region m_relevantUnpaintedRegion;
486     bool m_isCountingRelevantRepaintedObjects;
487 #ifndef NDEBUG
488     bool m_isPainting;
489 #endif
490     AlternativeTextClient* m_alternativeTextClient;
491
492     bool m_scriptedAnimationsSuspended;
493
494     HashSet<String> m_seenPlugins;
495     HashSet<String> m_seenMediaEngines;
496 };
497
498 inline PageGroup& Page::group()
499 {
500     if (!m_group)
501         initGroup();
502     return *m_group;
503 }
504
505 } // namespace WebCore
506     
507 #endif // Page_h