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