WebCore:
[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  *
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 "DragImage.h"
32 #include "EditAction.h"
33 #include "RenderLayer.h"
34 #include "TextGranularity.h"
35
36 struct NPObject;
37
38 namespace KJS {
39
40     class JSGlobalObject;
41
42     namespace Bindings {
43         class Instance;
44         class RootObject;
45     }
46
47 }
48
49 #if PLATFORM(MAC)
50 #ifdef __OBJC__
51 @class WebScriptObject;
52 #else
53 class NSArray;
54 class NSDictionary;
55 class NSMutableDictionary;
56 class NSString;
57 class WebScriptObject;
58 typedef int NSWritingDirection;
59 #endif
60 #endif
61
62 namespace WebCore {
63
64 class Editor;
65 class EventHandler;
66 class FrameLoader;
67 class FrameLoaderClient;
68 class FramePrivate;
69 class FrameTree;
70 class HTMLFrameOwnerElement;
71 class HTMLTableCellElement;
72 class ScriptController;
73 class RegularExpression;
74 class RenderPart;
75 class Selection;
76 class SelectionController;
77 class Widget;
78
79 template <typename T> class Timer;
80
81 class Frame : public RefCounted<Frame> {
82 public:
83     static PassRefPtr<Frame> create(Page* page, HTMLFrameOwnerElement* ownerElement, FrameLoaderClient* client)
84     {
85         return adoptRef(new Frame(page, ownerElement, client));
86     }
87     void setView(FrameView*);
88     ~Frame();
89     
90     void init();
91
92     Page* page() const;
93     HTMLFrameOwnerElement* ownerElement() const;
94
95     void pageDestroyed();
96     void disconnectOwnerElement();
97
98     Document* document() const;
99     FrameView* view() const;
100
101     DOMWindow* domWindow() const;
102     void clearFormerDOMWindow(DOMWindow*);
103     Editor* editor() const;
104     EventHandler* eventHandler() const;
105     FrameLoader* loader() const;
106     SelectionController* selection() const;
107     FrameTree* tree() const;
108     AnimationController* animation() const;
109     ScriptController* script();
110
111     RenderView* contentRenderer() const; // root renderer for the document contained in this frame
112     RenderPart* ownerRenderer() const; // renderer for the element that contains this frame
113     
114     bool isDisconnected() const;
115     void setIsDisconnected(bool);
116
117     friend class FramePrivate;
118
119 private:
120     Frame(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*);
121
122     FramePrivate* d;
123     
124 // === undecided, would like to consider moving to another class
125
126 public:
127     static Frame* frameForWidget(const Widget*);
128
129     Settings* settings() const; // can be NULL
130
131 #if FRAME_LOADS_USER_STYLESHEET
132     void setUserStyleSheetLocation(const KURL&);
133     void setUserStyleSheet(const String& styleSheetData);
134 #endif
135
136     void setPrinting(bool printing, float minPageWidth, float maxPageWidth, bool adjustViewSize);
137
138     bool inViewSourceMode() const;
139     void setInViewSourceMode(bool = true) const;
140
141     void keepAlive(); // Used to keep the frame alive when running a script that might destroy it.
142 #ifndef NDEBUG
143     static void cancelAllKeepAlive();
144 #endif
145
146     void setDocument(PassRefPtr<Document>);
147
148     void clearTimers();
149     static void clearTimers(FrameView*, Document*);
150
151     // Convenience, to avoid repeating the code to dig down to get this.
152     UChar backslashAsCurrencySymbol() const;
153
154     void setNeedsReapplyStyles();
155     bool needsReapplyStyles() const;
156     void reapplyStyles();
157
158     String documentTypeString() const;
159
160     void clearScriptController();
161     void clearDOMWindow();
162
163     void clearScriptObjects();
164     void cleanupScriptObjectsForPlugin(void*);
165
166 private:
167     void clearPlatformScriptObjects();
168     void disconnectPlatformScriptObjects();
169
170     void lifeSupportTimerFired(Timer<Frame>*);
171     
172 // === to be moved into ScriptController
173
174 public:
175     PassRefPtr<KJS::Bindings::Instance> createScriptInstanceForWidget(Widget*);
176     KJS::Bindings::RootObject* bindingRootObject();
177
178     PassRefPtr<KJS::Bindings::RootObject> createRootObject(void* nativeHandle, KJS::JSGlobalObject*);
179
180 #if PLATFORM(MAC)
181 #if ENABLE(MAC_JAVA_BRIDGE)
182     static void initJavaJSBindings();
183 #endif
184     WebScriptObject* windowScriptObject();
185 #endif
186
187 #if ENABLE(NETSCAPE_PLUGIN_API)
188     NPObject* windowScriptNPObject();
189 #endif    
190
191 // === to be moved into Document
192
193 public:
194     bool isFrameSet() const;
195
196 // === to be moved into EventHandler
197
198 public:
199     void sendResizeEvent();
200     void sendScrollEvent();
201
202 // === to be moved into FrameView
203
204 public:
205     void paint(GraphicsContext*, const IntRect&);
206     void setPaintRestriction(PaintRestriction);
207     bool isPainting() const;
208
209     static double currentPaintTimeStamp() { return s_currentPaintTimeStamp; } // returns 0 if not painting
210     
211     void forceLayout(bool allowSubtree = false);
212     void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth, bool adjustViewSize);
213
214     void adjustPageHeight(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
215
216     void setZoomFactor(float scale, bool isTextOnly);
217     float zoomFactor() const;
218     bool isZoomFactorTextOnly() const;
219     bool shouldApplyTextZoom() const;
220     bool shouldApplyPageZoom() const;
221     float pageZoomFactor() const { return shouldApplyPageZoom() ? zoomFactor() : 1.0f; }
222     float textZoomFactor() const { return shouldApplyTextZoom() ? zoomFactor() : 1.0f; }
223
224     bool prohibitsScrolling() const;
225     void setProhibitsScrolling(const bool);
226
227 private:
228     static double s_currentPaintTimeStamp; // used for detecting decoded resource thrash in the cache
229
230 // === to be moved into Chrome
231
232 public:
233     void focusWindow();
234     void unfocusWindow();
235     bool shouldClose();
236     void scheduleClose();
237
238     void setJSStatusBarText(const String&);
239     void setJSDefaultStatusBarText(const String&);
240     String jsStatusBarText() const;
241     String jsDefaultStatusBarText() const;
242
243 // === to be moved into Editor
244
245 public:
246     String selectedText() const;  
247     bool findString(const String&, bool forward, bool caseFlag, bool wrapFlag, bool startInSelection);
248
249     const Selection& mark() const; // Mark, to be used as emacs uses it.
250     void setMark(const Selection&);
251
252     void computeAndSetTypingStyle(CSSStyleDeclaration* , EditAction = EditActionUnspecified);
253     String selectionStartStylePropertyValue(int stylePropertyID) const;
254     void applyEditingStyleToBodyElement() const;
255     void removeEditingStyleFromBodyElement() const;
256     void applyEditingStyleToElement(Element*) const;
257     void removeEditingStyleFromElement(Element*) const;
258
259     IntRect firstRectForRange(Range*) const;
260     
261     void respondToChangedSelection(const Selection& oldSelection, bool closeTyping);
262     bool shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity, bool stillSelecting) const;
263
264     RenderStyle* styleForSelectionStart(Node*& nodeToRemove) const;
265
266     unsigned markAllMatchesForText(const String&, bool caseFlag, unsigned limit);
267     bool markedTextMatchesAreHighlighted() const;
268     void setMarkedTextMatchesAreHighlighted(bool flag);
269
270     PassRefPtr<CSSComputedStyleDeclaration> selectionComputedStyle(Node*& nodeToRemove) const;
271
272     void textFieldDidBeginEditing(Element*);
273     void textFieldDidEndEditing(Element*);
274     void textDidChangeInTextField(Element*);
275     bool doTextFieldCommandFromEvent(Element*, KeyboardEvent*);
276     void textWillBeDeletedInTextField(Element* input);
277     void textDidChangeInTextArea(Element*);
278
279     DragImageRef dragImageForSelection();
280     
281 // === to be moved into SelectionController
282
283 public:
284     TextGranularity selectionGranularity() const;
285     void setSelectionGranularity(TextGranularity) const;
286
287     bool shouldChangeSelection(const Selection&) const;
288     bool shouldDeleteSelection(const Selection&) const;
289     void clearCaretRectIfNeeded();
290     void setFocusedNodeIfNeeded();
291     void selectionLayoutChanged();
292     void notifyRendererOfSelectionChange(bool userTriggered);
293
294     void invalidateSelection();
295
296     void setCaretVisible(bool = true);
297     void paintCaret(GraphicsContext*, const IntRect&) const;  
298     void paintDragCaret(GraphicsContext*, const IntRect&) const;
299
300     bool isContentEditable() const; // if true, everything in frame is editable
301
302     void updateSecureKeyboardEntryIfActive();
303
304     CSSMutableStyleDeclaration* typingStyle() const;
305     void setTypingStyle(CSSMutableStyleDeclaration*);
306     void clearTypingStyle();
307
308     FloatRect selectionRect(bool clipToVisibleContent = true) const;
309     void selectionTextRects(Vector<FloatRect>&, bool clipToVisibleContent = true) const;
310
311     HTMLFormElement* currentForm() const;
312
313     void revealSelection(const RenderLayer::ScrollAlignment& = RenderLayer::gAlignCenterIfNeeded) const;
314     void revealCaret(const RenderLayer::ScrollAlignment& = RenderLayer::gAlignCenterIfNeeded) const;
315     void setSelectionFromNone();
316
317     void setUseSecureKeyboardEntry(bool);
318
319 private:
320     void caretBlinkTimerFired(Timer<Frame>*);
321
322 public:
323     SelectionController* dragCaretController() const;
324
325     String searchForLabelsAboveCell(RegularExpression*, HTMLTableCellElement*);
326     String searchForLabelsBeforeElement(const Vector<String>& labels, Element*);
327     String matchLabelsAgainstElement(const Vector<String>& labels, Element*);
328     
329     VisiblePosition visiblePositionForPoint(const IntPoint& framePoint);
330     Document* documentAtPoint(const IntPoint& windowPoint);
331
332 #if PLATFORM(MAC)
333
334 // === undecided, would like to consider moving to another class
335
336 public:
337     NSString* searchForNSLabelsAboveCell(RegularExpression*, HTMLTableCellElement*);
338     NSString* searchForLabelsBeforeElement(NSArray* labels, Element*);
339     NSString* matchLabelsAgainstElement(NSArray* labels, Element*);
340
341 #if ENABLE(DASHBOARD_SUPPORT)
342     NSMutableDictionary* dashboardRegionsDictionary();
343 #endif
344
345     NSImage* selectionImage(bool forceBlackText = false) const;
346     NSImage* snapshotDragImage(Node*, NSRect* imageRect, NSRect* elementRect) const;
347
348 private:    
349     NSImage* imageFromRect(NSRect) const;
350
351 // === to be moved into Editor
352
353 public:
354     NSDictionary* fontAttributesForSelectionStart() const;
355     NSWritingDirection baseWritingDirectionForSelectionStart() const;
356
357 #endif
358
359 };
360
361 } // namespace WebCore
362
363 #endif // Frame_h