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