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