ea16aade0e0697dc743fcc0b608c6ab27cead476
[WebKit-https.git] / Source / WebCore / page / Frame.h
1 /*
2  * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
3  *                     1999-2001 Lars Knoll <knoll@kde.org>
4  *                     1999-2001 Antti Koivisto <koivisto@kde.org>
5  *                     2000-2001 Simon Hausmann <hausmann@kde.org>
6  *                     2000-2001 Dirk Mueller <mueller@kde.org>
7  *                     2000 Stefan Schimanski <1Stein@gmx.de>
8  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
9  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
10  * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
11  *
12  * This library is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Library General Public
14  * License as published by the Free Software Foundation; either
15  * version 2 of the License, or (at your option) any later version.
16  *
17  * This library is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20  * Library General Public License for more details.
21  *
22  * You should have received a copy of the GNU Library General Public License
23  * along with this library; see the file COPYING.LIB.  If not, write to
24  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
25  * Boston, MA 02110-1301, USA.
26  */
27
28 #ifndef Frame_h
29 #define Frame_h
30
31 #include "AdjustViewSizeOrNot.h"
32 #include "FrameLoader.h"
33 #include "FrameTree.h"
34 #include "IntRect.h"
35 #include "NavigationScheduler.h"
36 #include "ScrollTypes.h"
37 #include "UserScriptTypes.h"
38 #include <memory>
39 #include <wtf/RefCounted.h>
40
41 #if PLATFORM(IOS)
42 #include "ViewportArguments.h"
43 #include "VisibleSelection.h"
44 #endif
45
46 #if PLATFORM(WIN)
47 #include "FrameWin.h"
48 #endif
49
50 #if PLATFORM(IOS)
51 OBJC_CLASS DOMCSSStyleDeclaration;
52 OBJC_CLASS DOMNode;
53 OBJC_CLASS NSArray;
54 OBJC_CLASS NSString;
55 #endif
56
57 #if PLATFORM(WIN)
58 typedef struct HBITMAP__* HBITMAP;
59 #endif
60
61 namespace JSC { namespace Yarr {
62 class RegularExpression;
63 } }
64
65 namespace WebCore {
66
67     class AnimationController;
68     class Color;
69     class Document;
70     class Editor;
71     class Element;
72     class EventHandler;
73     class FloatSize;
74     class FrameDestructionObserver;
75     class FrameSelection;
76     class FrameView;
77     class HTMLFrameOwnerElement;
78     class HTMLTableCellElement;
79     class HitTestResult;
80     class ImageBuffer;
81     class IntRect;
82     class MainFrame;
83     class Node;
84     class Range;
85     class RenderLayer;
86     class RenderView;
87     class RenderWidget;
88     class ScriptController;
89     class Settings;
90     class VisiblePosition;
91     class Widget;
92
93 #if PLATFORM(IOS)
94     enum {
95         OverflowScrollNone = 0,
96         OverflowScrollLeft = 1 << 0,
97         OverflowScrollRight = 1 << 1,
98         OverflowScrollUp = 1 << 2,
99         OverflowScrollDown = 1 << 3
100     };
101
102     enum OverflowScrollAction { DoNotPerformOverflowScroll, PerformOverflowScroll };
103     typedef Node* (*NodeQualifier)(const HitTestResult&, Node* terminationNode, IntRect* nodeBounds);
104 #endif
105
106     enum {
107         LayerTreeFlagsIncludeDebugInfo = 1 << 0,
108         LayerTreeFlagsIncludeVisibleRects = 1 << 1,
109         LayerTreeFlagsIncludeTileCaches = 1 << 2,
110         LayerTreeFlagsIncludeRepaintRects = 1 << 3,
111         LayerTreeFlagsIncludePaintingPhases = 1 << 4,
112         LayerTreeFlagsIncludeContentLayers = 1 << 5
113     };
114     typedef unsigned LayerTreeFlags;
115
116     class Frame : public RefCounted<Frame> {
117     public:
118         WEBCORE_EXPORT static PassRefPtr<Frame> create(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*);
119
120         void init();
121 #if PLATFORM(IOS)
122         // Creates <html><body style="..."></body></html> doing minimal amount of work.
123         WEBCORE_EXPORT void initWithSimpleHTMLDocument(const String& style, const URL&);
124 #endif
125         WEBCORE_EXPORT void setView(PassRefPtr<FrameView>);
126         WEBCORE_EXPORT void createView(const IntSize&, const Color&, bool,
127             const IntSize& fixedLayoutSize = IntSize(), const IntRect& fixedVisibleContentRect = IntRect(),
128             bool useFixedLayout = false, ScrollbarMode = ScrollbarAuto, bool horizontalLock = false,
129             ScrollbarMode = ScrollbarAuto, bool verticalLock = false);
130
131         WEBCORE_EXPORT virtual ~Frame();
132
133         void addDestructionObserver(FrameDestructionObserver*);
134         void removeDestructionObserver(FrameDestructionObserver*);
135
136         void willDetachPage();
137         void detachFromPage();
138         void disconnectOwnerElement();
139
140         MainFrame& mainFrame() const;
141         bool isMainFrame() const;
142
143         Page* page() const;
144         HTMLFrameOwnerElement* ownerElement() const;
145
146         Document* document() const;
147         FrameView* view() const;
148
149         Editor& editor() const;
150         EventHandler& eventHandler() const;
151         FrameLoader& loader() const;
152         NavigationScheduler& navigationScheduler() const;
153         FrameSelection& selection() const;
154         FrameTree& tree() const;
155         AnimationController& animation() const;
156         ScriptController& script();
157         
158         WEBCORE_EXPORT RenderView* contentRenderer() const; // Root of the render tree for the document contained in this frame.
159         WEBCORE_EXPORT RenderWidget* ownerRenderer() const; // Renderer for the element that contains this frame.
160
161     // ======== All public functions below this point are candidates to move out of Frame into another class. ========
162
163         void injectUserScripts(UserScriptInjectionTime);
164         
165         WEBCORE_EXPORT String layerTreeAsText(LayerTreeFlags = 0) const;
166         WEBCORE_EXPORT String trackedRepaintRectsAsText() const;
167
168         WEBCORE_EXPORT static Frame* frameForWidget(const Widget*);
169
170         Settings& settings() const { return *m_settings; }
171
172         void setPrinting(bool printing, const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkRatio, AdjustViewSizeOrNot);
173         bool shouldUsePrintingLayout() const;
174         WEBCORE_EXPORT FloatSize resizePageRectsKeepingRatio(const FloatSize& originalSize, const FloatSize& expectedSize);
175
176         void setDocument(PassRefPtr<Document>);
177
178         WEBCORE_EXPORT void setPageZoomFactor(float);
179         float pageZoomFactor() const { return m_pageZoomFactor; }
180         WEBCORE_EXPORT void setTextZoomFactor(float);
181         float textZoomFactor() const { return m_textZoomFactor; }
182         WEBCORE_EXPORT void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor);
183
184         // Scale factor of this frame with respect to the container.
185         WEBCORE_EXPORT float frameScaleFactor() const;
186
187         void deviceOrPageScaleFactorChanged();
188
189 #if PLATFORM(IOS)
190         const ViewportArguments& viewportArguments() const;
191         WEBCORE_EXPORT void setViewportArguments(const ViewportArguments&);
192
193         WEBCORE_EXPORT Node* deepestNodeAtLocation(const FloatPoint& viewportLocation);
194         WEBCORE_EXPORT Node* nodeRespondingToClickEvents(const FloatPoint& viewportLocation, FloatPoint& adjustedViewportLocation);
195         WEBCORE_EXPORT Node* nodeRespondingToScrollWheelEvents(const FloatPoint& viewportLocation);
196
197         int indexCountOfWordPrecedingSelection(NSString* word) const;
198         WEBCORE_EXPORT NSArray* wordsInCurrentParagraph() const;
199         WEBCORE_EXPORT CGRect renderRectForPoint(CGPoint, bool* isReplaced, float* fontSize) const;
200
201         WEBCORE_EXPORT void setSelectionChangeCallbacksDisabled(bool = true);
202         bool selectionChangeCallbacksDisabled() const;
203
204         enum ViewportOffsetChangeType { IncrementalScrollOffset, CompletedScrollOffset };
205         WEBCORE_EXPORT void viewportOffsetChanged(ViewportOffsetChangeType);
206         bool containsTiledBackingLayers() const;
207
208         WEBCORE_EXPORT void overflowScrollPositionChangedForNode(const IntPoint&, Node*, bool isUserScroll);
209
210         WEBCORE_EXPORT void resetAllGeolocationPermission();
211 #endif
212
213 #if ENABLE(ORIENTATION_EVENTS)
214         // Orientation is the interface orientation in degrees. Some examples are:
215         //  0 is straight up; -90 is when the device is rotated 90 clockwise;
216         //  90 is when rotated counter clockwise.
217         WEBCORE_EXPORT void orientationChanged();
218         int orientation() const;
219 #endif
220
221         void clearTimers();
222         static void clearTimers(FrameView*, Document*);
223
224         WEBCORE_EXPORT String displayStringModifiedByEncoding(const String&) const;
225
226         WEBCORE_EXPORT VisiblePosition visiblePositionForPoint(const IntPoint& framePoint);
227         Document* documentAtPoint(const IntPoint& windowPoint);
228         WEBCORE_EXPORT PassRefPtr<Range> rangeForPoint(const IntPoint& framePoint);
229
230         WEBCORE_EXPORT String searchForLabelsAboveCell(const JSC::Yarr::RegularExpression&, HTMLTableCellElement*, size_t* resultDistanceFromStartOfCell);
231         String searchForLabelsBeforeElement(const Vector<String>& labels, Element*, size_t* resultDistance, bool* resultIsInCellAbove);
232         String matchLabelsAgainstElement(const Vector<String>& labels, Element*);
233
234 #if PLATFORM(IOS)
235         // Scroll the selection in an overflow layer on iOS.
236         void scrollOverflowLayer(RenderLayer* , const IntRect& visibleRect, const IntRect& exposeRect);
237
238         WEBCORE_EXPORT int preferredHeight() const;
239         WEBCORE_EXPORT int innerLineHeight(DOMNode*) const;
240         WEBCORE_EXPORT void updateLayout() const;
241         WEBCORE_EXPORT NSRect caretRect() const;
242         WEBCORE_EXPORT NSRect rectForScrollToVisible() const;
243         WEBCORE_EXPORT DOMCSSStyleDeclaration* styleAtSelectionStart() const;
244         WEBCORE_EXPORT unsigned formElementsCharacterCount() const;
245         WEBCORE_EXPORT void setTimersPaused(bool);
246         bool timersPaused() const { return m_timersPausedCount; }
247         WEBCORE_EXPORT void dispatchPageHideEventBeforePause();
248         WEBCORE_EXPORT void dispatchPageShowEventBeforeResume();
249         WEBCORE_EXPORT void setRangedSelectionBaseToCurrentSelection();
250         WEBCORE_EXPORT void setRangedSelectionBaseToCurrentSelectionStart();
251         WEBCORE_EXPORT void setRangedSelectionBaseToCurrentSelectionEnd();
252         WEBCORE_EXPORT void clearRangedSelectionInitialExtent();
253         WEBCORE_EXPORT void setRangedSelectionInitialExtentToCurrentSelectionStart();
254         WEBCORE_EXPORT void setRangedSelectionInitialExtentToCurrentSelectionEnd();
255         VisibleSelection rangedSelectionBase() const;
256         WEBCORE_EXPORT VisibleSelection rangedSelectionInitialExtent() const;
257         WEBCORE_EXPORT void recursiveSetUpdateAppearanceEnabled(bool);
258         WEBCORE_EXPORT NSArray* interpretationsForCurrentRoot() const;
259 #endif
260         void suspendActiveDOMObjectsAndAnimations();
261         void resumeActiveDOMObjectsAndAnimations();
262         bool activeDOMObjectsAndAnimationsSuspended() const { return m_activeDOMObjectsAndAnimationsSuspendedCount > 0; }
263
264         bool isURLAllowed(const URL&) const;
265
266     // ========
267
268     protected:
269         Frame(Page&, HTMLFrameOwnerElement*, FrameLoaderClient&);
270
271     private:
272         void injectUserScriptsForWorld(DOMWrapperWorld&, const UserScriptVector&, UserScriptInjectionTime);
273
274         HashSet<FrameDestructionObserver*> m_destructionObservers;
275
276         MainFrame& m_mainFrame;
277         Page* m_page;
278         const RefPtr<Settings> m_settings;
279         mutable FrameTree m_treeNode;
280         mutable FrameLoader m_loader;
281         mutable NavigationScheduler m_navigationScheduler;
282
283         HTMLFrameOwnerElement* m_ownerElement;
284         RefPtr<FrameView> m_view;
285         RefPtr<Document> m_doc;
286
287         const std::unique_ptr<ScriptController> m_script;
288         const std::unique_ptr<Editor> m_editor;
289         const std::unique_ptr<FrameSelection> m_selection;
290         const std::unique_ptr<EventHandler> m_eventHandler;
291         const std::unique_ptr<AnimationController> m_animationController;
292
293 #if PLATFORM(IOS)
294         void betterApproximateNode(const IntPoint& testPoint, NodeQualifier, Node*& best, Node* failedNode, IntPoint& bestPoint, IntRect& bestRect, const IntRect& testRect);
295         bool hitTestResultAtViewportLocation(const FloatPoint& viewportLocation, HitTestResult&, IntPoint& center);
296         Node* qualifyingNodeAtViewportLocation(const FloatPoint& viewportLocation, FloatPoint& adjustedViewportLocation, NodeQualifier, bool shouldApproximate);
297
298         void overflowAutoScrollTimerFired();
299         void startOverflowAutoScroll(const IntPoint&);
300         int checkOverflowScroll(OverflowScrollAction);
301
302         void setTimersPausedInternal(bool);
303
304         Timer m_overflowAutoScrollTimer;
305         float m_overflowAutoScrollDelta;
306         IntPoint m_overflowAutoScrollPos;
307         ViewportArguments m_viewportArguments;
308         bool m_selectionChangeCallbacksDisabled;
309         int m_timersPausedCount;
310         VisibleSelection m_rangedSelectionBase;
311         VisibleSelection m_rangedSelectionInitialExtent;
312 #endif
313
314         float m_pageZoomFactor;
315         float m_textZoomFactor;
316
317         int m_activeDOMObjectsAndAnimationsSuspendedCount;
318     };
319
320     inline void Frame::init()
321     {
322         m_loader.init();
323     }
324
325     inline FrameLoader& Frame::loader() const
326     {
327         return m_loader;
328     }
329
330     inline NavigationScheduler& Frame::navigationScheduler() const
331     {
332         return m_navigationScheduler;
333     }
334
335     inline FrameView* Frame::view() const
336     {
337         return m_view.get();
338     }
339
340     inline ScriptController& Frame::script()
341     {
342         return *m_script;
343     }
344
345     inline Document* Frame::document() const
346     {
347         return m_doc.get();
348     }
349
350     inline FrameSelection& Frame::selection() const
351     {
352         return *m_selection;
353     }
354
355     inline Editor& Frame::editor() const
356     {
357         return *m_editor;
358     }
359
360     inline AnimationController& Frame::animation() const
361     {
362         return *m_animationController;
363     }
364
365     inline HTMLFrameOwnerElement* Frame::ownerElement() const
366     {
367         return m_ownerElement;
368     }
369
370     inline FrameTree& Frame::tree() const
371     {
372         return m_treeNode;
373     }
374
375     inline Page* Frame::page() const
376     {
377         return m_page;
378     }
379
380     inline void Frame::detachFromPage()
381     {
382         m_page = 0;
383     }
384
385     inline EventHandler& Frame::eventHandler() const
386     {
387         return *m_eventHandler;
388     }
389
390     inline MainFrame& Frame::mainFrame() const
391     {
392         return m_mainFrame;
393     }
394
395 } // namespace WebCore
396
397 #endif // Frame_h