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