adc16ab5f1546f7c7d34b897d886cdf630657bea
[WebKit-https.git] / WebCore / page / Frame.h
1 // -*- c-basic-offset: 2 -*-
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 "BrowserExtension.h"
32 #include "Color.h"
33 #include "FrameView.h"
34 #include "NodeImpl.h"
35 #include "ObjectContents.h"
36 #include "edit_actions.h"
37 #include "text_affinity.h"
38 #include "text_granularity.h"
39 #include <kurl.h>
40 #include <qscrollbar.h>
41 #include <qstringlist.h>
42
43 class KHTMLPartBrowserExtension;
44 class KHTMLSettings;
45
46 namespace KJS {
47     class DOMDocument;
48     class JSValue;
49     class PausedTimeouts;
50     class SavedBuiltins;
51     class SavedProperties;
52     class Selection;
53     class SelectionFunc;
54     class Window;
55     class WindowFunc;
56
57     namespace Bindings {
58         class Instance;
59     }
60 }
61
62 namespace WebCore {
63
64 class CSSComputedStyleDeclarationImpl;
65 class CSSMutableStyleDeclarationImpl;
66 class CSSStyleDeclarationImpl;
67 class CSSStyleSelector;
68 class CachedObject;
69 class DOMString;
70 class DocLoader;
71 class Document;
72 class DocumentImpl;
73 class DrawContentsEvent;
74 class EditCommandPtr;
75 class ElementImpl;
76 class EventListener;
77 class FormData;
78 class FramePrivate;
79 class FrameTreeNode;
80 class HTMLAnchorElementImpl;
81 class HTMLDocument;
82 class HTMLDocumentImpl;
83 class HTMLElementImpl;
84 class HTMLEventListener;
85 class HTMLFormElementImpl;
86 class HTMLFrameElementImpl;
87 class HTMLIFrameElementImpl;
88 class HTMLMetaElementImpl;
89 class HTMLObjectElementImpl;
90 class HTMLTitleElementImpl;
91 class HTMLTokenizer;
92 class KJSProxyImpl;
93 class MacFrame;
94 class MouseDoubleClickEvent;
95 class MouseEvent;
96 class MouseMoveEvent;
97 class MousePressEvent;
98 class MouseReleaseEvent;
99 class Node;
100 class NodeImpl;
101 class Range;
102 class RangeImpl;
103 class RenderObject;
104 class RenderPart;
105 class RenderPartObject;
106 class RenderStyle;
107 class RenderWidget;
108 class Selection;
109 class SelectionController;
110 class VisiblePosition;
111 class XMLTokenizer;
112
113 struct ChildFrame;
114
115 template <typename T> class Timer;
116
117 struct MarkedTextUnderline {
118     MarkedTextUnderline(unsigned s, unsigned e, const Color& c, bool t) 
119         : startOffset(s), endOffset(e), color(c), thick(t) { }
120     unsigned startOffset;
121     unsigned endOffset;
122     Color color;
123     bool thick;
124 };
125
126 class Frame : public ObjectContents {
127   friend class FrameView;
128   friend class KHTMLRun;
129   friend class KJS::DOMDocument;
130   friend class KJS::Selection;
131   friend class KJS::SelectionFunc;
132   friend class KJS::Window;
133   friend class KJS::WindowFunc;
134   friend class CSSStyleSelector;
135   friend class DocumentImpl;
136   friend class HTMLAnchorElementImpl;
137   friend class HTMLDocumentImpl;
138   friend class HTMLFormElementImpl;
139   friend class HTMLFrameElementImpl;
140   friend class HTMLIFrameElementImpl;
141   friend class HTMLMetaElementImpl;
142   friend class HTMLObjectElementImpl;
143   friend class HTMLTitleElementImpl;
144   friend class HTMLTokenizer;
145   friend class NodeImpl;
146   friend class RenderPartObject;
147   friend class RenderWidget;
148   friend class XMLTokenizer;
149
150 public:
151   enum { NoXPosForVerticalArrowNavigation = INT_MIN };
152
153   Frame();
154   virtual ~Frame();
155
156   /**
157    * Opens the specified URL @p url.
158    *
159    * Reimplemented from @ref ObjectContents::openURL .
160    */
161   virtual bool openURL( const KURL &url );
162
163   void didExplicitOpen();
164
165   /**
166    * Stops loading the document and kill all data requests (for images, etc.)
167    */
168   void stopLoading(bool sendUnload = false);
169   virtual bool closeURL();
170
171   /**
172    * Returns a pointer to the @ref BrowserExtension.
173    */
174   BrowserExtension *browserExtension() const;
175
176   /**
177    * Returns a pointer to the HTML document's view.
178    */
179   FrameView *view() const;
180
181   /**
182    * Enable/disable Javascript support. Note that this will
183    * in either case permanently override the default usersetting.
184    * If you want to have the default UserSettings, don't call this
185    * method.
186    */
187   void setJScriptEnabled( bool enable );
188
189   /**
190    * Returns @p true if Javascript support is enabled or @p false
191    * otherwise.
192    */
193   bool jScriptEnabled() const;
194
195   /**
196    * Enable/disable the automatic forwarding by <meta http-equiv="refresh" ....>
197    */
198   void setMetaRefreshEnabled( bool enable );
199
200   /**
201    * Returns @p true if automtaic forwarding is enabled.
202    */
203   bool metaRefreshEnabled() const;
204
205   /**
206    * Execute the specified snippet of JavaScript code.
207    */
208   KJS::JSValue* executeScript(NodeImpl*, const QString& script, bool forceUserGesture = false);
209
210   /**
211    * Implementation of CSS property -khtml-user-drag == auto
212    */
213   virtual bool shouldDragAutoNode(NodeImpl*, int x, int y) const;
214   
215   /**
216    * Enables/disables Java applet support. Note that calling this function
217    * will permanently override the User settings about Java applet support.
218    * Not calling this function is the only way to let the default settings
219    * apply.
220    */
221   void setJavaEnabled( bool enable );
222
223   /**
224    * Return if Java applet support is enabled/disabled.
225    */
226   bool javaEnabled() const;
227
228   /**
229    * Enables or disables plugins via, default is enabled
230    */
231   void setPluginsEnabled( bool enable );
232
233   /**
234    * Returns trie if plugins are enabled/disabled.
235    */
236   bool pluginsEnabled() const;
237
238   /**
239    * Specifies whether images contained in the document should be loaded
240    * automatically or not.
241    *
242    * @note Request will be ignored if called before @ref begin().
243    */
244   void setAutoloadImages( bool enable );
245   /**
246    * Returns whether images contained in the document are loaded automatically
247    * or not.
248    * @note that the returned information is unreliable as long as no begin()
249    * was called.
250    */
251   bool autoloadImages() const;
252
253   /**
254    * Security option.
255    *
256    * Specify whether only local references ( stylesheets, images, scripts, subdocuments )
257    * should be loaded. ( default false - everything is loaded, if the more specific
258    * options allow )
259    */
260   void setOnlyLocalReferences(bool enable);
261
262   /**
263    * Returns whether references should be loaded ( default false )
264    **/
265   bool onlyLocalReferences() const;
266
267   void enableJScript(bool e) { setJScriptEnabled(e); }
268   void enableJava(bool e) { setJavaEnabled(e); }
269   void enablePlugins(bool e) { setPluginsEnabled(e); }
270   void autoloadImages(bool e) { setAutoloadImages(e); }
271   void enableMetaRefresh(bool e) { setMetaRefreshEnabled(e); }
272   bool setCharset( const QString &, bool ) { return true; }
273
274   KURL baseURL() const;
275   QString baseTarget() const;
276
277   /**
278    * Returns the URL for the background Image (used by save background)
279    */
280   KURL backgroundURL() const;
281
282   /**
283    * Schedules a redirection after @p delay seconds.
284    */
285   void scheduleRedirection(double delay, const QString &url, bool lockHistory = true);
286
287   /**
288    * Make a location change, or schedule one for later.
289    * These are used for JavaScript-triggered location changes.
290    */
291   void changeLocation(const QString &URL, const QString &referrer, bool lockHistory = true, bool userGesture = false);
292   void scheduleLocationChange(const QString &url, const QString &referrer, bool lockHistory = true, bool userGesture = false);
293   bool isScheduledLocationChangePending() const;
294
295   /**
296    * Schedules a history navigation operation (go forward, go back, etc.).
297    * This is used for JavaScript-triggered location changes.
298    */
299   void scheduleHistoryNavigation( int steps );
300
301   /**
302    * Clears the widget and prepares it for new content.
303    *
304    * If you want @ref url() to return
305    * for example "file:/tmp/test.html", you can use the following code:
306    * <PRE>
307    * view->begin( KURL("file:/tmp/test.html" ) );
308    * </PRE>
309    *
310    * @param url is the url of the document to be displayed.  Even if you
311    * are generating the HTML on the fly, it may be useful to specify
312    * a directory so that any images are found.
313    *
314    * @param xOffset is the initial horizontal scrollbar value. Usually
315    * you don't want to use this.
316    *
317    * @param yOffset is the initial vertical scrollbar value. Usually
318    * you don't want to use this.
319    *
320    * All child frames and the old document are removed if you call
321    * this method.
322    */
323   virtual void begin( const KURL &url = KURL(), int xOffset = 0, int yOffset = 0 );
324
325   /**
326    * Writes another part of the HTML code to the widget.
327    *
328    * You may call
329    * this function many times in sequence. But remember: The fewer calls
330    * you make, the faster the widget will be.
331    *
332    * The HTML code is send through a decoder which decodes the stream to
333    * Unicode.
334    *
335    * The @p len parameter is needed for streams encoded in utf-16,
336    * since these can have \0 chars in them. In case the encoding
337    * you're using isn't utf-16, you can safely leave out the length
338    * parameter.
339    *
340    * Attention: Don't mix calls to @ref write( const char *) with calls
341    * to @ref write( const QString & ).
342    *
343    * The result might not be what you want.
344    */
345   virtual void write( const char *str, int len = -1 );
346
347   /**
348    * Writes another part of the HTML code to the widget.
349    *
350    * You may call
351    * this function many times in sequence. But remember: The fewer calls
352    * you make, the faster the widget will be.
353    */
354   virtual void write( const QString &str );
355
356   /**
357    * Call this after your last call to @ref write().
358    */
359   virtual void end();
360
361   void endIfNotLoading();
362
363   /**
364    * Similar to end, but called to abort a load rather than cleanly end.
365    */
366   void stop();
367
368   void paint(QPainter *, const IntRect&);
369
370   void setEncoding(const QString &encoding, bool userChosen);
371
372   /**
373    * Returns the encoding the page currently uses.
374    *
375    * Note that the encoding might be different from the charset.
376    */
377   QString encoding() const;
378
379   /**
380    * Sets a user defined style sheet to be used on top of the HTML 4
381    * default style sheet.
382    *
383    * This gives a wide range of possibilities to
384    * change the layout of the page.
385    */
386   void setUserStyleSheet(const KURL &url);
387
388   /**
389    * Sets a user defined style sheet to be used on top of the HTML 4
390    * default style sheet.
391    *
392    * This gives a wide range of possibilities to
393    * change the layout of the page.
394    */
395   void setUserStyleSheet(const QString &styleSheet);
396
397 public:
398
399   /**
400    * Sets the standard font style.
401    *
402    * @param name The font name to use for standard text.
403    */
404   void setStandardFont( const QString &name );
405
406   /**
407    * Sets the fixed font style.
408    *
409    * @param name The font name to use for fixed text, e.g.
410    * the <tt>&lt;pre&gt;</tt> tag.
411    */
412   void setFixedFont( const QString &name );
413
414   /**
415    * Finds the anchor named @p name.
416    *
417    * If the anchor is found, the widget
418    * scrolls to the closest position. Returns @p if the anchor has
419    * been found.
420    */
421   bool gotoAnchor( const QString &name );
422
423   /**
424    * Sets the cursor to use when the cursor is on a link.
425    */
426   void setURLCursor( const QCursor &c );
427
428   /**
429    * Returns the cursor which is used when the cursor is on a link.
430    */
431   QCursor urlCursor() const;
432
433   /**
434    * Initiates a text search.
435    */
436   void findTextBegin(NodeImpl *startNode = 0, int startPos = -1);
437
438   /**
439    * Finds the next occurrence of the string or expression.
440    * If isRegExp is true then str is converted to a QRegExp, and caseSensitive is ignored.
441    */
442   bool findTextNext( const QString &str, bool forward, bool caseSensitive, bool isRegExp );
443
444   /**
445    * Sets the Zoom factor. The value is given in percent, larger values mean a
446    * generally larger font and larger page contents. It is not guaranteed that
447    * all parts of the page are scaled with the same factor though.
448    *
449    * The given value should be in the range of 20..300, values outside that
450    * range are not guaranteed to work. A value of 100 will disable all zooming
451    * and show the page with the sizes determined via the given lengths in the
452    * stylesheets.
453    */
454   void setZoomFactor(int percent);
455
456   /**
457    * Returns the current zoom factor.
458    */
459   int zoomFactor() const;
460
461   /**
462    * Returns the text the user has marked.
463    */
464   virtual QString selectedText() const;
465
466   /**
467    * Returns the granularity of the selection (character, word, line, paragraph).
468    */
469   ETextGranularity selectionGranularity() const;
470   
471   /**
472    * Sets the granularity of the selection (character, word, line, paragraph).
473    */
474   void setSelectionGranularity(ETextGranularity granularity) const;
475
476   /**
477    * Returns the drag caret of the HTML.
478    */
479   const SelectionController &dragCaret() const;
480
481   /**
482    * Sets the current selection.
483    */
484   void setSelection(const SelectionController &, bool closeTyping = true, bool keepTypingStyle = false);
485
486   /**
487    * Returns whether selection can be changed.
488    */
489   bool shouldChangeSelection(const SelectionController &) const;
490
491   /**
492    * Returns a mark, to be used as emacs uses it.
493    */
494   const Selection &mark() const;
495
496   /**
497    * Returns the mark.
498    */
499   void setMark(const Selection &);
500
501   /**
502    * Sets the current drag caret.
503    */
504   void setDragCaret(const SelectionController &);
505   
506   /**
507    * Transposes characters either side of caret selection.
508    */
509   void transpose();
510   
511   /**
512    * Invalidates the current selection.
513    */
514   void invalidateSelection();
515
516   /**
517    * Controls the visibility of the selection.
518    */
519   void setCaretVisible(bool flag=true);
520
521   /**
522    * Paints the caret.
523    */
524   void paintCaret(QPainter *p, const IntRect &rect) const;
525   
526  /**
527    * Paints the drag caret.
528    */
529   void paintDragCaret(QPainter *p, const IntRect &rect) const;
530
531   /**
532    * Set info for vertical arrow navigation.
533    */
534   void setXPosForVerticalArrowNavigation(int x);
535
536   /**
537    * Get info for vertical arrow navigation.
538    */
539   int xPosForVerticalArrowNavigation() const;
540
541   /**
542    * Has the user selected anything?
543    *
544    *  Call @ref selectedText() to
545    * retrieve the selected text.
546    *
547    * @return @p true if there is text selected.
548    */
549   bool hasSelection() const;
550
551   /**
552    * Marks all text in the document as selected.
553    */
554   void selectAll();
555
556   /**
557    * Marks contents of node as selected.
558    * Returns whether the selection changed.
559    */
560   bool selectContentsOfNode(NodeImpl*);
561  
562   /**
563    * Returns whether editing should end in the given range
564    */
565   virtual bool shouldBeginEditing(const RangeImpl *) const;
566
567   /**
568    * Returns whether editing should end in the given range
569    */
570   virtual bool shouldEndEditing(const RangeImpl *) const;
571
572   /**
573    * Returns the contentEditable "override" value for the part
574    */
575   virtual bool isContentEditable() const;
576
577   /**
578    * Returns the most recent edit command applied.
579    */
580   EditCommandPtr lastEditCommand();
581
582   /**
583    * Called when editing has been applied.
584    */
585   void appliedEditing(EditCommandPtr &);
586
587   /**
588    * Called when editing has been unapplied.
589    */
590   void unappliedEditing(EditCommandPtr &);
591
592   /**
593    * Called when editing has been reapplied.
594    */
595   void reappliedEditing(EditCommandPtr &);
596
597   /**
598    * Returns the typing style for the document.
599    */
600   CSSMutableStyleDeclarationImpl *typingStyle() const;
601
602   /**
603    * Sets the typing style for the document.
604    */
605   void setTypingStyle(CSSMutableStyleDeclarationImpl *);
606
607   /**
608    * Clears the typing style for the document.
609    */
610   void clearTypingStyle();
611
612   virtual void tokenizerProcessedData() {};
613
614   const KHTMLSettings *settings() const;
615
616   /**
617    * Returns a pointer to the parent Frame, if any.
618    *
619    *  Returns 0L otherwise.
620    */
621   Frame *parentFrame() const;
622
623   /**
624    * Returns a list of names of all frame (including iframe) objects of
625    * the current document. Note that this method is not working recursively
626    * for sub-frames.
627    */
628   QStringList frameNames() const;
629
630   QPtrList<ObjectContents> frames() const;
631
632   Frame *childFrameNamed(const QString &name) const;
633
634   /**
635    * Finds a frame by name. Returns 0L if frame can't be found.
636    */
637   Frame *findFrame( const QString &f );
638
639   /**
640    * Return the current frame (the one that has focus)
641    * Not necessarily a direct child of ours, framesets can be nested.
642    * Returns "this" if this part isn't a frameset.
643    */
644   ObjectContents *currentFrame() const;
645
646   /**
647    * Returns whether a frame with the specified name is exists or not.
648    * In contrary to the @ref findFrame method this one also returns true
649    * if the frame is defined but no displaying component has been
650    * found/loaded, yet.
651    */
652   bool frameExists( const QString &frameName );
653
654   /**
655    * Called by KJS.
656    * Sets the StatusBarText assigned
657    * via window.status
658    */
659   void setJSStatusBarText( const QString &text );
660
661   /**
662    * Called by KJS.
663    * Sets the DefaultStatusBarText assigned
664    * via window.defaultStatus
665    */
666   void setJSDefaultStatusBarText( const QString &text );
667
668   /**
669    * Called by KJS.
670    * Returns the StatusBarText assigned
671    * via window.status
672    */
673   QString jsStatusBarText() const;
674
675   /**
676    * Called by KJS.
677    * Returns the DefaultStatusBarText assigned
678    * via window.defaultStatus
679    */
680   QString jsDefaultStatusBarText() const;
681
682   /**
683    * Referrer used for links in this page.
684    */
685   QString referrer() const;
686
687   /**
688    * Last-modified date (in raw string format), if received in the [HTTP] headers.
689    */
690   QString lastModified() const;
691
692   /**
693    * Loads into the cache.
694    */
695   void preloadStyleSheet(const QString &url, const QString &stylesheet);
696   void preloadScript(const QString &url, const QString &script);
697
698   bool isPointInsideSelection(int x, int y);
699
700   virtual bool tabsToLinks() const;
701   virtual bool tabsToAllControls() const;
702
703   bool restored() const;
704
705   void incrementFrameCount();
706   void decrementFrameCount();
707   int topLevelFrameCount();
708
709   // Editing operations.
710   // Not clear if these will be wanted in Frame by KDE,
711   // but for now these bridge so we don't have to pepper the
712   // KHTML code with WebCore-specific stuff.
713   enum TriState { falseTriState, trueTriState, mixedTriState };
714   void copyToPasteboard();
715   void cutToPasteboard();
716   void pasteFromPasteboard();
717   void pasteAndMatchStyle();
718   bool canPaste() const;
719   void redo();
720   void undo();
721   bool canRedo() const;
722   bool canUndo() const;
723   void computeAndSetTypingStyle(CSSStyleDeclarationImpl *, EditAction editingAction=EditActionUnspecified);
724   void applyStyle(CSSStyleDeclarationImpl *, EditAction editingAction=EditActionUnspecified);
725   void applyParagraphStyle(CSSStyleDeclarationImpl *, EditAction editingAction=EditActionUnspecified);
726   TriState selectionHasStyle(CSSStyleDeclarationImpl *) const;
727   bool selectionStartHasStyle(CSSStyleDeclarationImpl *) const;
728   DOMString selectionStartStylePropertyValue(int stylePropertyID) const;
729   void applyEditingStyleToBodyElement() const;
730   void removeEditingStyleFromBodyElement() const;
731   void applyEditingStyleToElement(ElementImpl *) const;
732   void removeEditingStyleFromElement(ElementImpl *) const;
733   void print();
734   virtual bool isCharacterSmartReplaceExempt(const QChar &, bool);
735
736   // Used to keep the part alive when running a script that might destroy it.
737   void keepAlive();
738
739   static void endAllLifeSupport();
740
741 signals:
742   /**
743    * Emitted if the cursor is moved over an URL.
744    */
745   void onURL( const QString &url );
746
747   /**
748    * Emitted when the user clicks the right mouse button on the document.
749    */
750   void popupMenu(const QString &url, const IntPoint &point);
751
752   /**
753    * This signal is emitted when the selection changes.
754    */
755   void selectionChanged();
756
757 public:
758   /**
759    * returns a KURL object for the given url. Use when
760    * you know what you're doing.
761    */
762   KURL completeURL( const QString &url );
763
764   /**
765    * presents a detailed error message to the user.
766    * @p errorCode kio error code, eg KIO::ERR_SERVER_TIMEOUT.
767    * @p text kio additional information text.
768    * @p url the url that triggered the error.
769    */
770   void htmlError(int errorCode, const QString& text, const KURL& reqUrl);
771
772   virtual void khtmlMouseDoubleClickEvent(MouseDoubleClickEvent *event);
773   virtual void khtmlMousePressEvent(MousePressEvent *event);
774   virtual void khtmlMouseMoveEvent(MouseMoveEvent *event);
775   virtual void khtmlMouseReleaseEvent(MouseReleaseEvent *event);
776   virtual void khtmlDrawContentsEvent(DrawContentsEvent*) { }
777   
778   void selectClosestWordFromMouseEvent(QMouseEvent *mouse, NodeImpl *innerNode, int x, int y);
779
780   /**
781    * Internal empty reimplementation of @ref ObjectContents::openFile .
782    */
783   virtual bool openFile();
784
785   virtual void urlSelected( const QString &url, int button, int state,
786                             const QString &_target, URLArgs args = URLArgs());
787
788
789   // Methods with platform-specific overrides (and no base class implementation).
790   virtual BrowserExtension* createBrowserExtension() = 0;
791   virtual void setTitle(const DOMString &) = 0;
792   virtual void handledOnloadEvents() = 0;
793   virtual QString userAgent() const = 0;
794   virtual QString incomingReferrer() const = 0;
795   virtual QString mimeTypeForFileName(const QString &) const = 0;
796   virtual void clearRecordedFormValues() = 0;
797   virtual void recordFormValue(const QString &name, const QString &value, HTMLFormElementImpl *element) = 0;
798   virtual KJS::Bindings::Instance *getEmbedInstanceForWidget(QWidget*) = 0;
799   virtual KJS::Bindings::Instance *getObjectInstanceForWidget(QWidget*) = 0;
800   virtual KJS::Bindings::Instance *getAppletInstanceForWidget(QWidget*) = 0;
801   virtual void markMisspellingsInAdjacentWords(const VisiblePosition &) = 0;
802   virtual void markMisspellings(const SelectionController &) = 0;
803   virtual void addMessageToConsole(const DOMString& message,  unsigned int lineNumber, const DOMString& sourceID) = 0;
804   virtual void runJavaScriptAlert(const DOMString& message) = 0;
805   virtual bool runJavaScriptConfirm(const DOMString& message) = 0;
806   virtual bool runJavaScriptPrompt(const DOMString& message, const DOMString& defaultValue, DOMString& result) = 0;  
807   virtual bool locationbarVisible() = 0;
808   virtual bool menubarVisible() = 0;
809   virtual bool personalbarVisible() = 0;
810   virtual bool statusbarVisible() = 0;
811   virtual bool toolbarVisible() = 0;
812   virtual void scheduleClose() = 0;
813   virtual void unfocusWindow() = 0;
814   virtual void createEmptyDocument() = 0;
815   virtual RangeImpl *markedTextRange() const = 0;
816   virtual void registerCommandForUndo(const EditCommandPtr &) = 0;
817   virtual void registerCommandForRedo(const EditCommandPtr &) = 0;
818   virtual void clearUndoRedoOperations() = 0;
819   virtual void issueUndoCommand() = 0;
820   virtual void issueRedoCommand() = 0;
821   virtual void issueCutCommand() = 0;
822   virtual void issueCopyCommand() = 0;
823   virtual void issuePasteCommand() = 0;
824   virtual void issuePasteAndMatchStyleCommand() = 0;
825   virtual void issueTransposeCommand() = 0;
826   virtual void respondToChangedSelection(const SelectionController &oldSelection, bool closeTyping) = 0;
827   virtual void respondToChangedContents() = 0;
828   virtual bool shouldChangeSelection(const SelectionController &oldSelection, const SelectionController &newSelection, EAffinity affinity, bool stillSelecting) const = 0;
829   virtual void partClearedInBegin() = 0; 
830   virtual void saveDocumentState() = 0;
831   virtual void restoreDocumentState() = 0;
832   virtual bool canGoBackOrForward(int distance) const = 0;
833   virtual void openURLRequest(const KURL &, const URLArgs &) = 0;
834   virtual void submitForm(const KURL &, const URLArgs &) = 0;
835   virtual void urlSelected(const KURL &url, int button, int state, const URLArgs &args) = 0;
836   virtual ObjectContents *createPart(const ChildFrame &child, const KURL &url, const QString &mimeType) = 0;
837   virtual bool passSubframeEventToSubframe(NodeImpl::MouseEvent &) = 0;
838   virtual bool passWheelEventToChildWidget(NodeImpl *) = 0;
839   virtual bool lastEventIsMouseUp() const = 0;
840   virtual QString overrideMediaType() const = 0;
841 protected:
842   virtual QString generateFrameName() = 0;
843
844 public slots:
845   /**
846    * Stops all animated images on the current and child pages
847    */
848   void stopAnimations();
849
850 private slots:
851   void reparseConfiguration();
852
853   void slotData( KIO::Job*, const ByteArray &data );
854   void slotRestoreData( const ByteArray &data );
855   void slotFinished( KIO::Job* );
856   void slotFinishedParsing();
857     void redirectionTimerFired(Timer<Frame>*);
858   void slotRedirection(KIO::Job*, const KURL&);
859
860   void slotIncZoom();
861   void slotDecZoom();
862
863   void childBegin();
864
865   void slotLoadImages();
866
867   void submitFormAgain();
868
869   void updateActions();
870
871   void slotPartRemoved( ObjectContents *part );
872
873   void slotActiveFrameChanged( ObjectContents *part );
874
875   void slotChildStarted( KIO::Job *job );
876
877   void slotChildCompleted();
878   void slotChildCompleted( bool );
879   void slotParentCompleted();
880   void slotChildURLRequest( const KURL &url, const URLArgs &args );
881   void slotLoaderRequestDone( DocLoader*, CachedObject *obj );
882   void checkCompleted();
883   
884   void slotShowDocument( const QString &url, const QString &target );
885   void slotAutoScroll();
886   void slotPrintFrame();
887   void slotSelectAll();
888   void slotProgressUpdate();
889   void slotJobPercent(KIO::Job*, unsigned long);
890   void slotJobSpeed(KIO::Job*, unsigned long);
891
892     void lifeSupportTimerFired(Timer<Frame>*);
893     void endLifeSupport();
894
895   virtual void clear(bool clearWindowProperties = true);
896
897 private:
898   bool restoreURL( const KURL &url );
899   void clearCaretRectIfNeeded();
900   void setFocusNodeIfNeeded();
901   void selectionLayoutChanged();
902     void caretBlinkTimerFired(Timer<Frame>*);
903   bool openURLInFrame( const KURL &url, const URLArgs &urlArgs );
904
905   void overURL( const QString &url, const QString &target, bool shiftPressed = false );
906
907   bool processObjectRequest( ChildFrame *child, const KURL &url, const QString &mimetype );
908   
909   void submitForm( const char *action, const QString &url, const FormData &formData,
910                    const QString &target, const QString& contentType = QString::null,
911                    const QString& boundary = QString::null );
912
913   void popupMenu( const QString &url );
914
915   void init(FrameView*);
916
917   bool scheduleScript(NodeImpl*, const QString& script);
918
919   KJS::JSValue* executeScheduledScript();
920
921     bool requestFrame(RenderPart *frame, const QString &url, const QString &frameName,
922         const QStringList &paramNames = QStringList(), const QStringList &paramValues = QStringList(), bool isIFrame = false);
923
924   /**
925    * @internal returns a name for a frame without a name.
926    * This function returns a sequence of names.
927    * All names in a sequence are different but the sequence is
928    * always the same.
929    * The sequence is reset in clear().
930    */
931   QString requestFrameName();
932
933   bool requestObject(RenderPart *frame, const QString &url, const QString &serviceType,
934                       const QStringList &paramNames = QStringList(), const QStringList &paramValues = QStringList());
935   bool requestObject(ChildFrame *child, const KURL &url, const URLArgs &args = URLArgs());
936
937 public:
938   DocumentImpl *document() const;
939   void setDocument(DocumentImpl* newDoc);
940
941   // Workaround for the fact that it's hard to delete a frame.
942   // Call this after doing user-triggered selections to make it easy to delete the frame you entirely selected.
943   void selectFrameElementInParentIfFullySelected();
944   
945   virtual bool mouseDownMayStartSelect() const { return true; }
946
947   void handleFallbackContent();
948
949 private:
950   ChildFrame* childFrame(const QObject*);
951   ChildFrame* recursiveFrameRequest(const KURL&, const URLArgs&, bool callParent = true);
952
953   void connectChild(const ChildFrame *) const;
954   void disconnectChild(const ChildFrame *) const;
955
956   bool checkLinkSecurity(const KURL &linkURL,const QString &message = QString::null, const QString &button = QString::null);
957   KJS::JSValue* executeScript(const QString& filename, int baseLine, NodeImpl*, const QString& script);
958   
959   void cancelRedirection(bool newLoadInProgress = false);
960
961  public:
962   KJSProxyImpl *jScript();
963   Frame *opener();
964   void setOpener(Frame *_opener);
965   bool openedByJS();
966   void setOpenedByJS(bool _openedByJS);
967
968   void setSettings(KHTMLSettings *);
969
970   void provisionalLoadStarted();
971   bool userGestureHint();
972   void didNotOpenURL(const KURL &);
973   void addData(const char *bytes, int length);
974   void addMetaData(const QString &key, const QString &value);
975   void setMediaType(const QString &);
976
977   RenderObject *renderer() const;
978   IntRect selectionRect() const;
979   bool isFrameSet() const;
980
981   HTMLFormElementImpl *currentForm() const;
982
983   RenderStyle *styleForSelectionStart(NodeImpl *&nodeToRemove) const;
984
985   // Scrolls as necessary to reveal the selection
986   void revealSelection();
987   // Centers the selection regardless of whether it was already visible
988   void centerSelectionInVisibleArea() const;
989   void setSelectionFromNone();
990
991   bool scrollOverflow(KWQScrollDirection direction, KWQScrollGranularity granularity);
992
993   void adjustPageHeight(float *newBottom, float oldTop, float oldBottom, float bottomLimit);
994
995   bool canCachePage();
996   KJS::PausedTimeouts *pauseTimeouts();
997   void resumeTimeouts(KJS::PausedTimeouts *);
998   void saveWindowProperties(KJS::SavedProperties *windowProperties);
999   void saveLocationProperties(KJS::SavedProperties *locationProperties);
1000   void restoreWindowProperties(KJS::SavedProperties *windowProperties);
1001   void restoreLocationProperties(KJS::SavedProperties *locationProperties);
1002   void saveInterpreterBuiltins(KJS::SavedBuiltins &interpreterBuiltins);
1003   void restoreInterpreterBuiltins(const KJS::SavedBuiltins &interpreterBuiltins);
1004
1005   static Frame *frameForWidget(const QWidget *);
1006   static NodeImpl *nodeForWidget(const QWidget *);
1007   static Frame *frameForNode(NodeImpl *);
1008
1009   static void setDocumentFocus(QWidget *);
1010   static void clearDocumentFocus(QWidget *);
1011
1012   static const QPtrList<Frame> &instances() { return mutableInstances(); }    
1013   static QPtrList<Frame> &mutableInstances();
1014
1015   void updatePolicyBaseURL();
1016   void setPolicyBaseURL(const DOMString &);
1017
1018   void forceLayout();
1019   void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth);
1020
1021   void sendResizeEvent();
1022   void sendScrollEvent();
1023   bool scrollbarsVisible();
1024   void scrollToAnchor(const KURL &);
1025   bool canMouseDownStartSelect(NodeImpl* node);
1026   bool passWidgetMouseDownEventToWidget(MouseEvent *, bool isDoubleClick);
1027   bool passWidgetMouseDownEventToWidget(RenderWidget *);
1028   virtual bool passMouseDownEventToWidget(QWidget *) = 0;
1029
1030   void clearTimers();
1031   static void clearTimers(FrameView *);
1032
1033   bool displaysWithFocusAttributes() const;
1034   void setWindowHasFocus(bool flag);
1035   // Convenience, to avoid repeating the code to dig down to get this.
1036
1037   QChar backslashAsCurrencySymbol() const;
1038   void setName(const QString& name);
1039   const QString& name();
1040
1041   QValueList<MarkedTextUnderline> markedTextUnderlines() const;  
1042   bool markedTextUsesUnderlines() const;
1043   // Call this method before handling a new user action, like on a mouse down or key down.
1044   // Currently, all this does is clear the "don't submit form twice" data member.
1045   void prepareForUserAction();
1046   virtual bool isFrame() const;
1047   NodeImpl *mousePressNode();
1048
1049   bool isComplete();
1050   
1051   void replaceContentsWithScriptResult(const KURL &url);
1052
1053 protected:
1054     virtual void startRedirectionTimer();
1055     virtual void stopRedirectionTimer();
1056
1057   mutable RefPtr<NodeImpl> _elementToDraw;
1058   mutable bool _drawSelectionOnly;
1059   KURL _submittedFormURL;
1060   bool m_markedTextUsesUnderlines;
1061   QValueList<MarkedTextUnderline> m_markedTextUnderlines;
1062   bool m_windowHasFocus;
1063
1064  private:
1065   int cacheId() const;
1066
1067   void checkEmitLoadEvent();
1068   void emitLoadEvent();
1069   
1070   void receivedFirstData();
1071
1072   bool handleMouseMoveEventDrag(MouseMoveEvent *event);
1073   bool handleMouseMoveEventOver(MouseMoveEvent *event);
1074   void handleMouseMoveEventSelection(MouseMoveEvent *event);
1075
1076   /**
1077    * @internal Extracts anchor and tries both encoded and decoded form.
1078    */
1079   void gotoAnchor();
1080
1081   void handleMousePressEventSingleClick(MousePressEvent *event);
1082   void handleMousePressEventDoubleClick(MousePressEvent *event);
1083   void handleMousePressEventTripleClick(MousePressEvent *event);
1084
1085   CSSComputedStyleDeclarationImpl *selectionComputedStyle(NodeImpl *&nodeToRemove) const;
1086
1087   FramePrivate* d;
1088   friend class FramePrivate;
1089
1090 public:
1091   friend class MacFrame;
1092
1093   void completed();
1094   void completed(bool);
1095   bool didOpenURL(const KURL &);
1096   void setStatusBarText(const QString &);
1097   void started(KIO::Job *);
1098   void frameDetached();
1099   virtual void didFirstLayout() {}
1100
1101   int frameCount;
1102
1103   virtual void detachFromView();
1104
1105   KURL url() const;
1106   void setParent(Frame* parent);
1107   Frame* parent() const;
1108
1109   // split out controller objects
1110   FrameTreeNode* treeNode();
1111   SelectionController& selection() const;
1112 };
1113
1114 }
1115
1116 #endif