50f9063da542954f9a151f80ad71488fb55fd284
[WebKit-https.git] / WebCore / page / Frame.h
1 // -*- c-basic-offset: 4 -*-
2  /* This file is part of the KDE project
3  *
4  * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
5  *                     1999-2001 Lars Knoll <knoll@kde.org>
6  *                     1999-2001 Antti Koivisto <koivisto@kde.org>
7  *                     2000-2001 Simon Hausmann <hausmann@kde.org>
8  *                     2000-2001 Dirk Mueller <mueller@kde.org>
9  *                     2000 Stefan Schimanski <1Stein@gmx.de>
10  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
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 "RenderLayer.h"
34 #include "TextAffinity.h"
35 #include "TextGranularity.h"
36 #include "UChar.h"
37 #include <wtf/Forward.h>
38 #include <wtf/Vector.h>
39
40 namespace KJS {
41     class JSValue;
42     class PausedTimeouts;
43     class SavedBuiltins;
44     class SavedProperties;
45
46     namespace Bindings {
47         class Instance;
48         class RootObject;
49     }
50 }
51
52 namespace WebCore {
53
54 class CSSComputedStyleDeclaration;
55 class CSSMutableStyleDeclaration;
56 class CSSStyleDeclaration;
57 class CommandByName;
58 class DOMWindow;
59 class Document;
60 class DrawContentsEvent;
61 class EditCommand;
62 class Editor;
63 class EditorClient;
64 class Element;
65 class FloatRect;
66 class FormData;
67 class FrameLoader;
68 class FramePrivate;
69 class FrameTree;
70 class FrameView;
71 class GraphicsContext;
72 class HTMLFormElement;
73 class HitTestResult;
74 class IntRect;
75 class KJSProxy;
76 class KURL;
77 class MouseEventWithHitTestResults;
78 class Node;
79 class Page;
80 class PlatformKeyboardEvent;
81 class Plugin;
82 class Range;
83 class RenderLayer;
84 class RenderObject;
85 class RenderPart;
86 class RenderStyle;
87 class RenderWidget;
88 class ResourceRequest;
89 class Selection;
90 class SelectionController;
91 class Settings;
92 class VisiblePosition;
93 class Widget;
94
95 struct FrameLoadRequest;
96
97 template <typename T> class Timer;
98
99 struct MarkedTextUnderline {
100     MarkedTextUnderline() 
101         : startOffset(0), endOffset(0), thick(false) { }
102     MarkedTextUnderline(unsigned s, unsigned e, const Color& c, bool t) 
103         : startOffset(s), endOffset(e), color(c), thick(t) { }
104     unsigned startOffset;
105     unsigned endOffset;
106     Color color;
107     bool thick;
108 };
109
110 class Frame : public Shared<Frame> {
111 public:
112     Frame(Page*, Element*, PassRefPtr<EditorClient>);
113     virtual void setView(FrameView*);
114     virtual ~Frame();
115
116     Page* page() const;
117     Element* ownerElement();
118
119     void pageDestroyed();
120     void disconnectOwnerElement();
121
122     Document* document() const;
123     FrameView* view() const;
124
125     CommandByName* command() const;
126     DOMWindow* domWindow() const;
127     Editor* editor() const;
128     FrameLoader* loader() const;
129     SelectionController* selectionController() const;
130     const Settings* settings() const;
131     FrameTree* tree() const;
132
133     RenderObject* renderer() const; // root renderer for the document contained in this frame
134     RenderPart* ownerRenderer(); // renderer for the element that contains this frame
135
136     friend class FrameGdk;
137     friend class FrameLoader;
138     friend class FrameMac;
139     friend class FramePrivate;
140     friend class FrameQt;
141     friend class FrameWin;
142
143 private:
144     FramePrivate* d;
145
146 // === undecided, may or may not belong here
147
148 public:
149     bool javaScriptEnabled() const;
150     bool javaEnabled() const;
151     bool pluginsEnabled() const;
152
153     void setSettings(Settings*);
154     void reparseConfiguration();
155
156     void paint(GraphicsContext*, const IntRect&);
157
158     void setUserStyleSheetLocation(const KURL&);
159     void setUserStyleSheet(const String& styleSheetData);
160
161     void setStandardFont(const String& name);
162     void setFixedFont(const String& name);
163
164     void setZoomFactor(int percent);
165     int zoomFactor() const;
166
167     bool inViewSourceMode() const;
168     void setInViewSourceMode(bool = true) const;
169
170     void setJSStatusBarText(const String&);
171     void setJSDefaultStatusBarText(const String&);
172     String jsStatusBarText() const;
173     String jsDefaultStatusBarText() const;
174
175     virtual void setupRootForPrinting(bool onOrOff) { }
176     virtual Vector<IntRect> computePageRects(const IntRect& printRect, float userScaleFactor) { return Vector<IntRect>(); }
177
178     void keepAlive(); // Used to keep the frame alive when running a script that might destroy it.
179     static void endAllLifeSupport();
180
181     virtual KJS::Bindings::Instance* getEmbedInstanceForWidget(Widget*) = 0;
182     virtual KJS::Bindings::Instance* getObjectInstanceForWidget(Widget*) = 0;
183     virtual KJS::Bindings::Instance* getAppletInstanceForWidget(Widget*) = 0;
184     virtual KJS::Bindings::RootObject* bindingRootObject() = 0;
185
186     void setDocument(Document*);
187
188     KJSProxy* scriptProxy();
189
190     bool isFrameSet() const;
191
192     bool scrollOverflow(ScrollDirection, ScrollGranularity);
193
194     void adjustPageHeight(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
195
196     static void clearDocumentFocus(Widget*);
197
198     void forceLayout();
199     void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth);
200
201     void sendResizeEvent();
202     void sendScrollEvent();
203     bool canMouseDownStartSelect(Node*);
204
205     void clearTimers();
206     static void clearTimers(FrameView*);
207
208     bool isActive() const;
209     virtual void setIsActive(bool flag);
210     void setWindowHasFocus(bool flag);
211
212     // Convenience, to avoid repeating the code to dig down to get this.
213     UChar backslashAsCurrencySymbol() const;
214
215     void setNeedsReapplyStyles();
216     String documentTypeString() const;
217
218 protected:
219     virtual void cleanupPluginObjects() { }
220
221 private:
222     void lifeSupportTimerFired(Timer<Frame>*);
223     void endLifeSupport();
224
225 // === to be moved into Chrome
226
227 public:
228     virtual void addMessageToConsole(const String& message,  unsigned int lineNumber, const String& sourceID) = 0;
229
230     virtual void runJavaScriptAlert(const String& message) = 0;
231     virtual bool runJavaScriptConfirm(const String& message) = 0;
232     virtual bool runJavaScriptPrompt(const String& message, const String& defaultValue, String& result) = 0;  
233     virtual bool shouldInterruptJavaScript() = 0;
234     virtual void scheduleClose() = 0;
235     virtual void focusWindow() = 0;
236     virtual void unfocusWindow() = 0;
237     virtual void print() = 0;
238
239 private:
240     virtual void setStatusBarText(const String&);
241
242 // === to be moved into Editor
243
244 public:
245     virtual String selectedText() const;  
246     bool findString(const String&, bool, bool, bool);
247
248     const Selection& mark() const; // Mark, to be used as emacs uses it.
249     void setMark(const Selection&);
250
251     void transpose();
252
253     void copyToPasteboard();
254     void cutToPasteboard();
255     void pasteFromPasteboard();
256     void pasteAndMatchStyle();
257     void redo();
258     void undo();
259     virtual bool canRedo() const = 0;
260     virtual bool canUndo() const = 0;
261     void computeAndSetTypingStyle(CSSStyleDeclaration* , EditAction = EditActionUnspecified);
262     enum TriState { falseTriState, trueTriState, mixedTriState };
263     TriState selectionHasStyle(CSSStyleDeclaration*) const;
264     String selectionStartStylePropertyValue(int stylePropertyID) const;
265     void applyEditingStyleToBodyElement() const;
266     void removeEditingStyleFromBodyElement() const;
267     void applyEditingStyleToElement(Element*) const;
268     void removeEditingStyleFromElement(Element*) const;
269
270     virtual void markMisspellingsInAdjacentWords(const VisiblePosition&) = 0;
271     virtual void markMisspellings(const Selection&) = 0;
272     virtual Range* markedTextRange() const = 0;
273     virtual void registerCommandForUndo(PassRefPtr<EditCommand>) = 0;
274     virtual void registerCommandForRedo(PassRefPtr<EditCommand>) = 0;
275     virtual void clearUndoRedoOperations() = 0;
276     virtual void issueUndoCommand() = 0;
277     virtual void issueRedoCommand() = 0;
278     virtual void issueCutCommand() = 0;
279     virtual void issueCopyCommand() = 0;
280     virtual void issuePasteCommand() = 0;
281     virtual void issuePasteAndMatchStyleCommand() = 0;
282     virtual void issueTransposeCommand() = 0;
283     virtual void respondToChangedSelection(const Selection& oldSelection, bool closeTyping) = 0;
284     virtual void respondToChangedContents(const Selection& endingSelection) = 0;
285     virtual bool shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity, bool stillSelecting) const = 0;
286
287     RenderStyle* styleForSelectionStart(Node* &nodeToRemove) const;
288
289     const Vector<MarkedTextUnderline>& markedTextUnderlines() const;  
290     bool markedTextUsesUnderlines() const;
291   
292     unsigned markAllMatchesForText(const String&, bool caseFlag, unsigned limit);
293     bool markedTextMatchesAreHighlighted() const;
294     void setMarkedTextMatchesAreHighlighted(bool flag);
295   
296     CSSComputedStyleDeclaration* selectionComputedStyle(Node*& nodeToRemove) const;
297
298 // === to be moved into EventHandler
299
300 public:
301     virtual bool shouldDragAutoNode(Node*, const IntPoint&) const; // -webkit-user-drag == auto
302
303     virtual bool lastEventIsMouseUp() const = 0;
304
305     virtual bool tabsToLinks() const;
306     virtual bool tabsToAllControls() const;
307     virtual void handleMousePressEvent(const MouseEventWithHitTestResults&);
308     virtual void handleMouseMoveEvent(const MouseEventWithHitTestResults&);
309     virtual void handleMouseReleaseEvent(const MouseEventWithHitTestResults&);
310
311     void updateSelectionForMouseDragOverPosition(const VisiblePosition&);
312
313     void selectClosestWordFromMouseEvent(const PlatformMouseEvent&, Node* innerNode);
314
315     virtual bool mouseDownMayStartSelect() const { return true; }
316     bool mouseDownMayStartAutoscroll() const;
317     void setMouseDownMayStartAutoscroll(bool b);
318
319     bool mouseDownMayStartDrag() const;
320     void setMouseDownMayStartDrag(bool b);
321
322     static Frame* frameForWidget(const Widget*);
323     static Node* nodeForWidget(const Widget*);
324     static Frame* frameForNode(Node*);
325
326     // Call this method before handling a new user action, like on a mouse down or key down.
327     // Currently, all this does is clear the "don't submit form twice" data member.
328     void prepareForUserAction();
329     Node* mousePressNode();
330
331     void stopAutoscrollTimer(bool rendererIsBeingDestroyed = false);
332     RenderObject* autoscrollRenderer() const;
333
334     HitTestResult hitTestResultAtPoint(const IntPoint&, bool allowShadowContent);
335
336     bool prohibitsScrolling() const;
337     void setProhibitsScrolling(const bool);
338   
339 private:
340     void handleAutoscroll(RenderObject*);
341     void startAutoscrollTimer();
342     void setAutoscrollRenderer(RenderObject*);
343
344     void autoscrollTimerFired(Timer<Frame>*);
345
346     void handleMousePressEventSingleClick(const MouseEventWithHitTestResults&);
347     void handleMousePressEventDoubleClick(const MouseEventWithHitTestResults&);
348     void handleMousePressEventTripleClick(const MouseEventWithHitTestResults&);
349
350 // === to be moved into SelectionController
351
352 public:
353     TextGranularity selectionGranularity() const;
354     void setSelectionGranularity(TextGranularity) const;
355
356     bool shouldChangeSelection(const Selection&) const;
357     virtual bool shouldDeleteSelection(const Selection&) const;
358     void clearCaretRectIfNeeded();
359     void setFocusNodeIfNeeded();
360     void selectionLayoutChanged();
361     void notifyRendererOfSelectionChange(bool userTriggered);
362
363     void invalidateSelection();
364
365     void setCaretVisible(bool = true);
366     void paintCaret(GraphicsContext*, const IntRect&) const;  
367     void paintDragCaret(GraphicsContext*, const IntRect&) const;
368
369     void setXPosForVerticalArrowNavigation(int);
370     int xPosForVerticalArrowNavigation() const;
371
372     virtual bool isContentEditable() const; // if true, everything in frame is editable
373
374     virtual void textFieldDidBeginEditing(Element*);
375     virtual void textFieldDidEndEditing(Element*);
376     virtual void textDidChangeInTextField(Element*);
377     virtual bool doTextFieldCommandFromEvent(Element*, const PlatformKeyboardEvent*);
378     virtual void textWillBeDeletedInTextField(Element* input);
379     virtual void textDidChangeInTextArea(Element*);
380
381     virtual bool inputManagerHasMarkedText() const { return false; }
382
383     virtual void setSecureKeyboardEntry(bool) { }
384     virtual bool isSecureKeyboardEntry() { return false; }
385
386     void appliedEditing(PassRefPtr<EditCommand>);
387     void unappliedEditing(PassRefPtr<EditCommand>);
388     void reappliedEditing(PassRefPtr<EditCommand>);
389
390     CSSMutableStyleDeclaration* typingStyle() const;
391     void setTypingStyle(CSSMutableStyleDeclaration*);
392     void clearTypingStyle();
393
394     IntRect selectionRect() const;
395     FloatRect visibleSelectionRect() const;
396
397     HTMLFormElement* currentForm() const;
398
399     void revealSelection(const RenderLayer::ScrollAlignment& = RenderLayer::gAlignCenterIfNeeded) const;
400     void revealCaret(const RenderLayer::ScrollAlignment& = RenderLayer::gAlignCenterIfNeeded) const;
401     void setSelectionFromNone();
402
403 private:
404     void caretBlinkTimerFired(Timer<Frame>*);
405
406 // === to be moved into the Platform directory
407
408 public:
409     virtual String mimeTypeForFileName(const String&) const = 0;
410     virtual bool isCharacterSmartReplaceExempt(UChar, bool);
411
412 // === to be deleted
413
414 public:
415     SelectionController* dragCaretController() const;
416
417 };
418
419 } // namespace WebCore
420
421 #endif // Frame_H