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 "FrameLoaderTypes.h" 25 #include "PlatformString.h" 26 #include <wtf/Forward.h> 27 #include <wtf/HashSet.h> 28 #include <wtf/Noncopyable.h> 29 30 #if PLATFORM(MAC) 31 #include "SchedulePair.h" 32 #endif 33 34 #if PLATFORM(WIN) || (PLATFORM(WX) && OS(WINDOWS)) || (PLATFORM(QT) && defined(Q_WS_WIN)) 35 typedef struct HINSTANCE__* HINSTANCE; 36 #endif 37 38 namespace JSC { 39 class Debugger; 40 } 41 42 namespace WebCore { 43 44 class BackForwardList; 45 class Chrome; 46 class ChromeClient; 47 class ContextMenuClient; 48 class ContextMenuController; 49 class Document; 50 class DragClient; 51 class DragController; 52 class EditorClient; 53 class FocusController; 54 class Frame; 55 class GeolocationController; 56 class GeolocationControllerClient; 57 class HaltablePlugin; 58 class HistoryItem; 59 class InspectorClient; 60 class InspectorController; 61 class InspectorTimelineAgent; 62 class Node; 63 class PageGroup; 64 class PluginData; 65 class PluginHalter; 66 class PluginHalterClient; 67 class PluginView; 68 class ProgressTracker; 69 class RenderTheme; 70 class VisibleSelection; 71 class SelectionController; 72 class Settings; 73 #if ENABLE(DOM_STORAGE) 74 class StorageNamespace; 75 #endif 76 #if ENABLE(WML) 77 class WMLPageState; 78 #endif 79 #if ENABLE(NOTIFICATIONS) 80 class NotificationPresenter; 81 #endif 82 83 typedef uint64_t LinkHash; 84 85 enum FindDirection { FindDirectionForward, FindDirectionBackward }; 86 87 class Page : public Noncopyable { 88 public: 89 static void setNeedsReapplyStyles(); 90 91 Page(ChromeClient*, ContextMenuClient*, EditorClient*, DragClient*, InspectorClient*, PluginHalterClient*, GeolocationControllerClient*); 92 ~Page(); 93 94 RenderTheme* theme() const { return m_theme.get(); }; 95 96 static void refreshPlugins(bool reload); 97 PluginData* pluginData() const; 98 99 void setCanStartPlugins(bool); 100 bool canStartPlugins() const { return m_canStartPlugins; } 101 void addUnstartedPlugin(PluginView*); 102 void removeUnstartedPlugin(PluginView*); 103 104 EditorClient* editorClient() const { return m_editorClient; } 105 106 void setMainFrame(PassRefPtr<Frame>); 107 Frame* mainFrame() const { return m_mainFrame.get(); } 108 109 bool openedByDOM() const; 110 void setOpenedByDOM(); 111 112 BackForwardList* backForwardList(); 113 114 // FIXME: The following three methods don't fall under the responsibilities of the Page object 115 // They seem to fit a hypothetical Page-controller object that would be akin to the 116 // Frame-FrameLoader relationship. They have to live here now, but should move somewhere that 117 // makes more sense when that class exists. 118 bool goBack(); 119 bool goForward(); 120 bool canGoBackOrForward(int distance) const; 121 void goBackOrForward(int distance); 122 void goToItem(HistoryItem*, FrameLoadType); 123 int getHistoryLength(); 124 125 HistoryItem* globalHistoryItem() const { return m_globalHistoryItem.get(); } 126 void setGlobalHistoryItem(HistoryItem*); 127 128 void setGroupName(const String&); 129 const String& groupName() const; 130 131 PageGroup& group() { if (!m_group) initGroup(); return *m_group; } 132 PageGroup* groupPtr() { return m_group; } // can return 0 133 134 void incrementFrameCount() { ++m_frameCount; } 135 void decrementFrameCount() { ASSERT(m_frameCount); --m_frameCount; } 136 int frameCount() const { checkFrameCountConsistency(); return m_frameCount; } 137 138 Chrome* chrome() const { return m_chrome.get(); } 139 SelectionController* dragCaretController() const { return m_dragCaretController.get(); } 140 #if ENABLE(DRAG_SUPPORT) 141 DragController* dragController() const { return m_dragController.get(); } 142 #endif 143 FocusController* focusController() const { return m_focusController.get(); } 144 #if ENABLE(CONTEXT_MENUS) 145 ContextMenuController* contextMenuController() const { return m_contextMenuController.get(); } 146 #endif 147 #if ENABLE(INSPECTOR) 148 InspectorController* inspectorController() const { return m_inspectorController.get(); } 149 #endif 150 #if ENABLE(CLIENT_BASED_GEOLOCATION) 151 GeolocationController* geolocationController() const { return m_geolocationController.get(); } 152 #endif 153 Settings* settings() const { return m_settings.get(); } 154 ProgressTracker* progress() const { return m_progress.get(); } 155 156 #if ENABLE(INSPECTOR) 157 void setParentInspectorController(InspectorController* controller) { m_parentInspectorController = controller; } 158 InspectorController* parentInspectorController() const { return m_parentInspectorController; } 159 #endif 160 161 void setTabKeyCyclesThroughElements(bool b) { m_tabKeyCyclesThroughElements = b; } 162 bool tabKeyCyclesThroughElements() const { return m_tabKeyCyclesThroughElements; } 163 164 bool findString(const String&, TextCaseSensitivity, FindDirection, bool shouldWrap); 165 unsigned int markAllMatchesForText(const String&, TextCaseSensitivity, bool shouldHighlight, unsigned); 166 void unmarkAllTextMatches(); 167 168 #if PLATFORM(MAC) 169 void addSchedulePair(PassRefPtr<SchedulePair>); 170 void removeSchedulePair(PassRefPtr<SchedulePair>); 171 SchedulePairHashSet* scheduledRunLoopPairs() { return m_scheduledRunLoopPairs.get(); } 172 173 OwnPtr<SchedulePairHashSet> m_scheduledRunLoopPairs; 174 #endif 175 176 const VisibleSelection& selection() const; 177 178 void setDefersLoading(bool); 179 bool defersLoading() const { return m_defersLoading; } 180 181 void clearUndoRedoOperations(); 182 183 bool inLowQualityImageInterpolationMode() const; 184 void setInLowQualityImageInterpolationMode(bool = true); 185 186 bool cookieEnabled() const { return m_cookieEnabled; } 187 void setCookieEnabled(bool enabled) { m_cookieEnabled = enabled; } 188 189 float mediaVolume() const { return m_mediaVolume; } 190 void setMediaVolume(float volume); 191 192 // Notifications when the Page starts and stops being presented via a native window. 193 void didMoveOnscreen(); 194 void willMoveOffscreen(); 195 196 void userStyleSheetLocationChanged(); 197 const String& userStyleSheet() const; 198 199 void didStartPlugin(HaltablePlugin*); 200 void didStopPlugin(HaltablePlugin*); 201 void pluginAllowedRunTimeChanged(); 202 203 static void setDebuggerForAllPages(JSC::Debugger*); 204 void setDebugger(JSC::Debugger*); 205 JSC::Debugger* debugger() const { return m_debugger; } 206 207 #if PLATFORM(WIN) || (PLATFORM(WX) && OS(WINDOWS)) || (PLATFORM(QT) && defined(Q_WS_WIN)) 208 // The global DLL or application instance used for all windows. 209 static void setInstanceHandle(HINSTANCE instanceHandle) { s_instanceHandle = instanceHandle; } 210 static HINSTANCE instanceHandle() { return s_instanceHandle; } 211 #endif 212 213 static void removeAllVisitedLinks(); 214 215 static void allVisitedStateChanged(PageGroup*); 216 static void visitedStateChanged(PageGroup*, LinkHash visitedHash); 217 218 #if ENABLE(DOM_STORAGE) 219 StorageNamespace* sessionStorage(bool optionalCreate = true); 220 void setSessionStorage(PassRefPtr<StorageNamespace>); 221 #endif 222 223 #if ENABLE(WML) 224 WMLPageState* wmlPageState(); 225 #endif 226 227 void setCustomHTMLTokenizerTimeDelay(double); 228 bool hasCustomHTMLTokenizerTimeDelay() const { return m_customHTMLTokenizerTimeDelay != -1; } 229 double customHTMLTokenizerTimeDelay() const { ASSERT(m_customHTMLTokenizerTimeDelay != -1); return m_customHTMLTokenizerTimeDelay; } 230 231 void setCustomHTMLTokenizerChunkSize(int); 232 bool hasCustomHTMLTokenizerChunkSize() const { return m_customHTMLTokenizerChunkSize != -1; } 233 int customHTMLTokenizerChunkSize() const { ASSERT(m_customHTMLTokenizerChunkSize != -1); return m_customHTMLTokenizerChunkSize; } 234 235 void setMemoryCacheClientCallsEnabled(bool); 236 bool areMemoryCacheClientCallsEnabled() const { return m_areMemoryCacheClientCallsEnabled; } 237 238 void setJavaScriptURLsAreAllowed(bool); 239 bool javaScriptURLsAreAllowed() const; 240 241 #if ENABLE(INSPECTOR) 242 InspectorTimelineAgent* inspectorTimelineAgent() const; 243 #endif 244 private: 245 void initGroup(); 246 247 #if ASSERT_DISABLED 248 void checkFrameCountConsistency() const { } 249 #else 250 void checkFrameCountConsistency() const; 251 #endif 252 253 OwnPtr<Chrome> m_chrome; 254 OwnPtr<SelectionController> m_dragCaretController; 255 #if ENABLE(DRAG_SUPPORT) 256 OwnPtr<DragController> m_dragController; 257 #endif 258 OwnPtr<FocusController> m_focusController; 259 #if ENABLE(CONTEXT_MENUS) 260 OwnPtr<ContextMenuController> m_contextMenuController; 261 #endif 262 #if ENABLE(INSPECTOR) 263 OwnPtr<InspectorController> m_inspectorController; 264 #endif 265 #if ENABLE(CLIENT_BASED_GEOLOCATION) 266 OwnPtr<GeolocationController> m_geolocationController; 267 #endif 268 OwnPtr<Settings> m_settings; 269 OwnPtr<ProgressTracker> m_progress; 270 271 RefPtr<BackForwardList> m_backForwardList; 272 RefPtr<Frame> m_mainFrame; 273 274 RefPtr<HistoryItem> m_globalHistoryItem; 275 276 mutable RefPtr<PluginData> m_pluginData; 277 278 RefPtr<RenderTheme> m_theme; 279 280 EditorClient* m_editorClient; 281 282 int m_frameCount; 283 String m_groupName; 284 bool m_openedByDOM; 285 286 bool m_tabKeyCyclesThroughElements; 287 bool m_defersLoading; 288 289 bool m_inLowQualityInterpolationMode; 290 bool m_cookieEnabled; 291 bool m_areMemoryCacheClientCallsEnabled; 292 float m_mediaVolume; 293 294 bool m_javaScriptURLsAreAllowed; 295 296 #if ENABLE(INSPECTOR) 297 InspectorController* m_parentInspectorController; 298 #endif 299 300 String m_userStyleSheetPath; 301 mutable String m_userStyleSheet; 302 mutable bool m_didLoadUserStyleSheet; 303 mutable time_t m_userStyleSheetModificationTime; 304 305 OwnPtr<PageGroup> m_singlePageGroup; 306 PageGroup* m_group; 307 308 JSC::Debugger* m_debugger; 309 310 double m_customHTMLTokenizerTimeDelay; 311 int m_customHTMLTokenizerChunkSize; 312 313 bool m_canStartPlugins; 314 HashSet<PluginView*> m_unstartedPlugins; 315 316 OwnPtr<PluginHalter> m_pluginHalter; 317 318 #if ENABLE(DOM_STORAGE) 319 RefPtr<StorageNamespace> m_sessionStorage; 320 #endif 321 322 #if PLATFORM(WIN) || (PLATFORM(WX) && defined(__WXMSW__)) || (PLATFORM(QT) && defined(Q_WS_WIN)) 323 static HINSTANCE s_instanceHandle; 324 #endif 325 326 #if ENABLE(WML) 327 OwnPtr<WMLPageState> m_wmlPageState; 328 #endif 329 330 #if ENABLE(NOTIFICATIONS) 331 NotificationPresenter* m_notificationPresenter; 332 #endif 333 }; 334 335 } // namespace WebCore 336 337 #endif // Page_h 338