1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
|
/*
* Copyright (C) 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights reserved.
* Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef Page_h
#define Page_h
#include "core/dom/ViewportDescription.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/SettingsDelegate.h"
#include "core/frame/UseCounter.h"
#include "core/page/PageAnimator.h"
#include "core/page/PageVisibilityState.h"
#include "platform/LifecycleContext.h"
#include "platform/Supplementable.h"
#include "platform/geometry/LayoutRect.h"
#include "platform/geometry/Region.h"
#include "platform/heap/Handle.h"
#include "wtf/Forward.h"
#include "wtf/HashSet.h"
#include "wtf/Noncopyable.h"
#include "wtf/text/WTFString.h"
namespace WebCore {
class AutoscrollController;
class BackForwardClient;
class Chrome;
class ChromeClient;
class ClientRectList;
class ContextMenuClient;
class ContextMenuController;
class Document;
class DragCaretController;
class DragClient;
class DragController;
class EditorClient;
class FocusController;
class Frame;
class FrameHost;
class HistoryItem;
class InspectorClient;
class InspectorController;
class PageLifecycleNotifier;
class PlatformMouseEvent;
class PluginData;
class PointerLockController;
class Range;
class RenderBox;
class RenderObject;
class RenderTheme;
class StorageClient;
class VisibleSelection;
class ScrollableArea;
class ScrollingCoordinator;
class Settings;
class SpellCheckerClient;
class StorageNamespace;
class UndoStack;
class ValidationMessageClient;
typedef uint64_t LinkHash;
float deviceScaleFactor(LocalFrame*);
class Page FINAL : public NoBaseWillBeGarbageCollectedFinalized<Page>, public WillBeHeapSupplementable<Page>, public LifecycleContext<Page>, public SettingsDelegate {
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(Page);
WTF_MAKE_NONCOPYABLE(Page);
friend class Settings;
public:
static void scheduleForcedStyleRecalcForAllPages();
// It is up to the platform to ensure that non-null clients are provided where required.
struct PageClients {
WTF_MAKE_NONCOPYABLE(PageClients); WTF_MAKE_FAST_ALLOCATED;
public:
PageClients();
~PageClients();
ChromeClient* chromeClient;
ContextMenuClient* contextMenuClient;
EditorClient* editorClient;
DragClient* dragClient;
InspectorClient* inspectorClient;
BackForwardClient* backForwardClient;
SpellCheckerClient* spellCheckerClient;
StorageClient* storageClient;
};
explicit Page(PageClients&);
virtual ~Page();
void makeOrdinary();
// This method returns all pages, incl. private ones associated with
// inspector overlay, popups, SVGImage, etc.
static HashSet<Page*>& allPages();
// This method returns all ordinary pages.
static HashSet<Page*>& ordinaryPages();
FrameHost& frameHost() const { return *m_frameHost; }
void setNeedsRecalcStyleInAllFrames();
void updateAcceleratedCompositingSettings();
ViewportDescription viewportDescription() const;
static void refreshPlugins(bool reload);
PluginData* pluginData() const;
EditorClient& editorClient() const { return *m_editorClient; }
SpellCheckerClient& spellCheckerClient() const { return *m_spellCheckerClient; }
UndoStack& undoStack() const { return *m_undoStack; }
void setMainFrame(Frame*);
Frame* mainFrame() const { return m_mainFrame; }
// Escape hatch for existing code that assumes that the root frame is
// always a LocalFrame. With OOPI, this is not always the case. Code that
// depends on this will generally have to be rewritten to propagate any
// necessary state through all renderer processes for that page and/or
// coordinate/rely on the browser process to help dispatch/coordinate work.
LocalFrame* deprecatedLocalMainFrame() const { return toLocalFrame(m_mainFrame); }
void documentDetached(Document*);
bool openedByDOM() const;
void setOpenedByDOM();
void incrementSubframeCount() { ++m_subframeCount; }
void decrementSubframeCount() { ASSERT(m_subframeCount); --m_subframeCount; }
int subframeCount() const { checkSubframeCountConsistency(); return m_subframeCount; }
PageAnimator& animator() { return m_animator; }
Chrome& chrome() const { return *m_chrome; }
AutoscrollController& autoscrollController() const { return *m_autoscrollController; }
DragCaretController& dragCaretController() const { return *m_dragCaretController; }
DragController& dragController() const { return *m_dragController; }
FocusController& focusController() const { return *m_focusController; }
ContextMenuController& contextMenuController() const { return *m_contextMenuController; }
InspectorController& inspectorController() const { return *m_inspectorController; }
PointerLockController& pointerLockController() const { return *m_pointerLockController; }
ValidationMessageClient& validationMessageClient() const { return *m_validationMessageClient; }
void setValidationMessageClient(PassOwnPtrWillBeRawPtr<ValidationMessageClient>);
ScrollingCoordinator* scrollingCoordinator();
String mainThreadScrollingReasonsAsText();
PassRefPtrWillBeRawPtr<ClientRectList> nonFastScrollableRects(const LocalFrame*);
Settings& settings() const { return *m_settings; }
BackForwardClient& backForward() const { return *m_backForwardClient; }
UseCounter& useCounter() { return m_useCounter; }
void setTabKeyCyclesThroughElements(bool b) { m_tabKeyCyclesThroughElements = b; }
bool tabKeyCyclesThroughElements() const { return m_tabKeyCyclesThroughElements; }
void unmarkAllTextMatches();
// DefersLoading is used to delay loads during modal dialogs.
// Modal dialogs are supposed to freeze all background processes
// in the page, including prevent additional loads from staring/continuing.
void setDefersLoading(bool);
bool defersLoading() const { return m_defersLoading; }
void setPageScaleFactor(float scale, const IntPoint& origin);
float pageScaleFactor() const;
float deviceScaleFactor() const { return m_deviceScaleFactor; }
void setDeviceScaleFactor(float);
static void allVisitedStateChanged();
static void visitedStateChanged(LinkHash visitedHash);
StorageNamespace* sessionStorage(bool optionalCreate = true);
StorageClient& storageClient() const { return *m_storageClient; }
// Don't allow more than a certain number of frames in a page.
// This seems like a reasonable upper bound, and otherwise mutually
// recursive frameset pages can quickly bring the program to its knees
// with exponential growth in the number of frames.
static const int maxNumberOfFrames = 1000;
PageVisibilityState visibilityState() const;
void setVisibilityState(PageVisibilityState, bool);
bool isCursorVisible() const;
void setIsCursorVisible(bool isVisible) { m_isCursorVisible = isVisible; }
#ifndef NDEBUG
void setIsPainting(bool painting) { m_isPainting = painting; }
bool isPainting() const { return m_isPainting; }
#endif
double timerAlignmentInterval() const;
class MultisamplingChangedObserver : public WillBeGarbageCollectedMixin {
public:
virtual void multisamplingChanged(bool) = 0;
};
void addMultisamplingChangedObserver(MultisamplingChangedObserver*);
void removeMultisamplingChangedObserver(MultisamplingChangedObserver*);
void didCommitLoad(LocalFrame*);
void acceptLanguagesChanged();
static void networkStateChanged(bool online);
PassOwnPtr<LifecycleNotifier<Page> > createLifecycleNotifier();
void trace(Visitor*);
void willBeDestroyed();
protected:
PageLifecycleNotifier& lifecycleNotifier();
private:
void initGroup();
#if ASSERT_ENABLED
void checkSubframeCountConsistency() const;
#else
void checkSubframeCountConsistency() const { }
#endif
void setTimerAlignmentInterval(double);
void setNeedsLayoutInAllFrames();
// SettingsDelegate overrides.
virtual void settingsChanged(SettingsDelegate::ChangeType) OVERRIDE;
PageAnimator m_animator;
const OwnPtr<AutoscrollController> m_autoscrollController;
const OwnPtr<Chrome> m_chrome;
const OwnPtrWillBeMember<DragCaretController> m_dragCaretController;
const OwnPtrWillBeMember<DragController> m_dragController;
const OwnPtr<FocusController> m_focusController;
const OwnPtr<ContextMenuController> m_contextMenuController;
const OwnPtr<InspectorController> m_inspectorController;
const OwnPtrWillBeMember<PointerLockController> m_pointerLockController;
OwnPtr<ScrollingCoordinator> m_scrollingCoordinator;
const OwnPtrWillBeMember<UndoStack> m_undoStack;
// Typically, the main frame and Page should both be owned by the embedder,
// which must call Page::willBeDestroyed() prior to destroying Page. This
// call detaches the main frame and clears this pointer, thus ensuring that
// this field only references a live main frame.
//
// However, there are several locations (InspectorOverlay, SVGImage, and
// WebPagePopupImpl) which don't hold a reference to the main frame at all
// after creating it. These are still safe because they always create a
// Frame with a FrameView. FrameView and Frame hold references to each
// other, thus keeping each other alive. The call to willBeDestroyed()
// breaks this cycle, so the frame is still properly destroyed once no
// longer needed.
Frame* m_mainFrame;
mutable RefPtr<PluginData> m_pluginData;
BackForwardClient* m_backForwardClient;
EditorClient* const m_editorClient;
SpellCheckerClient* const m_spellCheckerClient;
StorageClient* m_storageClient;
OwnPtrWillBeMember<ValidationMessageClient> m_validationMessageClient;
UseCounter m_useCounter;
int m_subframeCount;
bool m_openedByDOM;
bool m_tabKeyCyclesThroughElements;
bool m_defersLoading;
float m_deviceScaleFactor;
OwnPtr<StorageNamespace> m_sessionStorage;
double m_timerAlignmentInterval;
PageVisibilityState m_visibilityState;
bool m_isCursorVisible;
#ifndef NDEBUG
bool m_isPainting;
#endif
WillBeHeapHashSet<RawPtrWillBeWeakMember<MultisamplingChangedObserver> > m_multisamplingChangedObservers;
// A pointer to all the interfaces provided to in-process Frames for this Page.
// FIXME: Most of the members of Page should move onto FrameHost.
OwnPtrWillBeMember<FrameHost> m_frameHost;
};
} // namespace WebCore
#endif // Page_h
|