Move cross-port Source/WebCore/page/ code to std::unique_ptr
[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 USE(TILED_BACKING_STORE)
51 #include "TiledBackingStoreClient.h"
52 #endif
53
54 #if PLATFORM(IOS)
55 OBJC_CLASS DOMCSSStyleDeclaration;
56 OBJC_CLASS DOMNode;
57 OBJC_CLASS NSArray;
58 OBJC_CLASS NSString;
59 #endif
60
61 #if PLATFORM(WIN)
62 typedef struct HBITMAP__* HBITMAP;
63 #endif
64
65 namespace JSC { namespace Yarr {
66 class RegularExpression;
67 } }
68
69 namespace WebCore {
70
71     class AnimationController;
72     class Color;
73     class Document;
74     class Editor;
75     class Element;
76     class EventHandler;
77     class FloatSize;
78     class FrameDestructionObserver;
79     class FrameSelection;
80     class FrameView;
81     class HTMLFrameOwnerElement;
82     class HTMLTableCellElement;
83     class HitTestResult;
84     class ImageBuffer;
85     class IntRect;
86     class MainFrame;
87     class Node;
88     class Range;
89     class RenderLayer;
90     class RenderView;
91     class RenderWidget;
92     class ScriptController;
93     class Settings;
94     class TiledBackingStore;
95     class VisiblePosition;
96     class Widget;
97
98 #if PLATFORM(IOS)
99     enum {
100         OverflowScrollNone = 0,
101         OverflowScrollLeft = 1 << 0,
102         OverflowScrollRight = 1 << 1,
103         OverflowScrollUp = 1 << 2,
104         OverflowScrollDown = 1 << 3
105     };
106
107     enum OverflowScrollAction { DoNotPerformOverflowScroll, PerformOverflowScroll };
108     typedef Node* (*NodeQualifier)(const HitTestResult&, Node* terminationNode, IntRect* nodeBounds);
109 #endif
110
111 #if !USE(TILED_BACKING_STORE)
112     class TiledBackingStoreClient { };
113 #endif
114
115     enum {
116         LayerTreeFlagsIncludeDebugInfo = 1 << 0,
117         LayerTreeFlagsIncludeVisibleRects = 1 << 1,
118         LayerTreeFlagsIncludeTileCaches = 1 << 2,
119         LayerTreeFlagsIncludeRepaintRects = 1 << 3,
120         LayerTreeFlagsIncludePaintingPhases = 1 << 4,
121         LayerTreeFlagsIncludeContentLayers = 1 << 5
122     };
123     typedef unsigned LayerTreeFlags;
124
125     class Frame : public RefCounted<Frame>, public TiledBackingStoreClient {
126     public:
127         static PassRefPtr<Frame> create(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*);
128
129         void init();
130 #if PLATFORM(IOS)
131         // Creates <html><body style="..."></body></html> doing minimal amount of work.
132         void initWithSimpleHTMLDocument(const String& style, const URL&);
133 #endif
134         void setView(PassRefPtr<FrameView>);
135         void createView(const IntSize&, const Color&, bool,
136             const IntSize& fixedLayoutSize = IntSize(), const IntRect& fixedVisibleContentRect = IntRect(),
137             bool useFixedLayout = false, ScrollbarMode = ScrollbarAuto, bool horizontalLock = false,
138             ScrollbarMode = ScrollbarAuto, bool verticalLock = false);
139
140         virtual ~Frame();
141
142         void addDestructionObserver(FrameDestructionObserver*);
143         void removeDestructionObserver(FrameDestructionObserver*);
144
145         void willDetachPage();
146         void detachFromPage();
147         void disconnectOwnerElement();
148
149         MainFrame& mainFrame() const;
150         bool isMainFrame() const;
151
152         Page* page() const;
153         HTMLFrameOwnerElement* ownerElement() const;
154
155         Document* document() const;
156         FrameView* view() const;
157
158         Editor& editor() const;
159         EventHandler& eventHandler() const;
160         FrameLoader& loader() const;
161         NavigationScheduler& navigationScheduler() const;
162         FrameSelection& selection() const;
163         FrameTree& tree() const;
164         AnimationController& animation() const;
165         ScriptController& script();
166         
167         RenderView* contentRenderer() const; // Root of the render tree for the document contained in this frame.
168         RenderWidget* ownerRenderer() const; // Renderer for the element that contains this frame.
169
170     // ======== All public functions below this point are candidates to move out of Frame into another class. ========
171
172         void injectUserScripts(UserScriptInjectionTime);
173         
174         String layerTreeAsText(LayerTreeFlags = 0) const;
175         String trackedRepaintRectsAsText() const;
176
177         static Frame* frameForWidget(const Widget*);
178
179         Settings& settings() const { return *m_settings; }
180
181         void setPrinting(bool printing, const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkRatio, AdjustViewSizeOrNot);
182         bool shouldUsePrintingLayout() const;
183         FloatSize resizePageRectsKeepingRatio(const FloatSize& originalSize, const FloatSize& expectedSize);
184
185         void setDocument(PassRefPtr<Document>);
186
187         void setPageZoomFactor(float factor);
188         float pageZoomFactor() const { return m_pageZoomFactor; }
189         void setTextZoomFactor(float factor);
190         float textZoomFactor() const { return m_textZoomFactor; }
191         void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor);
192
193         // Scale factor of this frame with respect to the container.
194         float frameScaleFactor() const;
195
196         void deviceOrPageScaleFactorChanged();
197
198 #if PLATFORM(IOS)
199         const ViewportArguments& viewportArguments() const;
200         void setViewportArguments(const ViewportArguments&);
201
202         Node* deepestNodeAtLocation(const FloatPoint& viewportLocation);
203         Node* nodeRespondingToClickEvents(const FloatPoint& viewportLocation, FloatPoint& adjustedViewportLocation);
204         Node* nodeRespondingToScrollWheelEvents(const FloatPoint& viewportLocation);
205
206         int indexCountOfWordPrecedingSelection(NSString* word) const;
207         NSArray* wordsInCurrentParagraph() const;
208         CGRect renderRectForPoint(CGPoint, bool* isReplaced, float* fontSize) const;
209
210         void setSelectionChangeCallbacksDisabled(bool = true);
211         bool selectionChangeCallbacksDisabled() const;
212
213         enum ViewportOffsetChangeType { IncrementalScrollOffset, CompletedScrollOffset };
214         void viewportOffsetChanged(ViewportOffsetChangeType);
215         bool containsTiledBackingLayers() const;
216
217         void overflowScrollPositionChangedForNode(const IntPoint&, Node*, bool isUserScroll);
218
219         void resetAllGeolocationPermission();
220 #endif
221
222 #if ENABLE(ORIENTATION_EVENTS)
223         // Orientation is the interface orientation in degrees. Some examples are:
224         //  0 is straight up; -90 is when the device is rotated 90 clockwise;
225         //  90 is when rotated counter clockwise.
226         void sendOrientationChangeEvent(int orientation);
227         int orientation() const { return m_orientation; }
228 #endif
229
230         void clearTimers();
231         static void clearTimers(FrameView*, Document*);
232
233         String displayStringModifiedByEncoding(const String&) const;
234
235         VisiblePosition visiblePositionForPoint(const IntPoint& framePoint);
236         Document* documentAtPoint(const IntPoint& windowPoint);
237         PassRefPtr<Range> rangeForPoint(const IntPoint& framePoint);
238
239         String searchForLabelsAboveCell(const JSC::Yarr::RegularExpression&, HTMLTableCellElement*, size_t* resultDistanceFromStartOfCell);
240         String searchForLabelsBeforeElement(const Vector<String>& labels, Element*, size_t* resultDistance, bool* resultIsInCellAbove);
241         String matchLabelsAgainstElement(const Vector<String>& labels, Element*);
242
243 #if ENABLE(IOS_TEXT_AUTOSIZING)
244         void setTextAutosizingWidth(float);
245         float textAutosizingWidth() const;
246 #endif
247
248 #if PLATFORM(IOS)
249         // Scroll the selection in an overflow layer on iOS.
250         void scrollOverflowLayer(RenderLayer* , const IntRect& visibleRect, const IntRect& exposeRect);
251
252         int preferredHeight() const;
253         int innerLineHeight(DOMNode*) const;
254         void updateLayout() const;
255         NSRect caretRect() const;
256         NSRect rectForScrollToVisible() const;
257         DOMCSSStyleDeclaration* styleAtSelectionStart() const;
258         unsigned formElementsCharacterCount() const;
259         void setTimersPaused(bool);
260         bool timersPaused() const { return m_timersPausedCount; }
261         void dispatchPageHideEventBeforePause();
262         void dispatchPageShowEventBeforeResume();
263         void setRangedSelectionBaseToCurrentSelection();
264         void setRangedSelectionBaseToCurrentSelectionStart();
265         void setRangedSelectionBaseToCurrentSelectionEnd();
266         void clearRangedSelectionInitialExtent();
267         void setRangedSelectionInitialExtentToCurrentSelectionStart();
268         void setRangedSelectionInitialExtentToCurrentSelectionEnd();
269         VisibleSelection rangedSelectionBase() const;
270         VisibleSelection rangedSelectionInitialExtent() const;
271         void recursiveSetUpdateAppearanceEnabled(bool);
272         NSArray* interpretationsForCurrentRoot() const;
273 #endif
274         void suspendActiveDOMObjectsAndAnimations();
275         void resumeActiveDOMObjectsAndAnimations();
276         bool activeDOMObjectsAndAnimationsSuspended() const { return m_activeDOMObjectsAndAnimationsSuspendedCount > 0; }
277
278         bool isURLAllowed(const URL&) const;
279
280     // ========
281
282     protected:
283         Frame(Page&, HTMLFrameOwnerElement*, FrameLoaderClient&);
284
285     private:
286         void injectUserScriptsForWorld(DOMWrapperWorld&, const UserScriptVector&, UserScriptInjectionTime);
287
288         HashSet<FrameDestructionObserver*> m_destructionObservers;
289
290         MainFrame& m_mainFrame;
291         Page* m_page;
292         const RefPtr<Settings> m_settings;
293         mutable FrameTree m_treeNode;
294         mutable FrameLoader m_loader;
295         mutable NavigationScheduler m_navigationScheduler;
296
297         HTMLFrameOwnerElement* m_ownerElement;
298         RefPtr<FrameView> m_view;
299         RefPtr<Document> m_doc;
300
301         const std::unique_ptr<ScriptController> m_script;
302         const std::unique_ptr<Editor> m_editor;
303         const std::unique_ptr<FrameSelection> m_selection;
304         const std::unique_ptr<EventHandler> m_eventHandler;
305         const std::unique_ptr<AnimationController> m_animationController;
306
307 #if PLATFORM(IOS)
308         void betterApproximateNode(const IntPoint& testPoint, NodeQualifier, Node*& best, Node* failedNode, IntPoint& bestPoint, IntRect& bestRect, const IntRect& testRect);
309         bool hitTestResultAtViewportLocation(const FloatPoint& viewportLocation, HitTestResult&, IntPoint& center);
310         Node* qualifyingNodeAtViewportLocation(const FloatPoint& viewportLocation, FloatPoint& adjustedViewportLocation, NodeQualifier, bool shouldApproximate);
311
312         void overflowAutoScrollTimerFired(Timer<Frame>*);
313         void startOverflowAutoScroll(const IntPoint&);
314         int checkOverflowScroll(OverflowScrollAction);
315
316         void setTimersPausedInternal(bool);
317
318         Timer<Frame> m_overflowAutoScrollTimer;
319         float m_overflowAutoScrollDelta;
320         IntPoint m_overflowAutoScrollPos;
321         ViewportArguments m_viewportArguments;
322         bool m_selectionChangeCallbacksDisabled;
323         int m_timersPausedCount;
324         VisibleSelection m_rangedSelectionBase;
325         VisibleSelection m_rangedSelectionInitialExtent;
326 #endif
327
328 #if ENABLE(IOS_TEXT_AUTOSIZING)
329         float m_textAutosizingWidth;
330 #endif
331
332         float m_pageZoomFactor;
333         float m_textZoomFactor;
334
335 #if ENABLE(ORIENTATION_EVENTS)
336         int m_orientation;
337 #endif
338
339 #if USE(TILED_BACKING_STORE)
340     // FIXME: The tiled backing store belongs in FrameView, not Frame.
341
342     public:
343         TiledBackingStore* tiledBackingStore() const { return m_tiledBackingStore.get(); }
344         void setTiledBackingStoreEnabled(bool);
345
346     private:
347         // TiledBackingStoreClient interface
348         virtual void tiledBackingStorePaintBegin() override final;
349         virtual void tiledBackingStorePaint(GraphicsContext*, const IntRect&) override final;
350         virtual void tiledBackingStorePaintEnd(const Vector<IntRect>& paintedArea) override final;
351         virtual IntRect tiledBackingStoreContentsRect() override final;
352         virtual IntRect tiledBackingStoreVisibleRect() override final;
353         virtual Color tiledBackingStoreBackgroundColor() const override final;
354
355         std::unique_ptr<TiledBackingStore> m_tiledBackingStore;
356 #endif
357
358         int m_activeDOMObjectsAndAnimationsSuspendedCount;
359     };
360
361     inline void Frame::init()
362     {
363         m_loader.init();
364     }
365
366     inline FrameLoader& Frame::loader() const
367     {
368         return m_loader;
369     }
370
371     inline NavigationScheduler& Frame::navigationScheduler() const
372     {
373         return m_navigationScheduler;
374     }
375
376     inline FrameView* Frame::view() const
377     {
378         return m_view.get();
379     }
380
381     inline ScriptController& Frame::script()
382     {
383         return *m_script;
384     }
385
386     inline Document* Frame::document() const
387     {
388         return m_doc.get();
389     }
390
391     inline FrameSelection& Frame::selection() const
392     {
393         return *m_selection;
394     }
395
396     inline Editor& Frame::editor() const
397     {
398         return *m_editor;
399     }
400
401     inline AnimationController& Frame::animation() const
402     {
403         return *m_animationController;
404     }
405
406     inline HTMLFrameOwnerElement* Frame::ownerElement() const
407     {
408         return m_ownerElement;
409     }
410
411     inline FrameTree& Frame::tree() const
412     {
413         return m_treeNode;
414     }
415
416     inline Page* Frame::page() const
417     {
418         return m_page;
419     }
420
421     inline void Frame::detachFromPage()
422     {
423         m_page = 0;
424     }
425
426     inline EventHandler& Frame::eventHandler() const
427     {
428         return *m_eventHandler;
429     }
430
431     inline MainFrame& Frame::mainFrame() const
432     {
433         return m_mainFrame;
434     }
435
436 } // namespace WebCore
437
438 #endif // Frame_h