2009-03-05 Dimitri Glazkov <dglazkov@chromium.org>
[WebKit-https.git] / WebCore / page / Page.h
1 /*
2  * Copyright (C) 2006, 2008 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 "BackForwardList.h"
25 #include "Chrome.h"
26 #include "ContextMenuController.h"
27 #include "FrameLoaderTypes.h"
28 #include "LinkHash.h"
29 #include "PlatformString.h"
30 #include <wtf/HashSet.h>
31 #include <wtf/OwnPtr.h>
32
33 #if PLATFORM(MAC)
34 #include "SchedulePair.h"
35 #endif
36
37 #if PLATFORM(WIN) || (PLATFORM(WX) && PLATFORM(WIN_OS)) || (PLATFORM(QT) && defined(Q_WS_WIN))
38 typedef struct HINSTANCE__* HINSTANCE;
39 #endif
40
41 namespace JSC {
42     class Debugger;
43 }
44
45 namespace WebCore {
46
47     class Chrome;
48     class ChromeClient;
49     class ContextMenuClient;
50     class ContextMenuController;
51     class Document;
52     class DragClient;
53     class DragController;
54     class EditorClient;
55     class FocusController;
56     class Frame;
57     class InspectorClient;
58     class InspectorController;
59     class Node;
60     class PageGroup;
61     class PluginData;
62     class ProgressTracker;
63     class VisibleSelection;
64     class SelectionController;
65 #if ENABLE(DOM_STORAGE)
66     class SessionStorage;
67 #endif
68     class Settings;
69 #if ENABLE(WML)
70     class WMLPageState;
71 #endif
72
73     enum FindDirection { FindDirectionForward, FindDirectionBackward };
74
75     class Page : Noncopyable {
76     public:
77         static void setNeedsReapplyStyles();
78
79         Page(ChromeClient*, ContextMenuClient*, EditorClient*, DragClient*, InspectorClient*);
80         ~Page();
81         
82         static void refreshPlugins(bool reload);
83         PluginData* pluginData() const;
84
85         EditorClient* editorClient() const { return m_editorClient; }
86
87         void setMainFrame(PassRefPtr<Frame>);
88         Frame* mainFrame() const { return m_mainFrame.get(); }
89
90         BackForwardList* backForwardList();
91
92         // FIXME: The following three methods don't fall under the responsibilities of the Page object
93         // They seem to fit a hypothetical Page-controller object that would be akin to the 
94         // Frame-FrameLoader relationship.  They have to live here now, but should move somewhere that
95         // makes more sense when that class exists.
96         bool goBack();
97         bool goForward();
98         void goToItem(HistoryItem*, FrameLoadType);
99
100         HistoryItem* globalHistoryItem() const { return m_globalHistoryItem.get(); }
101         void setGlobalHistoryItem(HistoryItem*);
102
103         void setGroupName(const String&);
104         const String& groupName() const;
105
106         PageGroup& group() { if (!m_group) initGroup(); return *m_group; }
107         PageGroup* groupPtr() { return m_group; } // can return 0
108
109         void incrementFrameCount() { ++m_frameCount; }
110         void decrementFrameCount() { --m_frameCount; }
111         int frameCount() const { return m_frameCount; }
112
113         Chrome* chrome() const { return m_chrome.get(); }
114         SelectionController* dragCaretController() const { return m_dragCaretController.get(); }
115         DragController* dragController() const { return m_dragController.get(); }
116         FocusController* focusController() const { return m_focusController.get(); }
117         ContextMenuController* contextMenuController() const { return m_contextMenuController.get(); }
118         InspectorController* inspectorController() const { return m_inspectorController.get(); }
119         Settings* settings() const { return m_settings.get(); }
120         ProgressTracker* progress() const { return m_progress.get(); }
121
122         void setParentInspectorController(InspectorController* controller) { m_parentInspectorController = controller; }
123         InspectorController* parentInspectorController() const { return m_parentInspectorController; }
124         
125         void setTabKeyCyclesThroughElements(bool b) { m_tabKeyCyclesThroughElements = b; }
126         bool tabKeyCyclesThroughElements() const { return m_tabKeyCyclesThroughElements; }
127
128         bool findString(const String&, TextCaseSensitivity, FindDirection, bool shouldWrap);
129         unsigned int markAllMatchesForText(const String&, TextCaseSensitivity, bool shouldHighlight, unsigned);
130         void unmarkAllTextMatches();
131
132 #if PLATFORM(MAC)
133         void addSchedulePair(PassRefPtr<SchedulePair>);
134         void removeSchedulePair(PassRefPtr<SchedulePair>);
135         SchedulePairHashSet* scheduledRunLoopPairs() { return m_scheduledRunLoopPairs.get(); }
136
137         OwnPtr<SchedulePairHashSet> m_scheduledRunLoopPairs;
138 #endif
139
140         const VisibleSelection& selection() const;
141
142         void setDefersLoading(bool);
143         bool defersLoading() const { return m_defersLoading; }
144         
145         void clearUndoRedoOperations();
146
147         bool inLowQualityImageInterpolationMode() const;
148         void setInLowQualityImageInterpolationMode(bool = true);
149
150         bool cookieEnabled() const { return m_cookieEnabled; }
151         void setCookieEnabled(bool enabled) { m_cookieEnabled = enabled; }
152
153         float mediaVolume() const { return m_mediaVolume; }
154         void setMediaVolume(float volume);
155
156         // Notifications when the Page starts and stops being presented via a native window.
157         void didMoveOnscreen();
158         void willMoveOffscreen();
159
160         void userStyleSheetLocationChanged();
161         const String& userStyleSheet() const;
162         
163         void changePendingUnloadEventCount(int delta);
164         unsigned pendingUnloadEventCount();
165         void changePendingBeforeUnloadEventCount(int delta);
166         unsigned pendingBeforeUnloadEventCount();
167
168         static void setDebuggerForAllPages(JSC::Debugger*);
169         void setDebugger(JSC::Debugger*);
170         JSC::Debugger* debugger() const { return m_debugger; }
171
172 #if PLATFORM(WIN) || (PLATFORM(WX) && PLATFORM(WIN_OS)) || (PLATFORM(QT) && defined(Q_WS_WIN))
173         // The global DLL or application instance used for all windows.
174         static void setInstanceHandle(HINSTANCE instanceHandle) { s_instanceHandle = instanceHandle; }
175         static HINSTANCE instanceHandle() { return s_instanceHandle; }
176 #endif
177
178         static void removeAllVisitedLinks();
179
180         static void allVisitedStateChanged(PageGroup*);
181         static void visitedStateChanged(PageGroup*, LinkHash visitedHash);
182
183 #if ENABLE(DOM_STORAGE)
184         SessionStorage* sessionStorage(bool optionalCreate = true);
185         void setSessionStorage(PassRefPtr<SessionStorage>);
186 #endif
187
188 #if ENABLE(WML)
189         WMLPageState* wmlPageState();
190 #endif
191
192         void setCustomHTMLTokenizerTimeDelay(double);
193         bool hasCustomHTMLTokenizerTimeDelay() const { return m_customHTMLTokenizerTimeDelay != -1; }
194         double customHTMLTokenizerTimeDelay() const { ASSERT(m_customHTMLTokenizerTimeDelay != -1); return m_customHTMLTokenizerTimeDelay; }
195
196         void setCustomHTMLTokenizerChunkSize(int);
197         bool hasCustomHTMLTokenizerChunkSize() const { return m_customHTMLTokenizerChunkSize != -1; }
198         int customHTMLTokenizerChunkSize() const { ASSERT(m_customHTMLTokenizerChunkSize != -1); return m_customHTMLTokenizerChunkSize; }
199
200         void setMemoryCacheClientCallsEnabled(bool);
201         bool areMemoryCacheClientCallsEnabled() const { return m_areMemoryCacheClientCallsEnabled; }
202
203         void setJavaScriptURLsAreAllowed(bool);
204         bool javaScriptURLsAreAllowed() const;
205
206     private:
207         void initGroup();
208
209         OwnPtr<Chrome> m_chrome;
210         OwnPtr<SelectionController> m_dragCaretController;
211         OwnPtr<DragController> m_dragController;
212         OwnPtr<FocusController> m_focusController;
213         OwnPtr<ContextMenuController> m_contextMenuController;
214         RefPtr<InspectorController> m_inspectorController;
215         OwnPtr<Settings> m_settings;
216         OwnPtr<ProgressTracker> m_progress;
217         
218         RefPtr<BackForwardList> m_backForwardList;
219         RefPtr<Frame> m_mainFrame;
220
221         RefPtr<HistoryItem> m_globalHistoryItem;
222
223         mutable RefPtr<PluginData> m_pluginData;
224
225         EditorClient* m_editorClient;
226
227         int m_frameCount;
228         String m_groupName;
229
230         bool m_tabKeyCyclesThroughElements;
231         bool m_defersLoading;
232
233         bool m_inLowQualityInterpolationMode;
234         bool m_cookieEnabled;
235         bool m_areMemoryCacheClientCallsEnabled;
236         float m_mediaVolume;
237
238         bool m_javaScriptURLsAreAllowed;
239
240         InspectorController* m_parentInspectorController;
241
242         String m_userStyleSheetPath;
243         mutable String m_userStyleSheet;
244         mutable bool m_didLoadUserStyleSheet;
245         mutable time_t m_userStyleSheetModificationTime;
246
247         OwnPtr<PageGroup> m_singlePageGroup;
248         PageGroup* m_group;
249
250         JSC::Debugger* m_debugger;
251         
252         unsigned m_pendingUnloadEventCount;
253         unsigned m_pendingBeforeUnloadEventCount;
254
255         double m_customHTMLTokenizerTimeDelay;
256         int m_customHTMLTokenizerChunkSize;
257
258 #if ENABLE(DOM_STORAGE)
259         RefPtr<SessionStorage> m_sessionStorage;
260 #endif
261
262 #if PLATFORM(WIN) || (PLATFORM(WX) && defined(__WXMSW__)) || (PLATFORM(QT) && defined(Q_WS_WIN))
263         static HINSTANCE s_instanceHandle;
264 #endif
265
266 #if ENABLE(WML)
267         OwnPtr<WMLPageState> m_wmlPageState;
268 #endif
269     };
270
271 } // namespace WebCore
272     
273 #endif // Page_h