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