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/)
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.
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.
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.
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"
34 #include "ScrollTypes.h"
35 #include "SessionID.h"
36 #include "Supplementable.h"
37 #include "ViewState.h"
38 #include "ViewportArguments.h"
39 #include "WheelEventTestTrigger.h"
41 #include <wtf/Forward.h>
42 #include <wtf/HashMap.h>
43 #include <wtf/HashSet.h>
44 #include <wtf/Noncopyable.h>
46 #include <wtf/RefCounted.h>
47 #include <wtf/text/WTFString.h>
50 #include <sys/time.h> // For time_t structure.
54 #include <wtf/SchedulePair.h>
57 #if ENABLE(MEDIA_SESSION)
58 #include "MediaEventTypes.h"
67 class AlternativeTextClient;
68 class ApplicationCacheStorage;
69 class BackForwardController;
70 class BackForwardClient;
75 class ContextMenuClient;
76 class ContextMenuController;
77 class DatabaseProvider;
78 class DragCaretController;
82 class FocusController;
84 class FrameLoaderClient;
86 class HTMLMediaElement;
87 class UserInputBridge;
88 class InspectorClient;
89 class InspectorController;
91 class MediaCanStartListener;
92 class MediaPlaybackTarget;
93 class PageConfiguration;
94 class PageConsoleClient;
100 class PluginViewBase;
101 class PointerLockController;
102 class ProgressTracker;
103 class ProgressTrackerClient;
107 class ReplayController;
108 class VisibleSelection;
109 class ScrollableArea;
110 class ScrollingCoordinator;
112 class StorageNamespace;
113 class StorageNamespaceProvider;
114 class UserContentController;
115 class ValidationMessageClient;
116 class ViewStateChangeObserver;
117 class VisitedLinkStore;
119 typedef uint64_t LinkHash;
122 enum FindDirection { FindDirectionForward, FindDirectionBackward };
124 class Page : public Supplementable<Page> {
125 WTF_MAKE_NONCOPYABLE(Page);
126 WTF_MAKE_FAST_ALLOCATED;
127 friend class Settings;
128 friend class PageThrottler;
131 WEBCORE_EXPORT static void updateStyleForAllPagesAfterGlobalChangeInEnvironment();
132 WEBCORE_EXPORT static void clearPreviousItemFromAllPages(HistoryItem*);
134 WEBCORE_EXPORT explicit Page(PageConfiguration&);
135 WEBCORE_EXPORT ~Page();
137 WEBCORE_EXPORT uint64_t renderTreeSize() const;
139 static std::unique_ptr<Page> createPageFromBuffer(PageConfiguration&, const SharedBuffer*, const String& mimeType, bool canHaveScrollbars, bool transparent);
141 void setNeedsRecalcStyleInAllFrames();
143 RenderTheme& theme() const { return *m_theme; }
145 WEBCORE_EXPORT ViewportArguments viewportArguments() const;
147 static void refreshPlugins(bool reload);
148 WEBCORE_EXPORT PluginData& pluginData() const;
150 WEBCORE_EXPORT void setCanStartMedia(bool);
151 bool canStartMedia() const { return m_canStartMedia; }
153 EditorClient& editorClient() { return m_editorClient; }
154 PlugInClient* plugInClient() const { return m_plugInClient; }
156 MainFrame& mainFrame() { ASSERT(m_mainFrame); return *m_mainFrame; }
157 const MainFrame& mainFrame() const { ASSERT(m_mainFrame); return *m_mainFrame; }
159 enum class DismissalType {
165 DismissalType dismissalEventBeingDispatched() const { return m_dismissalEventBeingDispatched; }
166 void setDismissalEventBeingDispatched(DismissalType dismissalType) { m_dismissalEventBeingDispatched = dismissalType; }
168 bool openedByDOM() const;
169 void setOpenedByDOM();
171 WEBCORE_EXPORT void goToItem(HistoryItem&, FrameLoadType);
173 WEBCORE_EXPORT void setGroupName(const String&);
174 WEBCORE_EXPORT const String& groupName() const;
177 PageGroup* groupPtr() { return m_group; } // can return 0
179 void incrementSubframeCount() { ++m_subframeCount; }
180 void decrementSubframeCount() { ASSERT(m_subframeCount); --m_subframeCount; }
181 int subframeCount() const { checkSubframeCountConsistency(); return m_subframeCount; }
183 #if ENABLE(REMOTE_INSPECTOR)
184 WEBCORE_EXPORT bool remoteInspectionAllowed() const;
185 WEBCORE_EXPORT void setRemoteInspectionAllowed(bool);
186 void remoteInspectorInformationDidChange() const;
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; }
194 FocusController& focusController() const { return *m_focusController; }
195 #if ENABLE(CONTEXT_MENUS)
196 ContextMenuController& contextMenuController() const { return *m_contextMenuController; }
198 UserInputBridge& userInputBridge() const { return *m_userInputBridge; }
199 #if ENABLE(WEB_REPLAY)
200 ReplayController& replayController() const { return *m_replayController; }
202 InspectorController& inspectorController() const { return *m_inspectorController; }
203 #if ENABLE(POINTER_LOCK)
204 PointerLockController& pointerLockController() const { return *m_pointerLockController; }
206 ValidationMessageClient* validationMessageClient() const { return m_validationMessageClient; }
208 WEBCORE_EXPORT ScrollingCoordinator* scrollingCoordinator();
210 WEBCORE_EXPORT String scrollingStateTreeAsText();
211 WEBCORE_EXPORT String synchronousScrollingReasonsAsText();
212 WEBCORE_EXPORT Ref<ClientRectList> nonFastScrollableRects();
214 Settings& settings() const { return *m_settings; }
215 ProgressTracker& progress() const { return *m_progress; }
216 BackForwardController& backForward() const { return *m_backForwardController; }
218 #if ENABLE(VIEW_MODE_CSS_MEDIA)
227 static ViewMode stringToViewMode(const String&);
229 ViewMode viewMode() const { return m_viewMode; }
230 WEBCORE_EXPORT void setViewMode(ViewMode);
231 #endif // ENABLE(VIEW_MODE_CSS_MEDIA)
233 void setTabKeyCyclesThroughElements(bool b) { m_tabKeyCyclesThroughElements = b; }
234 bool tabKeyCyclesThroughElements() const { return m_tabKeyCyclesThroughElements; }
236 WEBCORE_EXPORT bool findString(const String&, FindOptions);
238 WEBCORE_EXPORT RefPtr<Range> rangeOfString(const String&, Range*, FindOptions);
240 WEBCORE_EXPORT unsigned countFindMatches(const String&, FindOptions, unsigned maxMatchCount);
241 WEBCORE_EXPORT unsigned markAllMatchesForText(const String&, FindOptions, bool shouldHighlight, unsigned maxMatchCount);
243 WEBCORE_EXPORT void unmarkAllTextMatches();
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);
253 WEBCORE_EXPORT void addSchedulePair(Ref<SchedulePair>&&);
254 WEBCORE_EXPORT void removeSchedulePair(Ref<SchedulePair>&&);
255 SchedulePairHashSet* scheduledRunLoopPairs() { return m_scheduledRunLoopPairs.get(); }
257 std::unique_ptr<SchedulePairHashSet> m_scheduledRunLoopPairs;
260 WEBCORE_EXPORT const VisibleSelection& selection() const;
262 WEBCORE_EXPORT void setDefersLoading(bool);
263 bool defersLoading() const { return m_defersLoading; }
265 WEBCORE_EXPORT void clearUndoRedoOperations();
267 WEBCORE_EXPORT bool inLowQualityImageInterpolationMode() const;
268 WEBCORE_EXPORT void setInLowQualityImageInterpolationMode(bool = true);
270 float mediaVolume() const { return m_mediaVolume; }
271 WEBCORE_EXPORT void setMediaVolume(float);
273 WEBCORE_EXPORT void setPageScaleFactor(float scale, const IntPoint& origin, bool inStableState = true);
274 float pageScaleFactor() const { return m_pageScaleFactor; }
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; }
281 WEBCORE_EXPORT void setZoomedOutPageScaleFactor(float);
282 float zoomedOutPageScaleFactor() const { return m_zoomedOutPageScaleFactor; }
284 float deviceScaleFactor() const { return m_deviceScaleFactor; }
285 WEBCORE_EXPORT void setDeviceScaleFactor(float);
287 float topContentInset() const { return m_topContentInset; }
288 WEBCORE_EXPORT void setTopContentInset(float);
290 #if ENABLE(IOS_TEXT_AUTOSIZING)
291 float textAutosizingWidth() const { return m_textAutosizingWidth; }
292 void setTextAutosizingWidth(float textAutosizingWidth) { m_textAutosizingWidth = textAutosizingWidth; }
295 bool shouldSuppressScrollbarAnimations() const { return m_suppressScrollbarAnimations; }
296 WEBCORE_EXPORT void setShouldSuppressScrollbarAnimations(bool suppressAnimations);
297 void lockAllOverlayScrollbarsToHidden(bool lockOverlayScrollbars);
299 WEBCORE_EXPORT void setVerticalScrollElasticity(ScrollElasticity);
300 ScrollElasticity verticalScrollElasticity() const { return static_cast<ScrollElasticity>(m_verticalScrollElasticity); }
302 WEBCORE_EXPORT void setHorizontalScrollElasticity(ScrollElasticity);
303 ScrollElasticity horizontalScrollElasticity() const { return static_cast<ScrollElasticity>(m_horizontalScrollElasticity); }
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
309 const Pagination& pagination() const { return m_pagination; }
310 WEBCORE_EXPORT void setPagination(const Pagination&);
312 WEBCORE_EXPORT unsigned pageCount() const;
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; }
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; }
325 void setIsClosing() { m_isClosing = true; }
326 bool isClosing() const { return m_isClosing; }
328 void addViewStateChangeObserver(ViewStateChangeObserver&);
329 void removeViewStateChangeObserver(ViewStateChangeObserver&);
331 WEBCORE_EXPORT void suspendScriptedAnimations();
332 WEBCORE_EXPORT void resumeScriptedAnimations();
333 bool scriptedAnimationsSuspended() const { return m_scriptedAnimationsSuspended; }
335 void userStyleSheetLocationChanged();
336 const String& userStyleSheet() const;
338 void dnsPrefetchingStateChanged();
339 void storageBlockingStateChanged();
341 void setDebugger(JSC::Debugger*);
342 JSC::Debugger* debugger() const { return m_debugger; }
344 WEBCORE_EXPORT void invalidateStylesForAllLinks();
345 WEBCORE_EXPORT void invalidateStylesForLink(LinkHash);
347 StorageNamespace* sessionStorage(bool optionalCreate = true);
348 void setSessionStorage(RefPtr<StorageNamespace>&&);
350 bool hasCustomHTMLTokenizerTimeDelay() const;
351 double customHTMLTokenizerTimeDelay() const;
353 WEBCORE_EXPORT void setMemoryCacheClientCallsEnabled(bool);
354 bool areMemoryCacheClientCallsEnabled() const { return m_areMemoryCacheClientCallsEnabled; }
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;
362 void setEditable(bool isEditable) { m_isEditable = isEditable; }
363 bool isEditable() { return m_isEditable; }
365 WEBCORE_EXPORT PageVisibilityState visibilityState() const;
366 WEBCORE_EXPORT void resumeAnimatingImages();
368 WEBCORE_EXPORT void addLayoutMilestones(LayoutMilestones);
369 WEBCORE_EXPORT void removeLayoutMilestones(LayoutMilestones);
370 LayoutMilestones requestedLayoutMilestones() const { return m_requestedLayoutMilestones; }
372 #if ENABLE(RUBBER_BANDING)
373 WEBCORE_EXPORT void addHeaderWithHeight(int);
374 WEBCORE_EXPORT void addFooterWithHeight(int);
377 int headerHeight() const { return m_headerHeight; }
378 int footerHeight() const { return m_footerHeight; }
380 WEBCORE_EXPORT Color pageExtendedBackgroundColor() const;
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);
389 WEBCORE_EXPORT void suspendActiveDOMObjectsAndAnimations();
390 WEBCORE_EXPORT void resumeActiveDOMObjectsAndAnimations();
392 void setIsPainting(bool painting) { m_isPainting = painting; }
393 bool isPainting() const { return m_isPainting; }
396 AlternativeTextClient* alternativeTextClient() const { return m_alternativeTextClient; }
398 bool hasSeenPlugin(const String& serviceType) const;
399 WEBCORE_EXPORT bool hasSeenAnyPlugin() const;
400 void sawPlugin(const String& serviceType);
401 void resetSeenPlugins();
403 bool hasSeenMediaEngine(const String& engineName) const;
404 bool hasSeenAnyMediaEngine() const;
405 void sawMediaEngine(const String& engineName);
406 void resetSeenMediaEngines();
408 PageThrottler& pageThrottler() { return m_pageThrottler; }
410 PageConsoleClient& console() { return *m_consoleClient; }
412 #if ENABLE(REMOTE_INSPECTOR)
413 PageDebuggable& inspectorDebuggable() const { return *m_inspectorDebuggable.get(); }
416 void hiddenPageCSSAnimationSuspensionStateChanged();
418 #if ENABLE(VIDEO_TRACK)
419 void captionPreferencesChanged();
422 void incrementFrameHandlingBeforeUnloadEventCount();
423 void decrementFrameHandlingBeforeUnloadEventCount();
424 bool isAnyFrameHandlingBeforeUnloadEvent();
425 void setLastSpatialNavigationCandidateCount(unsigned count) { m_lastSpatialNavigationCandidatesCount = count; }
426 unsigned lastSpatialNavigationCandidateCount() const { return m_lastSpatialNavigationCandidatesCount; }
428 ApplicationCacheStorage& applicationCacheStorage() { return m_applicationCacheStorage; }
429 DatabaseProvider& databaseProvider() { return m_databaseProvider; }
431 StorageNamespaceProvider& storageNamespaceProvider() { return m_storageNamespaceProvider.get(); }
432 void setStorageNamespaceProvider(Ref<StorageNamespaceProvider>&&);
434 UserContentController* userContentController() { return m_userContentController.get(); }
435 WEBCORE_EXPORT void setUserContentController(UserContentController*);
437 VisitedLinkStore& visitedLinkStore();
438 WEBCORE_EXPORT void setVisitedLinkStore(Ref<VisitedLinkStore>&&);
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(); }
445 MediaProducer::MediaStateFlags mediaState() const { return m_mediaState; }
446 void updateIsPlayingMedia();
447 bool isMuted() const { return m_muted; }
448 WEBCORE_EXPORT void setMuted(bool);
450 #if ENABLE(MEDIA_SESSION)
451 WEBCORE_EXPORT void handleMediaEvent(MediaEventType);
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);
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);
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; }
471 WEBCORE_EXPORT void initGroup();
473 void setIsInWindowInternal(bool);
474 void setIsVisibleInternal(bool);
475 void setIsVisuallyIdleInternal(bool);
478 void checkSubframeCountConsistency() const { }
480 void checkSubframeCountConsistency() const;
483 enum ShouldHighlightMatches { DoNotHighlightMatches, HighlightMatches };
484 enum ShouldMarkMatches { DoNotMarkMatches, MarkMatches };
486 unsigned findMatchesForText(const String&, FindOptions, unsigned maxMatchCount, ShouldHighlightMatches, ShouldMarkMatches);
488 MediaCanStartListener* takeAnyMediaCanStartListener();
490 Vector<Ref<PluginViewBase>> pluginViews();
492 void hiddenPageDOMTimerThrottlingStateChanged();
493 void setTimerThrottlingEnabled(bool);
495 const std::unique_ptr<Chrome> m_chrome;
496 const std::unique_ptr<DragCaretController> m_dragCaretController;
498 #if ENABLE(DRAG_SUPPORT)
499 const std::unique_ptr<DragController> m_dragController;
501 const std::unique_ptr<FocusController> m_focusController;
502 #if ENABLE(CONTEXT_MENUS)
503 const std::unique_ptr<ContextMenuController> m_contextMenuController;
505 const std::unique_ptr<UserInputBridge> m_userInputBridge;
506 #if ENABLE(WEB_REPLAY)
507 const std::unique_ptr<ReplayController> m_replayController;
509 const std::unique_ptr<InspectorController> m_inspectorController;
510 #if ENABLE(POINTER_LOCK)
511 const std::unique_ptr<PointerLockController> m_pointerLockController;
513 RefPtr<ScrollingCoordinator> m_scrollingCoordinator;
515 const RefPtr<Settings> m_settings;
516 const std::unique_ptr<ProgressTracker> m_progress;
518 const std::unique_ptr<BackForwardController> m_backForwardController;
519 const RefPtr<MainFrame> m_mainFrame;
521 mutable RefPtr<PluginData> m_pluginData;
523 RefPtr<RenderTheme> m_theme;
525 EditorClient& m_editorClient;
526 PlugInClient* m_plugInClient;
527 ValidationMessageClient* m_validationMessageClient;
533 bool m_tabKeyCyclesThroughElements;
534 bool m_defersLoading;
535 unsigned m_defersLoadingCallCount;
537 bool m_inLowQualityInterpolationMode;
538 bool m_areMemoryCacheClientCallsEnabled;
542 float m_pageScaleFactor;
543 float m_zoomedOutPageScaleFactor;
544 float m_deviceScaleFactor;
545 float m_viewScaleFactor { 1 };
547 float m_topContentInset;
549 #if ENABLE(IOS_TEXT_AUTOSIZING)
550 float m_textAutosizingWidth;
553 bool m_suppressScrollbarAnimations;
555 unsigned m_verticalScrollElasticity : 2; // ScrollElasticity
556 unsigned m_horizontalScrollElasticity : 2; // ScrollElasticity
558 Pagination m_pagination;
560 String m_userStyleSheetPath;
561 mutable String m_userStyleSheet;
562 mutable bool m_didLoadUserStyleSheet;
563 mutable time_t m_userStyleSheetModificationTime;
565 std::unique_ptr<PageGroup> m_singlePageGroup;
568 JSC::Debugger* m_debugger;
570 bool m_canStartMedia;
572 RefPtr<StorageNamespace> m_sessionStorage;
574 #if ENABLE(VIEW_MODE_CSS_MEDIA)
576 #endif // ENABLE(VIEW_MODE_CSS_MEDIA)
578 bool m_timerThrottlingEnabled;
582 ViewState::Flags m_viewState;
584 LayoutMilestones m_requestedLayoutMilestones;
589 HashSet<RenderObject*> m_relevantUnpaintedRenderObjects;
590 Region m_topRelevantPaintedRegion;
591 Region m_bottomRelevantPaintedRegion;
592 Region m_relevantUnpaintedRegion;
593 bool m_isCountingRelevantRepaintedObjects;
597 AlternativeTextClient* m_alternativeTextClient;
599 bool m_scriptedAnimationsSuspended;
600 PageThrottler m_pageThrottler;
601 const std::unique_ptr<PageConsoleClient> m_consoleClient;
603 #if ENABLE(REMOTE_INSPECTOR)
604 const std::unique_ptr<PageDebuggable> m_inspectorDebuggable;
607 HashSet<String> m_seenPlugins;
608 HashSet<String> m_seenMediaEngines;
610 unsigned m_lastSpatialNavigationCandidatesCount;
611 unsigned m_framesHandlingBeforeUnloadEvent;
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;
620 HashSet<ViewStateChangeObserver*> m_viewStateChangeObservers;
622 SessionID m_sessionID;
626 MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying };
627 DismissalType m_dismissalEventBeingDispatched { DismissalType::None };
630 inline PageGroup& Page::group()
637 } // namespace WebCore