Media Session: Add plumbing for media control event delivery.
[WebKit-https.git] / Source / WebCore / page / Page.h
1 /*
2  * Copyright (C) 2006-2010, 2013, 2015 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 "FindOptions.h"
25 #include "FrameLoaderTypes.h"
26 #include "LayoutMilestones.h"
27 #include "LayoutRect.h"
28 #include "MediaProducer.h"
29 #include "PageThrottler.h"
30 #include "PageVisibilityState.h"
31 #include "Pagination.h"
32 #include "PlatformScreen.h"
33 #include "Region.h"
34 #include "ScrollTypes.h"
35 #include "SessionID.h"
36 #include "Supplementable.h"
37 #include "ViewState.h"
38 #include "ViewportArguments.h"
39 #include "WheelEventTestTrigger.h"
40 #include <memory>
41 #include <wtf/Forward.h>
42 #include <wtf/HashMap.h>
43 #include <wtf/HashSet.h>
44 #include <wtf/Noncopyable.h>
45 #include <wtf/Ref.h>
46 #include <wtf/RefCounted.h>
47 #include <wtf/text/WTFString.h>
48
49 #if OS(SOLARIS)
50 #include <sys/time.h> // For time_t structure.
51 #endif
52
53 #if PLATFORM(COCOA)
54 #include <wtf/SchedulePair.h>
55 #endif
56
57 #if ENABLE(MEDIA_SESSION)
58 #include "MediaEventTypes.h"
59 #endif
60
61 namespace JSC {
62 class Debugger;
63 }
64
65 namespace WebCore {
66
67 class AlternativeTextClient;
68 class ApplicationCacheStorage;
69 class BackForwardController;
70 class BackForwardClient;
71 class Chrome;
72 class ChromeClient;
73 class ClientRectList;
74 class Color;
75 class ContextMenuClient;
76 class ContextMenuController;
77 class DatabaseProvider;
78 class DragCaretController;
79 class DragClient;
80 class DragController;
81 class EditorClient;
82 class FocusController;
83 class Frame;
84 class FrameLoaderClient;
85 class HistoryItem;
86 class HTMLMediaElement;
87 class UserInputBridge;
88 class InspectorClient;
89 class InspectorController;
90 class MainFrame;
91 class MediaCanStartListener;
92 class MediaPlaybackTarget;
93 class PageConfiguration;
94 class PageConsoleClient;
95 class PageDebuggable;
96 class PageGroup;
97 class PageThrottler;
98 class PlugInClient;
99 class PluginData;
100 class PluginViewBase;
101 class PointerLockController;
102 class ProgressTracker;
103 class ProgressTrackerClient;
104 class Range;
105 class RenderObject;
106 class RenderTheme;
107 class ReplayController;
108 class VisibleSelection;
109 class ScrollableArea;
110 class ScrollingCoordinator;
111 class Settings;
112 class StorageNamespace;
113 class StorageNamespaceProvider;
114 class UserContentController;
115 class ValidationMessageClient;
116 class ViewStateChangeObserver;
117 class VisitedLinkStore;
118
119 typedef uint64_t LinkHash;
120 class SharedBuffer;
121
122 enum FindDirection { FindDirectionForward, FindDirectionBackward };
123
124 class Page : public Supplementable<Page> {
125     WTF_MAKE_NONCOPYABLE(Page);
126     WTF_MAKE_FAST_ALLOCATED;
127     friend class Settings;
128     friend class PageThrottler;
129
130 public:
131     WEBCORE_EXPORT static void updateStyleForAllPagesAfterGlobalChangeInEnvironment();
132     WEBCORE_EXPORT static void clearPreviousItemFromAllPages(HistoryItem*);
133
134     WEBCORE_EXPORT explicit Page(PageConfiguration&);
135     WEBCORE_EXPORT ~Page();
136
137     WEBCORE_EXPORT uint64_t renderTreeSize() const;
138     
139     static std::unique_ptr<Page> createPageFromBuffer(PageConfiguration&, const SharedBuffer*, const String& mimeType, bool canHaveScrollbars, bool transparent);
140
141     void setNeedsRecalcStyleInAllFrames();
142
143     RenderTheme& theme() const { return *m_theme; }
144
145     WEBCORE_EXPORT ViewportArguments viewportArguments() const;
146
147     static void refreshPlugins(bool reload);
148     WEBCORE_EXPORT PluginData& pluginData() const;
149
150     WEBCORE_EXPORT void setCanStartMedia(bool);
151     bool canStartMedia() const { return m_canStartMedia; }
152
153     EditorClient& editorClient() { return m_editorClient; }
154     PlugInClient* plugInClient() const { return m_plugInClient; }
155
156     MainFrame& mainFrame() { ASSERT(m_mainFrame); return *m_mainFrame; }
157     const MainFrame& mainFrame() const { ASSERT(m_mainFrame); return *m_mainFrame; }
158
159     enum class DismissalType {
160         None,
161         BeforeUnload,
162         PageHide,
163         Unload
164     };
165     DismissalType dismissalEventBeingDispatched() const { return m_dismissalEventBeingDispatched; }
166     void setDismissalEventBeingDispatched(DismissalType dismissalType) { m_dismissalEventBeingDispatched = dismissalType; }
167
168     bool openedByDOM() const;
169     void setOpenedByDOM();
170
171     WEBCORE_EXPORT void goToItem(HistoryItem&, FrameLoadType);
172
173     WEBCORE_EXPORT void setGroupName(const String&);
174     WEBCORE_EXPORT const String& groupName() const;
175
176     PageGroup& group();
177     PageGroup* groupPtr() { return m_group; } // can return 0
178
179     void incrementSubframeCount() { ++m_subframeCount; }
180     void decrementSubframeCount() { ASSERT(m_subframeCount); --m_subframeCount; }
181     int subframeCount() const { checkSubframeCountConsistency(); return m_subframeCount; }
182
183 #if ENABLE(REMOTE_INSPECTOR)
184     WEBCORE_EXPORT bool remoteInspectionAllowed() const;
185     WEBCORE_EXPORT void setRemoteInspectionAllowed(bool);
186     void remoteInspectorInformationDidChange() const;
187 #endif
188
189     Chrome& chrome() const { return *m_chrome; }
190     DragCaretController& dragCaretController() const { return *m_dragCaretController; }
191 #if ENABLE(DRAG_SUPPORT)
192     DragController& dragController() const { return *m_dragController; }
193 #endif
194     FocusController& focusController() const { return *m_focusController; }
195 #if ENABLE(CONTEXT_MENUS)
196     ContextMenuController& contextMenuController() const { return *m_contextMenuController; }
197 #endif
198     UserInputBridge& userInputBridge() const { return *m_userInputBridge; }
199 #if ENABLE(WEB_REPLAY)
200     ReplayController& replayController() const { return *m_replayController; }
201 #endif
202     InspectorController& inspectorController() const { return *m_inspectorController; }
203 #if ENABLE(POINTER_LOCK)
204     PointerLockController& pointerLockController() const { return *m_pointerLockController; }
205 #endif
206     ValidationMessageClient* validationMessageClient() const { return m_validationMessageClient; }
207
208     WEBCORE_EXPORT ScrollingCoordinator* scrollingCoordinator();
209
210     WEBCORE_EXPORT String scrollingStateTreeAsText();
211     WEBCORE_EXPORT String synchronousScrollingReasonsAsText();
212     WEBCORE_EXPORT Ref<ClientRectList> nonFastScrollableRects();
213
214     Settings& settings() const { return *m_settings; }
215     ProgressTracker& progress() const { return *m_progress; }
216     BackForwardController& backForward() const { return *m_backForwardController; }
217
218 #if ENABLE(VIEW_MODE_CSS_MEDIA)
219     enum ViewMode {
220         ViewModeInvalid,
221         ViewModeWindowed,
222         ViewModeFloating,
223         ViewModeFullscreen,
224         ViewModeMaximized,
225         ViewModeMinimized
226     };
227     static ViewMode stringToViewMode(const String&);
228
229     ViewMode viewMode() const { return m_viewMode; }
230     WEBCORE_EXPORT void setViewMode(ViewMode);
231 #endif // ENABLE(VIEW_MODE_CSS_MEDIA)
232
233     void setTabKeyCyclesThroughElements(bool b) { m_tabKeyCyclesThroughElements = b; }
234     bool tabKeyCyclesThroughElements() const { return m_tabKeyCyclesThroughElements; }
235
236     WEBCORE_EXPORT bool findString(const String&, FindOptions);
237
238     WEBCORE_EXPORT RefPtr<Range> rangeOfString(const String&, Range*, FindOptions);
239
240     WEBCORE_EXPORT unsigned countFindMatches(const String&, FindOptions, unsigned maxMatchCount);
241     WEBCORE_EXPORT unsigned markAllMatchesForText(const String&, FindOptions, bool shouldHighlight, unsigned maxMatchCount);
242
243     WEBCORE_EXPORT void unmarkAllTextMatches();
244
245     // find all the Ranges for the matching text.
246     // Upon return, indexForSelection will be one of the following:
247     // 0 if there is no user selection
248     // the index of the first range after the user selection
249     // NoMatchAfterUserSelection if there is no matching text after the user selection.
250     enum { NoMatchAfterUserSelection = -1 };
251     WEBCORE_EXPORT void findStringMatchingRanges(const String&, FindOptions, int maxCount, Vector<RefPtr<Range>>&, int& indexForSelection);
252 #if PLATFORM(COCOA)
253     WEBCORE_EXPORT void addSchedulePair(Ref<SchedulePair>&&);
254     WEBCORE_EXPORT void removeSchedulePair(Ref<SchedulePair>&&);
255     SchedulePairHashSet* scheduledRunLoopPairs() { return m_scheduledRunLoopPairs.get(); }
256
257     std::unique_ptr<SchedulePairHashSet> m_scheduledRunLoopPairs;
258 #endif
259
260     WEBCORE_EXPORT const VisibleSelection& selection() const;
261
262     WEBCORE_EXPORT void setDefersLoading(bool);
263     bool defersLoading() const { return m_defersLoading; }
264
265     WEBCORE_EXPORT void clearUndoRedoOperations();
266
267     WEBCORE_EXPORT bool inLowQualityImageInterpolationMode() const;
268     WEBCORE_EXPORT void setInLowQualityImageInterpolationMode(bool = true);
269
270     float mediaVolume() const { return m_mediaVolume; }
271     WEBCORE_EXPORT void setMediaVolume(float);
272
273     WEBCORE_EXPORT void setPageScaleFactor(float scale, const IntPoint& origin, bool inStableState = true);
274     float pageScaleFactor() const { return m_pageScaleFactor; }
275
276     // The view scale factor is multiplied into the page scale factor by all
277     // callers of setPageScaleFactor.
278     WEBCORE_EXPORT void setViewScaleFactor(float);
279     float viewScaleFactor() const { return m_viewScaleFactor; }
280
281     WEBCORE_EXPORT void setZoomedOutPageScaleFactor(float);
282     float zoomedOutPageScaleFactor() const { return m_zoomedOutPageScaleFactor; }
283
284     float deviceScaleFactor() const { return m_deviceScaleFactor; }
285     WEBCORE_EXPORT void setDeviceScaleFactor(float);
286
287     float topContentInset() const { return m_topContentInset; }
288     WEBCORE_EXPORT void setTopContentInset(float);
289     
290 #if ENABLE(IOS_TEXT_AUTOSIZING)
291     float textAutosizingWidth() const { return m_textAutosizingWidth; }
292     void setTextAutosizingWidth(float textAutosizingWidth) { m_textAutosizingWidth = textAutosizingWidth; }
293 #endif
294     
295     bool shouldSuppressScrollbarAnimations() const { return m_suppressScrollbarAnimations; }
296     WEBCORE_EXPORT void setShouldSuppressScrollbarAnimations(bool suppressAnimations);
297     void lockAllOverlayScrollbarsToHidden(bool lockOverlayScrollbars);
298     
299     WEBCORE_EXPORT void setVerticalScrollElasticity(ScrollElasticity);
300     ScrollElasticity verticalScrollElasticity() const { return static_cast<ScrollElasticity>(m_verticalScrollElasticity); }
301
302     WEBCORE_EXPORT void setHorizontalScrollElasticity(ScrollElasticity);
303     ScrollElasticity horizontalScrollElasticity() const { return static_cast<ScrollElasticity>(m_horizontalScrollElasticity); }
304     
305     // Page and FrameView both store a Pagination value. Page::pagination() is set only by API,
306     // and FrameView::pagination() is set only by CSS. Page::pagination() will affect all
307     // FrameViews in the page cache, but FrameView::pagination() only affects the current
308     // FrameView.
309     const Pagination& pagination() const { return m_pagination; }
310     WEBCORE_EXPORT void setPagination(const Pagination&);
311
312     WEBCORE_EXPORT unsigned pageCount() const;
313
314     // Notifications when the Page starts and stops being presented via a native window.
315     WEBCORE_EXPORT void setViewState(ViewState::Flags);
316     void setPageActivityState(PageActivityState::Flags);
317     WEBCORE_EXPORT void setIsVisible(bool);
318     WEBCORE_EXPORT void setIsPrerender();
319     bool isVisible() const { return m_viewState & ViewState::IsVisible; }
320
321     // Notification that this Page was moved into or out of a native window.
322     WEBCORE_EXPORT void setIsInWindow(bool);
323     bool isInWindow() const { return m_viewState & ViewState::IsInWindow; }
324
325     void setIsClosing() { m_isClosing = true; }
326     bool isClosing() const { return m_isClosing; }
327
328     void addViewStateChangeObserver(ViewStateChangeObserver&);
329     void removeViewStateChangeObserver(ViewStateChangeObserver&);
330
331     WEBCORE_EXPORT void suspendScriptedAnimations();
332     WEBCORE_EXPORT void resumeScriptedAnimations();
333     bool scriptedAnimationsSuspended() const { return m_scriptedAnimationsSuspended; }
334
335     void userStyleSheetLocationChanged();
336     const String& userStyleSheet() const;
337
338     void dnsPrefetchingStateChanged();
339     void storageBlockingStateChanged();
340
341     void setDebugger(JSC::Debugger*);
342     JSC::Debugger* debugger() const { return m_debugger; }
343
344     WEBCORE_EXPORT void invalidateStylesForAllLinks();
345     WEBCORE_EXPORT void invalidateStylesForLink(LinkHash);
346
347     StorageNamespace* sessionStorage(bool optionalCreate = true);
348     void setSessionStorage(RefPtr<StorageNamespace>&&);
349
350     bool hasCustomHTMLTokenizerTimeDelay() const;
351     double customHTMLTokenizerTimeDelay() const;
352
353     WEBCORE_EXPORT void setMemoryCacheClientCallsEnabled(bool);
354     bool areMemoryCacheClientCallsEnabled() const { return m_areMemoryCacheClientCallsEnabled; }
355
356     // Don't allow more than a certain number of frames in a page.
357     // This seems like a reasonable upper bound, and otherwise mutually
358     // recursive frameset pages can quickly bring the program to its knees
359     // with exponential growth in the number of frames.
360     static const int maxNumberOfFrames = 1000;
361
362     void setEditable(bool isEditable) { m_isEditable = isEditable; }
363     bool isEditable() { return m_isEditable; }
364
365     WEBCORE_EXPORT PageVisibilityState visibilityState() const;
366     WEBCORE_EXPORT void resumeAnimatingImages();
367
368     WEBCORE_EXPORT void addLayoutMilestones(LayoutMilestones);
369     WEBCORE_EXPORT void removeLayoutMilestones(LayoutMilestones);
370     LayoutMilestones requestedLayoutMilestones() const { return m_requestedLayoutMilestones; }
371
372 #if ENABLE(RUBBER_BANDING)
373     WEBCORE_EXPORT void addHeaderWithHeight(int);
374     WEBCORE_EXPORT void addFooterWithHeight(int);
375 #endif
376
377     int headerHeight() const { return m_headerHeight; }
378     int footerHeight() const { return m_footerHeight; }
379
380     WEBCORE_EXPORT Color pageExtendedBackgroundColor() const;
381
382     bool isCountingRelevantRepaintedObjects() const;
383     void setIsCountingRelevantRepaintedObjects(bool isCounting) { m_isCountingRelevantRepaintedObjects = isCounting; }
384     void startCountingRelevantRepaintedObjects();
385     void resetRelevantPaintedObjectCounter();
386     void addRelevantRepaintedObject(RenderObject*, const LayoutRect& objectPaintRect);
387     void addRelevantUnpaintedObject(RenderObject*, const LayoutRect& objectPaintRect);
388
389     WEBCORE_EXPORT void suspendActiveDOMObjectsAndAnimations();
390     WEBCORE_EXPORT void resumeActiveDOMObjectsAndAnimations();
391 #ifndef NDEBUG
392     void setIsPainting(bool painting) { m_isPainting = painting; }
393     bool isPainting() const { return m_isPainting; }
394 #endif
395
396     AlternativeTextClient* alternativeTextClient() const { return m_alternativeTextClient; }
397
398     bool hasSeenPlugin(const String& serviceType) const;
399     WEBCORE_EXPORT bool hasSeenAnyPlugin() const;
400     void sawPlugin(const String& serviceType);
401     void resetSeenPlugins();
402
403     bool hasSeenMediaEngine(const String& engineName) const;
404     bool hasSeenAnyMediaEngine() const;
405     void sawMediaEngine(const String& engineName);
406     void resetSeenMediaEngines();
407
408     PageThrottler& pageThrottler() { return m_pageThrottler; }
409
410     PageConsoleClient& console() { return *m_consoleClient; }
411
412 #if ENABLE(REMOTE_INSPECTOR)
413     PageDebuggable& inspectorDebuggable() const { return *m_inspectorDebuggable.get(); }
414 #endif
415
416     void hiddenPageCSSAnimationSuspensionStateChanged();
417
418 #if ENABLE(VIDEO_TRACK)
419     void captionPreferencesChanged();
420 #endif
421
422     void incrementFrameHandlingBeforeUnloadEventCount();
423     void decrementFrameHandlingBeforeUnloadEventCount();
424     bool isAnyFrameHandlingBeforeUnloadEvent();
425     void setLastSpatialNavigationCandidateCount(unsigned count) { m_lastSpatialNavigationCandidatesCount = count; }
426     unsigned lastSpatialNavigationCandidateCount() const { return m_lastSpatialNavigationCandidatesCount; }
427
428     ApplicationCacheStorage& applicationCacheStorage() { return m_applicationCacheStorage; }
429     DatabaseProvider& databaseProvider() { return m_databaseProvider; }
430
431     StorageNamespaceProvider& storageNamespaceProvider() { return m_storageNamespaceProvider.get(); }
432     void setStorageNamespaceProvider(Ref<StorageNamespaceProvider>&&);
433
434     UserContentController* userContentController() { return m_userContentController.get(); }
435     WEBCORE_EXPORT void setUserContentController(UserContentController*);
436
437     VisitedLinkStore& visitedLinkStore();
438     WEBCORE_EXPORT void setVisitedLinkStore(Ref<VisitedLinkStore>&&);
439
440     WEBCORE_EXPORT SessionID sessionID() const;
441     WEBCORE_EXPORT void setSessionID(SessionID);
442     WEBCORE_EXPORT void enableLegacyPrivateBrowsing(bool privateBrowsingEnabled);
443     bool usesEphemeralSession() const { return m_sessionID.isEphemeral(); }
444
445     MediaProducer::MediaStateFlags mediaState() const { return m_mediaState; }
446     void updateIsPlayingMedia();
447     bool isMuted() const { return m_muted; }
448     WEBCORE_EXPORT void setMuted(bool);
449
450 #if ENABLE(MEDIA_SESSION)
451     WEBCORE_EXPORT void handleMediaEvent(MediaEventType);
452 #endif
453
454 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
455     void addPlaybackTargetPickerClient(uint64_t);
456     void removePlaybackTargetPickerClient(uint64_t);
457     void showPlaybackTargetPicker(uint64_t, const WebCore::IntPoint&, bool);
458     void playbackTargetPickerClientStateDidChange(uint64_t, MediaProducer::MediaStateFlags);
459
460     WEBCORE_EXPORT void setPlaybackTarget(uint64_t, Ref<MediaPlaybackTarget>&&);
461     WEBCORE_EXPORT void playbackTargetAvailabilityDidChange(uint64_t, bool);
462     WEBCORE_EXPORT void setShouldPlayToPlaybackTarget(uint64_t, bool);
463 #endif
464
465     RefPtr<WheelEventTestTrigger> testTrigger() const { return m_testTrigger; }
466     WEBCORE_EXPORT WheelEventTestTrigger& ensureTestTrigger();
467     void clearTrigger() { m_testTrigger = nullptr; }
468     bool expectsWheelEventTriggers() const { return !!m_testTrigger; }
469
470 private:
471     WEBCORE_EXPORT void initGroup();
472
473     void setIsInWindowInternal(bool);
474     void setIsVisibleInternal(bool);
475     void setIsVisuallyIdleInternal(bool);
476
477 #if ASSERT_DISABLED
478     void checkSubframeCountConsistency() const { }
479 #else
480     void checkSubframeCountConsistency() const;
481 #endif
482
483     enum ShouldHighlightMatches { DoNotHighlightMatches, HighlightMatches };
484     enum ShouldMarkMatches { DoNotMarkMatches, MarkMatches };
485
486     unsigned findMatchesForText(const String&, FindOptions, unsigned maxMatchCount, ShouldHighlightMatches, ShouldMarkMatches);
487
488     MediaCanStartListener* takeAnyMediaCanStartListener();
489
490     Vector<Ref<PluginViewBase>> pluginViews();
491
492     void hiddenPageDOMTimerThrottlingStateChanged();
493     void setTimerThrottlingEnabled(bool);
494
495     const std::unique_ptr<Chrome> m_chrome;
496     const std::unique_ptr<DragCaretController> m_dragCaretController;
497
498 #if ENABLE(DRAG_SUPPORT)
499     const std::unique_ptr<DragController> m_dragController;
500 #endif
501     const std::unique_ptr<FocusController> m_focusController;
502 #if ENABLE(CONTEXT_MENUS)
503     const std::unique_ptr<ContextMenuController> m_contextMenuController;
504 #endif
505     const std::unique_ptr<UserInputBridge> m_userInputBridge;
506 #if ENABLE(WEB_REPLAY)
507     const std::unique_ptr<ReplayController> m_replayController;
508 #endif
509     const std::unique_ptr<InspectorController> m_inspectorController;
510 #if ENABLE(POINTER_LOCK)
511     const std::unique_ptr<PointerLockController> m_pointerLockController;
512 #endif
513     RefPtr<ScrollingCoordinator> m_scrollingCoordinator;
514
515     const RefPtr<Settings> m_settings;
516     const std::unique_ptr<ProgressTracker> m_progress;
517
518     const std::unique_ptr<BackForwardController> m_backForwardController;
519     const RefPtr<MainFrame> m_mainFrame;
520
521     mutable RefPtr<PluginData> m_pluginData;
522
523     RefPtr<RenderTheme> m_theme;
524
525     EditorClient& m_editorClient;
526     PlugInClient* m_plugInClient;
527     ValidationMessageClient* m_validationMessageClient;
528
529     int m_subframeCount;
530     String m_groupName;
531     bool m_openedByDOM;
532
533     bool m_tabKeyCyclesThroughElements;
534     bool m_defersLoading;
535     unsigned m_defersLoadingCallCount;
536
537     bool m_inLowQualityInterpolationMode;
538     bool m_areMemoryCacheClientCallsEnabled;
539     float m_mediaVolume;
540     bool m_muted;
541
542     float m_pageScaleFactor;
543     float m_zoomedOutPageScaleFactor;
544     float m_deviceScaleFactor;
545     float m_viewScaleFactor { 1 };
546
547     float m_topContentInset;
548     
549 #if ENABLE(IOS_TEXT_AUTOSIZING)
550     float m_textAutosizingWidth;
551 #endif
552     
553     bool m_suppressScrollbarAnimations;
554     
555     unsigned m_verticalScrollElasticity : 2; // ScrollElasticity
556     unsigned m_horizontalScrollElasticity : 2; // ScrollElasticity    
557
558     Pagination m_pagination;
559
560     String m_userStyleSheetPath;
561     mutable String m_userStyleSheet;
562     mutable bool m_didLoadUserStyleSheet;
563     mutable time_t m_userStyleSheetModificationTime;
564
565     std::unique_ptr<PageGroup> m_singlePageGroup;
566     PageGroup* m_group;
567
568     JSC::Debugger* m_debugger;
569
570     bool m_canStartMedia;
571
572     RefPtr<StorageNamespace> m_sessionStorage;
573
574 #if ENABLE(VIEW_MODE_CSS_MEDIA)
575     ViewMode m_viewMode;
576 #endif // ENABLE(VIEW_MODE_CSS_MEDIA)
577
578     bool m_timerThrottlingEnabled;
579
580     bool m_isEditable;
581     bool m_isPrerender;
582     ViewState::Flags m_viewState;
583
584     LayoutMilestones m_requestedLayoutMilestones;
585
586     int m_headerHeight;
587     int m_footerHeight;
588
589     HashSet<RenderObject*> m_relevantUnpaintedRenderObjects;
590     Region m_topRelevantPaintedRegion;
591     Region m_bottomRelevantPaintedRegion;
592     Region m_relevantUnpaintedRegion;
593     bool m_isCountingRelevantRepaintedObjects;
594 #ifndef NDEBUG
595     bool m_isPainting;
596 #endif
597     AlternativeTextClient* m_alternativeTextClient;
598
599     bool m_scriptedAnimationsSuspended;
600     PageThrottler m_pageThrottler;
601     const std::unique_ptr<PageConsoleClient> m_consoleClient;
602
603 #if ENABLE(REMOTE_INSPECTOR)
604     const std::unique_ptr<PageDebuggable> m_inspectorDebuggable;
605 #endif
606
607     HashSet<String> m_seenPlugins;
608     HashSet<String> m_seenMediaEngines;
609
610     unsigned m_lastSpatialNavigationCandidatesCount;
611     unsigned m_framesHandlingBeforeUnloadEvent;
612
613     Ref<ApplicationCacheStorage> m_applicationCacheStorage;
614     Ref<DatabaseProvider> m_databaseProvider;
615     Ref<StorageNamespaceProvider> m_storageNamespaceProvider;
616     RefPtr<UserContentController> m_userContentController;
617     Ref<VisitedLinkStore> m_visitedLinkStore;
618     RefPtr<WheelEventTestTrigger> m_testTrigger;
619
620     HashSet<ViewStateChangeObserver*> m_viewStateChangeObservers;
621
622     SessionID m_sessionID;
623
624     bool m_isClosing;
625
626     MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying };
627     DismissalType m_dismissalEventBeingDispatched { DismissalType::None };
628 };
629
630 inline PageGroup& Page::group()
631 {
632     if (!m_group)
633         initGroup();
634     return *m_group;
635 }
636
637 } // namespace WebCore
638     
639 #endif // Page_h