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