6fb46de923c1b81701ea55f84910c9b68de6c673
[WebKit-https.git] / WebCore / page / Frame.h
1 // -*- c-basic-offset: 4 -*-
2 /*
3  * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
4  *                     1999-2001 Lars Knoll <knoll@kde.org>
5  *                     1999-2001 Antti Koivisto <koivisto@kde.org>
6  *                     2000-2001 Simon Hausmann <hausmann@kde.org>
7  *                     2000-2001 Dirk Mueller <mueller@kde.org>
8  *                     2000 Stefan Schimanski <1Stein@gmx.de>
9  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
10  * Copyright (C) 2007 Trolltech ASA
11  * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
12  *
13  * This library is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU Library General Public
15  * License as published by the Free Software Foundation; either
16  * version 2 of the License, or (at your option) any later version.
17  *
18  * This library is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21  * Library General Public License for more details.
22  *
23  * You should have received a copy of the GNU Library General Public License
24  * along with this library; see the file COPYING.LIB.  If not, write to
25  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26  * Boston, MA 02110-1301, USA.
27  */
28
29 #ifndef Frame_h
30 #define Frame_h
31
32 #include "DragImage.h"
33 #include "EditAction.h"
34 #include "RenderLayer.h"
35 #include "TextGranularity.h"
36
37 #if PLATFORM(MAC)
38 #ifndef __OBJC__
39 class NSArray;
40 class NSDictionary;
41 class NSMutableDictionary;
42 class NSString;
43 typedef int NSWritingDirection;
44 #endif
45 #endif
46
47 namespace WebCore {
48
49 class Editor;
50 class EventHandler;
51 class FrameLoader;
52 class FrameLoaderClient;
53 class FramePrivate;
54 class FrameTree;
55 class HTMLFrameOwnerElement;
56 class HTMLTableCellElement;
57 class ScriptController;
58 class RegularExpression;
59 class RenderPart;
60 class Selection;
61 class SelectionController;
62 class Widget;
63
64 template <typename T> class Timer;
65
66 class Frame : public RefCounted<Frame> {
67 public:
68     static PassRefPtr<Frame> create(Page* page, HTMLFrameOwnerElement* ownerElement, FrameLoaderClient* client)
69     {
70         return adoptRef(new Frame(page, ownerElement, client));
71     }
72     void setView(FrameView*);
73     ~Frame();
74     
75     void init();
76
77     Page* page() const;
78     HTMLFrameOwnerElement* ownerElement() const;
79
80     void pageDestroyed();
81     void disconnectOwnerElement();
82
83     Document* document() const;
84     FrameView* view() const;
85
86     DOMWindow* domWindow() const;
87     void clearFormerDOMWindow(DOMWindow*);
88     Editor* editor() const;
89     EventHandler* eventHandler() const;
90     FrameLoader* loader() const;
91     SelectionController* selection() const;
92     FrameTree* tree() const;
93     AnimationController* animation() const;
94     ScriptController* script();
95
96     RenderView* contentRenderer() const; // root renderer for the document contained in this frame
97     RenderPart* ownerRenderer() const; // renderer for the element that contains this frame
98     
99     bool isDisconnected() const;
100     void setIsDisconnected(bool);
101     bool excludeFromTextSearch() const;
102     void setExcludeFromTextSearch(bool);
103
104     friend class FramePrivate;
105
106 private:
107     Frame(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*);
108
109     FramePrivate* d;
110     
111 // === undecided, would like to consider moving to another class
112
113 public:
114     static Frame* frameForWidget(const Widget*);
115
116     Settings* settings() const; // can be NULL
117
118 #if FRAME_LOADS_USER_STYLESHEET
119     void setUserStyleSheetLocation(const KURL&);
120     void setUserStyleSheet(const String& styleSheetData);
121 #endif
122
123     void setPrinting(bool printing, float minPageWidth, float maxPageWidth, bool adjustViewSize);
124
125     bool inViewSourceMode() const;
126     void setInViewSourceMode(bool = true) const;
127
128     void keepAlive(); // Used to keep the frame alive when running a script that might destroy it.
129 #ifndef NDEBUG
130     static void cancelAllKeepAlive();
131 #endif
132
133     void setDocument(PassRefPtr<Document>);
134
135     void clearTimers();
136     static void clearTimers(FrameView*, Document*);
137
138     // Convenience, to avoid repeating the code to dig down to get this.
139     UChar backslashAsCurrencySymbol() const;
140
141     void setNeedsReapplyStyles();
142     bool needsReapplyStyles() const;
143     void reapplyStyles();
144
145     String documentTypeString() const;
146
147     // This method -- and the corresponding list of former DOM windows --
148     // should move onto ScriptController
149     void clearDOMWindow();
150
151 private:
152     void lifeSupportTimerFired(Timer<Frame>*);
153
154 // === to be moved into Document
155
156 public:
157     bool isFrameSet() const;
158
159 // === to be moved into EventHandler
160
161 public:
162     void sendResizeEvent();
163     void sendScrollEvent();
164
165 // === to be moved into FrameView
166
167 public:
168     void paint(GraphicsContext*, const IntRect&);
169     void setPaintRestriction(PaintRestriction);
170     bool isPainting() const;
171
172     static double currentPaintTimeStamp() { return s_currentPaintTimeStamp; } // returns 0 if not painting
173     
174     void forceLayout(bool allowSubtree = false);
175     void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth, bool adjustViewSize);
176
177     void adjustPageHeight(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
178
179     void setZoomFactor(float scale, bool isTextOnly);
180     float zoomFactor() const;
181     bool isZoomFactorTextOnly() const;
182     bool shouldApplyTextZoom() const;
183     bool shouldApplyPageZoom() const;
184     float pageZoomFactor() const { return shouldApplyPageZoom() ? zoomFactor() : 1.0f; }
185     float textZoomFactor() const { return shouldApplyTextZoom() ? zoomFactor() : 1.0f; }
186
187     bool prohibitsScrolling() const;
188     void setProhibitsScrolling(const bool);
189
190 private:
191     static double s_currentPaintTimeStamp; // used for detecting decoded resource thrash in the cache
192
193 // === to be moved into Chrome
194
195 public:
196     void focusWindow();
197     void unfocusWindow();
198     bool shouldClose();
199     void scheduleClose();
200
201     void setJSStatusBarText(const String&);
202     void setJSDefaultStatusBarText(const String&);
203     String jsStatusBarText() const;
204     String jsDefaultStatusBarText() const;
205
206 // === to be moved into Editor
207
208 public:
209     String selectedText() const;  
210     bool findString(const String&, bool forward, bool caseFlag, bool wrapFlag, bool startInSelection);
211
212     const Selection& mark() const; // Mark, to be used as emacs uses it.
213     void setMark(const Selection&);
214
215     void computeAndSetTypingStyle(CSSStyleDeclaration* , EditAction = EditActionUnspecified);
216     String selectionStartStylePropertyValue(int stylePropertyID) const;
217     void applyEditingStyleToBodyElement() const;
218     void removeEditingStyleFromBodyElement() const;
219     void applyEditingStyleToElement(Element*) const;
220     void removeEditingStyleFromElement(Element*) const;
221
222     IntRect firstRectForRange(Range*) const;
223     
224     void respondToChangedSelection(const Selection& oldSelection, bool closeTyping);
225     bool shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity, bool stillSelecting) const;
226
227     RenderStyle* styleForSelectionStart(Node*& nodeToRemove) const;
228
229     unsigned markAllMatchesForText(const String&, bool caseFlag, unsigned limit);
230     bool markedTextMatchesAreHighlighted() const;
231     void setMarkedTextMatchesAreHighlighted(bool flag);
232
233     PassRefPtr<CSSComputedStyleDeclaration> selectionComputedStyle(Node*& nodeToRemove) const;
234
235     void textFieldDidBeginEditing(Element*);
236     void textFieldDidEndEditing(Element*);
237     void textDidChangeInTextField(Element*);
238     bool doTextFieldCommandFromEvent(Element*, KeyboardEvent*);
239     void textWillBeDeletedInTextField(Element* input);
240     void textDidChangeInTextArea(Element*);
241
242     DragImageRef dragImageForSelection();
243     
244 // === to be moved into SelectionController
245
246 public:
247     TextGranularity selectionGranularity() const;
248     void setSelectionGranularity(TextGranularity) const;
249
250     bool shouldChangeSelection(const Selection&) const;
251     bool shouldDeleteSelection(const Selection&) const;
252     void clearCaretRectIfNeeded();
253     void setFocusedNodeIfNeeded();
254     void selectionLayoutChanged();
255     void notifyRendererOfSelectionChange(bool userTriggered);
256
257     void invalidateSelection();
258
259     void setCaretVisible(bool = true);
260     void paintCaret(GraphicsContext*, const IntRect&) const;  
261     void paintDragCaret(GraphicsContext*, const IntRect&) const;
262
263     bool isContentEditable() const; // if true, everything in frame is editable
264
265     void updateSecureKeyboardEntryIfActive();
266
267     CSSMutableStyleDeclaration* typingStyle() const;
268     void setTypingStyle(CSSMutableStyleDeclaration*);
269     void clearTypingStyle();
270
271     FloatRect selectionRect(bool clipToVisibleContent = true) const;
272     void selectionTextRects(Vector<FloatRect>&, bool clipToVisibleContent = true) const;
273
274     HTMLFormElement* currentForm() const;
275
276     void revealSelection(const RenderLayer::ScrollAlignment& = RenderLayer::gAlignCenterIfNeeded) const;
277     void revealCaret(const RenderLayer::ScrollAlignment& = RenderLayer::gAlignCenterIfNeeded) const;
278     void setSelectionFromNone();
279
280     void setUseSecureKeyboardEntry(bool);
281
282 private:
283     void caretBlinkTimerFired(Timer<Frame>*);
284
285 public:
286     SelectionController* dragCaretController() const;
287
288     String searchForLabelsAboveCell(RegularExpression*, HTMLTableCellElement*);
289     String searchForLabelsBeforeElement(const Vector<String>& labels, Element*);
290     String matchLabelsAgainstElement(const Vector<String>& labels, Element*);
291     
292     VisiblePosition visiblePositionForPoint(const IntPoint& framePoint);
293     Document* documentAtPoint(const IntPoint& windowPoint);
294
295 #if PLATFORM(MAC)
296
297 // === undecided, would like to consider moving to another class
298
299 public:
300     NSString* searchForNSLabelsAboveCell(RegularExpression*, HTMLTableCellElement*);
301     NSString* searchForLabelsBeforeElement(NSArray* labels, Element*);
302     NSString* matchLabelsAgainstElement(NSArray* labels, Element*);
303
304 #if ENABLE(DASHBOARD_SUPPORT)
305     NSMutableDictionary* dashboardRegionsDictionary();
306 #endif
307
308     NSImage* selectionImage(bool forceBlackText = false) const;
309     NSImage* snapshotDragImage(Node*, NSRect* imageRect, NSRect* elementRect) const;
310
311 private:    
312     NSImage* imageFromRect(NSRect) const;
313
314 // === to be moved into Editor
315
316 public:
317     NSDictionary* fontAttributesForSelectionStart() const;
318     NSWritingDirection baseWritingDirectionForSelectionStart() const;
319
320 #endif
321
322 };
323
324 } // namespace WebCore
325
326 #endif // Frame_h