• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2013 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 "core/dom/ViewportDescription.h"
25 #include "core/frame/SettingsDelegate.h"
26 #include "core/frame/UseCounter.h"
27 #include "core/loader/HistoryController.h"
28 #include "core/page/PageVisibilityState.h"
29 #include "core/rendering/Pagination.h"
30 #include "platform/LifecycleContext.h"
31 #include "platform/Supplementable.h"
32 #include "platform/geometry/LayoutRect.h"
33 #include "platform/geometry/Region.h"
34 #include "wtf/Forward.h"
35 #include "wtf/HashSet.h"
36 #include "wtf/Noncopyable.h"
37 #include "wtf/text/WTFString.h"
38 
39 namespace WebCore {
40 
41 class AutoscrollController;
42 class BackForwardClient;
43 class Chrome;
44 class ChromeClient;
45 class ClientRectList;
46 class ContextMenuClient;
47 class ContextMenuController;
48 class Document;
49 class DragCaretController;
50 class DragClient;
51 class DragController;
52 class EditorClient;
53 class FocusController;
54 class Frame;
55 class FrameSelection;
56 class HaltablePlugin;
57 class HistoryItem;
58 class InspectorClient;
59 class InspectorController;
60 class Node;
61 class PageConsole;
62 class PageGroup;
63 class PageLifecycleNotifier;
64 class PlatformMouseEvent;
65 class PluginData;
66 class PointerLockController;
67 class ProgressTracker;
68 class Range;
69 class RenderBox;
70 class RenderObject;
71 class RenderTheme;
72 class VisibleSelection;
73 class ScrollableArea;
74 class ScrollingCoordinator;
75 class Settings;
76 class SharedWorkerRepositoryClient;
77 class SpellCheckerClient;
78 class StorageNamespace;
79 class UndoStack;
80 class ValidationMessageClient;
81 
82 typedef uint64_t LinkHash;
83 
84 float deviceScaleFactor(Frame*);
85 
86 class Page : public Supplementable<Page>, public LifecycleContext<Page>, public SettingsDelegate {
87     WTF_MAKE_NONCOPYABLE(Page);
88     friend class Settings;
89 public:
90     static void scheduleForcedStyleRecalcForAllPages();
91 
92     // It is up to the platform to ensure that non-null clients are provided where required.
93     struct PageClients {
94         WTF_MAKE_NONCOPYABLE(PageClients); WTF_MAKE_FAST_ALLOCATED;
95     public:
96         PageClients();
97         ~PageClients();
98 
99         ChromeClient* chromeClient;
100         ContextMenuClient* contextMenuClient;
101         EditorClient* editorClient;
102         DragClient* dragClient;
103         InspectorClient* inspectorClient;
104         BackForwardClient* backForwardClient;
105         SpellCheckerClient* spellCheckerClient;
106     };
107 
108     explicit Page(PageClients&);
109     ~Page();
110 
111     void setNeedsRecalcStyleInAllFrames();
112 
113     ViewportDescription viewportDescription() const;
114 
115     static void refreshPlugins(bool reload);
116     PluginData* pluginData() const;
117 
editorClient()118     EditorClient& editorClient() const { return *m_editorClient; }
spellCheckerClient()119     SpellCheckerClient& spellCheckerClient() const { return *m_spellCheckerClient; }
undoStack()120     UndoStack& undoStack() const { return *m_undoStack; }
121 
historyController()122     HistoryController& historyController() const { return *m_historyController; }
123 
124     void setMainFrame(PassRefPtr<Frame>);
mainFrame()125     Frame* mainFrame() const { return m_mainFrame.get(); }
126 
127     void documentDetached(Document*);
128 
129     bool openedByDOM() const;
130     void setOpenedByDOM();
131 
132     enum PageGroupType { PrivatePageGroup, SharedPageGroup };
133     void setGroupType(PageGroupType);
134     void clearPageGroup();
group()135     PageGroup& group()
136     {
137         if (!m_group)
138             setGroupType(PrivatePageGroup);
139         return *m_group;
140     }
141 
incrementSubframeCount()142     void incrementSubframeCount() { ++m_subframeCount; }
decrementSubframeCount()143     void decrementSubframeCount() { ASSERT(m_subframeCount); --m_subframeCount; }
subframeCount()144     int subframeCount() const { checkSubframeCountConsistency(); return m_subframeCount; }
145 
chrome()146     Chrome& chrome() const { return *m_chrome; }
autoscrollController()147     AutoscrollController& autoscrollController() const { return *m_autoscrollController; }
dragCaretController()148     DragCaretController& dragCaretController() const { return *m_dragCaretController; }
dragController()149     DragController& dragController() const { return *m_dragController; }
focusController()150     FocusController& focusController() const { return *m_focusController; }
contextMenuController()151     ContextMenuController& contextMenuController() const { return *m_contextMenuController; }
inspectorController()152     InspectorController& inspectorController() const { return *m_inspectorController; }
pointerLockController()153     PointerLockController& pointerLockController() const { return *m_pointerLockController; }
validationMessageClient()154     ValidationMessageClient* validationMessageClient() const { return m_validationMessageClient; }
setValidationMessageClient(ValidationMessageClient * client)155     void setValidationMessageClient(ValidationMessageClient* client) { m_validationMessageClient = client; }
sharedWorkerRepositoryClient()156     SharedWorkerRepositoryClient* sharedWorkerRepositoryClient() { return m_sharedWorkerRepositoryClient; }
setSharedWorkerRepositoryClient(SharedWorkerRepositoryClient * client)157     void setSharedWorkerRepositoryClient(SharedWorkerRepositoryClient* client) { m_sharedWorkerRepositoryClient = client; }
158 
159     ScrollingCoordinator* scrollingCoordinator();
160 
161     String mainThreadScrollingReasonsAsText();
162     PassRefPtr<ClientRectList> nonFastScrollableRects(const Frame*);
163 
settings()164     Settings& settings() const { return *m_settings; }
progress()165     ProgressTracker& progress() const { return *m_progress; }
backForward()166     BackForwardClient& backForward() const { return *m_backForwardClient; }
167 
useCounter()168     UseCounter& useCounter() { return m_useCounter; }
169 
setTabKeyCyclesThroughElements(bool b)170     void setTabKeyCyclesThroughElements(bool b) { m_tabKeyCyclesThroughElements = b; }
tabKeyCyclesThroughElements()171     bool tabKeyCyclesThroughElements() const { return m_tabKeyCyclesThroughElements; }
172 
173     void unmarkAllTextMatches();
174 
175     // DefersLoading is used to delay loads during modal dialogs.
176     // Modal dialogs are supposed to freeze all background processes
177     // in the page, including prevent additional loads from staring/continuing.
178     void setDefersLoading(bool);
defersLoading()179     bool defersLoading() const { return m_defersLoading; }
180 
181     void setPageScaleFactor(float scale, const IntPoint& origin);
pageScaleFactor()182     float pageScaleFactor() const { return m_pageScaleFactor; }
183 
deviceScaleFactor()184     float deviceScaleFactor() const { return m_deviceScaleFactor; }
185     void setDeviceScaleFactor(float);
186 
187     // Page and FrameView both store a Pagination value. Page::pagination() is set only by API,
188     // and FrameView::pagination() is set only by CSS. Page::pagination() will affect all
189     // FrameViews in the page cache, but FrameView::pagination() only affects the current
190     // FrameView.
pagination()191     const Pagination& pagination() const { return m_pagination; }
192     void setPagination(const Pagination&);
193 
194     static void allVisitedStateChanged(PageGroup*);
195     static void visitedStateChanged(PageGroup*, LinkHash visitedHash);
196 
197     StorageNamespace* sessionStorage(bool optionalCreate = true);
198 
199     // Don't allow more than a certain number of frames in a page.
200     // This seems like a reasonable upper bound, and otherwise mutually
201     // recursive frameset pages can quickly bring the program to its knees
202     // with exponential growth in the number of frames.
203     static const int maxNumberOfFrames = 1000;
204 
205     PageVisibilityState visibilityState() const;
206     void setVisibilityState(PageVisibilityState, bool);
207 
isCursorVisible()208     bool isCursorVisible() const { return m_isCursorVisible; }
setIsCursorVisible(bool isVisible)209     void setIsCursorVisible(bool isVisible) { m_isCursorVisible = isVisible; }
210 
211 #ifndef NDEBUG
setIsPainting(bool painting)212     void setIsPainting(bool painting) { m_isPainting = painting; }
isPainting()213     bool isPainting() const { return m_isPainting; }
214 #endif
215 
console()216     PageConsole& console() { return *m_console; }
217 
218     double timerAlignmentInterval() const;
219 
220     class MultisamplingChangedObserver {
221     public:
222         virtual void multisamplingChanged(bool) = 0;
223     };
224 
225     void addMultisamplingChangedObserver(MultisamplingChangedObserver*);
226     void removeMultisamplingChangedObserver(MultisamplingChangedObserver*);
227 
228     void didCommitLoad(Frame*);
229 
230     static void networkStateChanged(bool online);
231     PassOwnPtr<LifecycleNotifier<Page> > createLifecycleNotifier();
232 
233 protected:
234     PageLifecycleNotifier& lifecycleNotifier();
235 
236 private:
237     void initGroup();
238 
239 #if ASSERT_DISABLED
checkSubframeCountConsistency()240     void checkSubframeCountConsistency() const { }
241 #else
242     void checkSubframeCountConsistency() const;
243 #endif
244 
245     void setTimerAlignmentInterval(double);
246 
247     // SettingsDelegate overrides.
page()248     virtual Page* page() OVERRIDE { return this; }
249     virtual void settingsChanged(SettingsDelegate::ChangeType) OVERRIDE;
250 
251     const OwnPtr<AutoscrollController> m_autoscrollController;
252     const OwnPtr<Chrome> m_chrome;
253     const OwnPtr<DragCaretController> m_dragCaretController;
254     const OwnPtr<DragController> m_dragController;
255     const OwnPtr<FocusController> m_focusController;
256     const OwnPtr<ContextMenuController> m_contextMenuController;
257     const OwnPtr<InspectorController> m_inspectorController;
258     const OwnPtr<PointerLockController> m_pointerLockController;
259     RefPtr<ScrollingCoordinator> m_scrollingCoordinator;
260 
261     const OwnPtr<HistoryController> m_historyController;
262     const OwnPtr<ProgressTracker> m_progress;
263     const OwnPtr<UndoStack> m_undoStack;
264 
265     RefPtr<Frame> m_mainFrame;
266 
267     mutable RefPtr<PluginData> m_pluginData;
268 
269     BackForwardClient* m_backForwardClient;
270     EditorClient* const m_editorClient;
271     ValidationMessageClient* m_validationMessageClient;
272     SharedWorkerRepositoryClient* m_sharedWorkerRepositoryClient;
273     SpellCheckerClient* const m_spellCheckerClient;
274 
275     UseCounter m_useCounter;
276 
277     int m_subframeCount;
278     bool m_openedByDOM;
279 
280     bool m_tabKeyCyclesThroughElements;
281     bool m_defersLoading;
282 
283     float m_pageScaleFactor;
284     float m_deviceScaleFactor;
285 
286     Pagination m_pagination;
287 
288     RefPtr<PageGroup> m_group;
289 
290     OwnPtr<StorageNamespace> m_sessionStorage;
291 
292     double m_timerAlignmentInterval;
293 
294     PageVisibilityState m_visibilityState;
295 
296     bool m_isCursorVisible;
297 
298 #ifndef NDEBUG
299     bool m_isPainting;
300 #endif
301 
302     const OwnPtr<PageConsole> m_console;
303 
304     HashSet<MultisamplingChangedObserver*> m_multisamplingChangedObservers;
305 };
306 
307 } // namespace WebCore
308 
309 #endif // Page_h
310