e2f49d4dd6a3bc0af851b056f2dca04c5027a907
[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 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., 59 Temple Place - Suite 330,
25  * Boston, MA 02111-1307, USA.
26  */
27
28 #ifndef Frame_h
29 #define Frame_h
30
31 #include "Color.h"
32 #include "EditAction.h"
33 #include "DragImage.h"
34 #include "RenderLayer.h"
35 #include "TextGranularity.h"
36 #include <wtf/unicode/Unicode.h>
37 #include <wtf/Forward.h>
38 #include <wtf/Vector.h>
39
40 struct NPObject;
41
42 namespace KJS {
43     class Interpreter;
44     
45     namespace Bindings {
46         class Instance;
47         class RootObject;
48     }
49 }
50
51 #if PLATFORM(MAC)
52 #ifdef __OBJC__
53 @class NSArray;
54 @class NSDictionary;
55 @class NSMenu;
56 @class NSMutableDictionary;
57 @class NSString;
58 @class WebCoreFrameBridge;
59 @class WebScriptObject;
60 #else
61 class NSArray;
62 class NSDictionary;
63 class NSMenu;
64 class NSMutableDictionary;
65 class NSString;
66 class WebCoreFrameBridge;
67 class WebScriptObject;
68 typedef int NSWritingDirection;
69 #endif
70 #endif
71
72 namespace WebCore {
73
74 class CSSComputedStyleDeclaration;
75 class CSSMutableStyleDeclaration;
76 class CSSStyleDeclaration;
77 class CommandByName;
78 class DOMWindow;
79 class Document;
80 class Editor;
81 class Element;
82 class EventHandler;
83 class FloatRect;
84 class FrameLoader;
85 class FrameLoaderClient;
86 class HTMLFrameOwnerElement;
87 class HTMLTableCellElement;
88 class FramePrivate;
89 class FrameTree;
90 class FrameView;
91 class GraphicsContext;
92 class HTMLFormElement;
93 class IntRect;
94 class KJSProxy;
95 class KURL;
96 class Node;
97 class Page;
98 class Range;
99 class RenderPart;
100 class Selection;
101 class SelectionController;
102 class Settings;
103 class Widget;
104
105 struct FrameLoadRequest;
106
107 template <typename T> class Timer;
108
109 struct MarkedTextUnderline {
110     MarkedTextUnderline() 
111         : startOffset(0), endOffset(0), thick(false) { }
112     MarkedTextUnderline(unsigned s, unsigned e, const Color& c, bool t) 
113         : startOffset(s), endOffset(e), color(c), thick(t) { }
114     unsigned startOffset;
115     unsigned endOffset;
116     Color color;
117     bool thick;
118 };
119
120 class Frame : public Shared<Frame> {
121 public:
122     Frame(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*);
123     virtual void setView(FrameView*);
124     virtual ~Frame();
125     
126     void init();
127
128 #if PLATFORM(MAC)    
129     void setBridge(WebCoreFrameBridge*);
130     WebCoreFrameBridge* bridge() const;
131 #endif
132
133     Page* page() const;
134     HTMLFrameOwnerElement* ownerElement() const;
135
136     void pageDestroyed();
137     void disconnectOwnerElement();
138
139     Document* document() const;
140     FrameView* view() const;
141
142     CommandByName* command() const;
143     DOMWindow* domWindow() const;
144     Editor* editor() const;
145     EventHandler* eventHandler() const;
146     FrameLoader* loader() const;
147     SelectionController* selectionController() const;
148     FrameTree* tree() const;
149
150     RenderObject* renderer() const; // root renderer for the document contained in this frame
151     RenderPart* ownerRenderer(); // renderer for the element that contains this frame
152
153     friend class FramePrivate;
154
155     DragImageRef dragImageForSelection();
156     
157 private:
158     FramePrivate* d;
159     
160 // === undecided, may or may not belong here
161
162 public:
163     static Frame* frameForWidget(const Widget*);
164
165     Settings* settings() const; // can be NULL
166     void reparseConfiguration();
167
168     // should move to FrameView
169     void paint(GraphicsContext*, const IntRect&);
170     void setPaintRestriction(PaintRestriction);
171
172     void setUserStyleSheetLocation(const KURL&);
173     void setUserStyleSheet(const String& styleSheetData);
174
175     void setZoomFactor(int percent);
176     int zoomFactor() const;
177
178     void setPrinting(bool printing, float minPageWidth, float maxPageWidth, bool adjustViewSize);
179
180     bool inViewSourceMode() const;
181     void setInViewSourceMode(bool = true) const;
182
183     void setJSStatusBarText(const String&);
184     void setJSDefaultStatusBarText(const String&);
185     String jsStatusBarText() const;
186     String jsDefaultStatusBarText() const;
187
188     void keepAlive(); // Used to keep the frame alive when running a script that might destroy it.
189 #ifndef NDEBUG
190     static void cancelAllKeepAlive();
191 #endif
192
193     KJS::Bindings::Instance* createScriptInstanceForWidget(Widget*);
194     KJS::Bindings::RootObject* bindingRootObject();
195     
196     PassRefPtr<KJS::Bindings::RootObject> createRootObject(void* nativeHandle, PassRefPtr<KJS::Interpreter>);
197
198 #if PLATFORM(MAC)
199     WebScriptObject* windowScriptObject();
200 #endif
201     NPObject* windowScriptNPObject();
202     
203     void setDocument(PassRefPtr<Document>);
204
205     KJSProxy* scriptProxy();
206
207     bool isFrameSet() const;
208
209     void adjustPageHeight(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
210
211     void forceLayout(bool allowSubtree = false);
212     void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth, bool adjustViewSize);
213
214     void sendResizeEvent();
215     void sendScrollEvent();
216
217     void clearTimers();
218     static void clearTimers(FrameView*);
219
220     bool isActive() const;
221     void setIsActive(bool flag);
222     void setWindowHasFocus(bool flag);
223
224     // Convenience, to avoid repeating the code to dig down to get this.
225     UChar backslashAsCurrencySymbol() const;
226
227     void setNeedsReapplyStyles();
228     String documentTypeString() const;
229
230     bool prohibitsScrolling() const;
231     void setProhibitsScrolling(const bool);
232
233     void dashboardRegionsChanged();
234
235     void cleanupScriptObjects();
236     void cleanupScriptObjectsForPlugin(void*);
237
238 private:
239     void cleanupPlatformScriptObjects();
240
241     void lifeSupportTimerFired(Timer<Frame>*);
242     
243 // === to be moved into Chrome
244
245 public:
246     void focusWindow();
247     void unfocusWindow();
248     void print();
249     bool shouldClose();
250     void scheduleClose();
251
252 // === to be moved into Editor
253
254 public:
255     String selectedText() const;  
256     bool findString(const String&, bool forward, bool caseFlag, bool wrapFlag, bool startInSelection);
257
258     const Selection& mark() const; // Mark, to be used as emacs uses it.
259     void setMark(const Selection&);
260
261     void transpose();
262
263     void computeAndSetTypingStyle(CSSStyleDeclaration* , EditAction = EditActionUnspecified);
264     enum TriState { falseTriState, trueTriState, mixedTriState };
265     TriState selectionHasStyle(CSSStyleDeclaration*) const;
266     String selectionStartStylePropertyValue(int stylePropertyID) const;
267     void applyEditingStyleToBodyElement() const;
268     void removeEditingStyleFromBodyElement() const;
269     void applyEditingStyleToElement(Element*) const;
270     void removeEditingStyleFromElement(Element*) const;
271
272     Range* markedTextRange() const;
273 #if PLATFORM(MAC)
274     void issuePasteCommand();
275 #endif
276     void issueTransposeCommand();
277     void respondToChangedSelection(const Selection& oldSelection, bool closeTyping);
278     bool shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity, bool stillSelecting) const;
279
280     RenderStyle* styleForSelectionStart(Node*& nodeToRemove) const;
281
282     const Vector<MarkedTextUnderline>& markedTextUnderlines() const;  
283     bool markedTextUsesUnderlines() const;
284   
285     unsigned markAllMatchesForText(const String&, bool caseFlag, unsigned limit);
286     bool markedTextMatchesAreHighlighted() const;
287     void setMarkedTextMatchesAreHighlighted(bool flag);
288
289     CSSComputedStyleDeclaration* selectionComputedStyle(Node*& nodeToRemove) const;
290
291     void textFieldDidBeginEditing(Element*);
292     void textFieldDidEndEditing(Element*);
293     void textDidChangeInTextField(Element*);
294     bool doTextFieldCommandFromEvent(Element*, KeyboardEvent*);
295     void textWillBeDeletedInTextField(Element* input);
296     void textDidChangeInTextArea(Element*);
297
298 // === to be moved into SelectionController
299
300 public:
301     TextGranularity selectionGranularity() const;
302     void setSelectionGranularity(TextGranularity) const;
303
304     bool shouldChangeSelection(const Selection&) const;
305     bool shouldDeleteSelection(const Selection&) const;
306     void clearCaretRectIfNeeded();
307     void setFocusedNodeIfNeeded();
308     void selectionLayoutChanged();
309     void notifyRendererOfSelectionChange(bool userTriggered);
310
311     void invalidateSelection();
312
313     void setCaretVisible(bool = true);
314     void paintCaret(GraphicsContext*, const IntRect&) const;  
315     void paintDragCaret(GraphicsContext*, const IntRect&) const;
316
317     bool isContentEditable() const; // if true, everything in frame is editable
318
319     void updateSecureKeyboardEntryIfActive();
320
321     CSSMutableStyleDeclaration* typingStyle() const;
322     void setTypingStyle(CSSMutableStyleDeclaration*);
323     void clearTypingStyle();
324
325     FloatRect selectionRect(bool clipToVisibleContent = true) const;
326     void selectionTextRects(Vector<FloatRect>&, bool clipToVisibleContent = true) const;
327
328     HTMLFormElement* currentForm() const;
329
330     void revealSelection(const RenderLayer::ScrollAlignment& = RenderLayer::gAlignCenterIfNeeded) const;
331     void revealCaret(const RenderLayer::ScrollAlignment& = RenderLayer::gAlignCenterIfNeeded) const;
332     void setSelectionFromNone();
333
334 private:
335     void caretBlinkTimerFired(Timer<Frame>*);
336     void setUseSecureKeyboardEntry(bool);
337
338 // === to be moved into the Platform directory
339
340 public:
341     bool isCharacterSmartReplaceExempt(UChar, bool);
342
343 // === to be deleted
344
345 public:
346     SelectionController* dragCaretController() const;
347
348     String searchForLabelsAboveCell(RegularExpression*, HTMLTableCellElement*);
349     String searchForLabelsBeforeElement(const Vector<String>& labels, Element*);
350     String matchLabelsAgainstElement(const Vector<String>& labels, Element*);
351
352 #if PLATFORM(MAC)
353
354 // === undecided, may or may not belong here
355
356 public:
357     NSString* searchForNSLabelsAboveCell(RegularExpression*, HTMLTableCellElement*);
358     NSString* searchForLabelsBeforeElement(NSArray* labels, Element*);
359     NSString* matchLabelsAgainstElement(NSArray* labels, Element*);
360
361     NSMutableDictionary* dashboardRegionsDictionary();
362
363     void willPopupMenu(NSMenu*);
364
365     NSImage* selectionImage(bool forceWhiteText = false) const;
366     NSImage* snapshotDragImage(Node*, NSRect* imageRect, NSRect* elementRect) const;
367
368 private:    
369     NSImage* imageFromRect(NSRect) const;
370
371 // === to be moved into Chrome
372
373 public:
374     FloatRect customHighlightLineRect(const AtomicString& type, const FloatRect& lineRect, Node*);
375     void paintCustomHighlight(const AtomicString& type, const FloatRect& boxRect, const FloatRect& lineRect, bool text, bool line, Node*);
376
377 // === to be moved into Editor
378
379 public:
380     NSDictionary* fontAttributesForSelectionStart() const;
381     NSWritingDirection baseWritingDirectionForSelectionStart() const;
382
383     void setMarkedTextRange(const Range* , NSArray* attributes, NSArray* ranges);
384
385 #endif
386
387 };
388
389 } // namespace WebCore
390
391 #endif // Frame_h