Reviewed by Maciej.
[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 "Shared.h"
36 #include "TransferJobClient.h"
37 #include "edit_actions.h"
38 #include "text_affinity.h"
39 #include "text_granularity.h"
40 #include <KURL.h>
41 #include <qscrollbar.h>
42 #include <QStringList.h>
43 #include <kxmlcore/Noncopyable.h>
44
45 class KHTMLSettings;
46
47 namespace KJS {
48     class JSValue;
49     class PausedTimeouts;
50     class SavedBuiltins;
51     class SavedProperties;
52
53     namespace Bindings {
54         class Instance;
55     }
56 }
57
58 namespace WebCore {
59
60 class CSSComputedStyleDeclarationImpl;
61 class CSSMutableStyleDeclarationImpl;
62 class CSSStyleDeclarationImpl;
63 class DrawContentsEvent;
64 class EditCommandPtr;
65 class FramePrivate;
66 class FrameTree;
67 class KJSProxyImpl;
68 class Page;
69 class Plugin;
70 class MouseEventWithHitTestResults;
71 class RangeImpl;
72 class RenderLayer;
73 class Selection;
74 class SelectionController;
75 class VisiblePosition;
76
77 template <typename T> class Timer;
78
79 struct MarkedTextUnderline {
80     MarkedTextUnderline(unsigned s, unsigned e, const Color& c, bool t) 
81         : startOffset(s), endOffset(e), color(c), thick(t) { }
82     unsigned startOffset;
83     unsigned endOffset;
84     Color color;
85     bool thick;
86 };
87
88 enum ObjectContentType {
89     ObjectContentNone,
90     ObjectContentImage,
91     ObjectContentFrame,
92     ObjectContentPlugin,
93 };
94
95 class Frame : public Shared<Frame>, Noncopyable, TransferJobClient {
96
97 public:
98   enum { NoXPosForVerticalArrowNavigation = INT_MIN };
99
100   Frame(Page*, RenderPart*);
101   virtual ~Frame();
102
103   virtual bool openURL(const KURL&);
104   virtual bool closeURL();
105
106   void didExplicitOpen();
107
108   Page* page() const;
109
110   /**
111    * Stop loading the document and kill all data requests (for images, etc.)
112    */
113   void stopLoading(bool sendUnload = false);
114
115   /**
116    * Returns a pointer to the @ref BrowserExtension.
117    */
118   BrowserExtension *browserExtension() const;
119
120   /**
121    * Returns a pointer to the HTML document's view.
122    */
123   FrameView *view() const;
124
125   virtual void setView(FrameView*);
126
127   /**
128    * Returns @p true if Javascript is enabled, @p false otherwise.
129    */
130   bool jScriptEnabled() const;
131
132   /**
133    * Returns true if Java is enabled, false otherwise.
134    */
135   bool javaEnabled() const;
136   
137   /**
138    * Returns true if plugins are enabled, false otherwise.
139    */
140   bool pluginsEnabled() const;
141   
142   /**
143    * Enable/disable the automatic forwarding by <meta http-equiv="refresh" ....>
144    */
145   void setMetaRefreshEnabled( bool enable );
146
147   /**
148    * Returns @p true if automtaic forwarding is enabled.
149    */
150   bool metaRefreshEnabled() const;
151
152   /**
153    * Execute the specified snippet of JavaScript code.
154    */
155   KJS::JSValue* executeScript(NodeImpl*, const QString& script, bool forceUserGesture = false);
156
157   /**
158    * Implementation of CSS property -khtml-user-drag == auto
159    */
160   virtual bool shouldDragAutoNode(NodeImpl*, int x, int y) const;
161   
162   /**
163    * Specifies whether images contained in the document should be loaded
164    * automatically or not.
165    *
166    * @note Request will be ignored if called before @ref begin().
167    */
168   void setAutoloadImages( bool enable );
169   /**
170    * Returns whether images contained in the document are loaded automatically
171    * or not.
172    * @note that the returned information is unreliable as long as no begin()
173    * was called.
174    */
175   bool autoloadImages() const;
176
177   KURL baseURL() const;
178   QString baseTarget() const;
179
180   /**
181    * Schedules a redirection after @p delay seconds.
182    */
183   void scheduleRedirection(double delay, const QString &url, bool lockHistory = true);
184
185   /**
186    * Make a location change, or schedule one for later.
187    * These are used for JavaScript-triggered location changes.
188    */
189   void changeLocation(const QString &URL, const QString &referrer, bool lockHistory = true, bool userGesture = false);
190   void scheduleLocationChange(const QString &url, const QString &referrer, bool lockHistory = true, bool userGesture = false);
191   bool isScheduledLocationChangePending() const;
192
193   /**
194    * Schedules a history navigation operation (go forward, go back, etc.).
195    * This is used for JavaScript-triggered location changes.
196    */
197   void scheduleHistoryNavigation( int steps );
198
199   /**
200    * Clears the widget and prepares it for new content.
201    *
202    * If you want @ref url() to return
203    * for example "file:/tmp/test.html", you can use the following code:
204    * <PRE>
205    * view->begin( KURL("file:/tmp/test.html" ) );
206    * </PRE>
207    *
208    * @param url is the url of the document to be displayed.  Even if you
209    * are generating the HTML on the fly, it may be useful to specify
210    * a directory so that any images are found.
211    *
212    * @param xOffset is the initial horizontal scrollbar value. Usually
213    * you don't want to use this.
214    *
215    * @param yOffset is the initial vertical scrollbar value. Usually
216    * you don't want to use this.
217    *
218    * All child frames and the old document are removed if you call
219    * this method.
220    */
221   virtual void begin( const KURL &url = KURL(), int xOffset = 0, int yOffset = 0 );
222
223   /**
224    * Writes another part of the HTML code to the widget.
225    *
226    * You may call
227    * this function many times in sequence. But remember: The fewer calls
228    * you make, the faster the widget will be.
229    *
230    * The HTML code is send through a decoder which decodes the stream to
231    * Unicode.
232    *
233    * The @p len parameter is needed for streams encoded in utf-16,
234    * since these can have \0 chars in them. In case the encoding
235    * you're using isn't utf-16, you can safely leave out the length
236    * parameter.
237    *
238    * Attention: Don't mix calls to @ref write( const char *) with calls
239    * to @ref write( const QString & ).
240    *
241    * The result might not be what you want.
242    */
243   virtual void write( const char *str, int len = -1 );
244
245   /**
246    * Writes another part of the HTML code to the widget.
247    *
248    * You may call
249    * this function many times in sequence. But remember: The fewer calls
250    * you make, the faster the widget will be.
251    */
252   virtual void write( const QString &str );
253
254   /**
255    * Call this after your last call to @ref write().
256    */
257   virtual void end();
258
259   void endIfNotLoading();
260
261   /**
262    * Similar to end, but called to abort a load rather than cleanly end.
263    */
264   void stop();
265
266   void paint(GraphicsContext*, const IntRect&);
267
268   void setEncoding(const QString &encoding, bool userChosen);
269
270   /**
271    * Returns the encoding the page currently uses.
272    *
273    * Note that the encoding might be different from the charset.
274    */
275   QString encoding() const;
276
277   /**
278    * Sets a user defined style sheet to be used on top of the HTML 4
279    * default style sheet.
280    *
281    * This gives a wide range of possibilities to
282    * change the layout of the page.
283    */
284   void setUserStyleSheet(const KURL &url);
285
286   /**
287    * Sets a user defined style sheet to be used on top of the HTML 4
288    * default style sheet.
289    *
290    * This gives a wide range of possibilities to
291    * change the layout of the page.
292    */
293   void setUserStyleSheet(const QString &styleSheet);
294
295   /**
296    * Sets the standard font style.
297    *
298    * @param name The font name to use for standard text.
299    */
300   void setStandardFont( const QString &name );
301
302   /**
303    * Sets the fixed font style.
304    *
305    * @param name The font name to use for fixed text, e.g.
306    * the <tt>&lt;pre&gt;</tt> tag.
307    */
308   void setFixedFont( const QString &name );
309
310   /**
311    * Finds the anchor named @p name.
312    *
313    * If the anchor is found, the widget
314    * scrolls to the closest position. Returns @p if the anchor has
315    * been found.
316    */
317   bool gotoAnchor( const QString &name );
318
319   /**
320    * Sets the Zoom factor. The value is given in percent, larger values mean a
321    * generally larger font and larger page contents. It is not guaranteed that
322    * all parts of the page are scaled with the same factor though.
323    *
324    * The given value should be in the range of 20..300, values outside that
325    * range are not guaranteed to work. A value of 100 will disable all zooming
326    * and show the page with the sizes determined via the given lengths in the
327    * stylesheets.
328    */
329   void setZoomFactor(int percent);
330
331   /**
332    * Returns the current zoom factor.
333    */
334   int zoomFactor() const;
335
336   /**
337    * Returns the text the user has marked.
338    */
339   virtual QString selectedText() const;
340
341   /**
342    * Returns the granularity of the selection (character, word, line, paragraph).
343    */
344   ETextGranularity selectionGranularity() const;
345   
346   /**
347    * Sets the granularity of the selection (character, word, line, paragraph).
348    */
349   void setSelectionGranularity(ETextGranularity granularity) const;
350
351   /**
352    * Returns the drag caret of the HTML.
353    */
354   const SelectionController &dragCaret() const;
355
356   /**
357    * Sets the current selection.
358    */
359   void setSelection(const SelectionController &, bool closeTyping = true, bool keepTypingStyle = false);
360
361   /**
362    * Returns whether selection can be changed.
363    */
364   bool shouldChangeSelection(const SelectionController &) const;
365
366   /**
367    * Returns a mark, to be used as emacs uses it.
368    */
369   const Selection &mark() const;
370
371   /**
372    * Returns the mark.
373    */
374   void setMark(const Selection &);
375
376   /**
377    * Sets the current drag caret.
378    */
379   void setDragCaret(const SelectionController &);
380   
381   /**
382    * Transposes characters either side of caret selection.
383    */
384   void transpose();
385   
386   /**
387    * Invalidates the current selection.
388    */
389   void invalidateSelection();
390
391   void setCaretVisible(bool flag = true);
392   void paintCaret(GraphicsContext*, const IntRect&) const;  
393   void paintDragCaret(GraphicsContext*, const IntRect&) const;
394
395   /**
396    * Set info for vertical arrow navigation.
397    */
398   void setXPosForVerticalArrowNavigation(int x);
399
400   /**
401    * Get info for vertical arrow navigation.
402    */
403   int xPosForVerticalArrowNavigation() const;
404
405   /**
406    * Has the user selected anything?
407    *
408    *  Call @ref selectedText() to
409    * retrieve the selected text.
410    *
411    * @return @p true if there is text selected.
412    */
413   bool hasSelection() const;
414
415   /**
416    * Marks all text in the document as selected.
417    */
418   void selectAll();
419
420   /**
421    * Marks contents of node as selected.
422    * Returns whether the selection changed.
423    */
424   bool selectContentsOfNode(NodeImpl*);
425  
426   /**
427    * Returns whether editing should end in the given range
428    */
429   virtual bool shouldBeginEditing(const RangeImpl *) const;
430
431   /**
432    * Returns whether editing should end in the given range
433    */
434   virtual bool shouldEndEditing(const RangeImpl *) const;
435
436   /**
437    * Called when editing has begun.
438    */
439   virtual void didBeginEditing() const {};
440    
441   /**
442    * Called when editing has ended.
443    */
444   virtual void didEndEditing() const {};
445     
446   /**
447    * Returns the contentEditable "override" value for the part
448    */
449   virtual bool isContentEditable() const;
450
451   /**
452    * Returns the most recent edit command applied.
453    */
454   EditCommandPtr lastEditCommand();
455
456   /**
457    * Called when editing has been applied.
458    */
459   void appliedEditing(EditCommandPtr &);
460
461   /**
462    * Called when editing has been unapplied.
463    */
464   void unappliedEditing(EditCommandPtr &);
465
466   /**
467    * Called when editing has been reapplied.
468    */
469   void reappliedEditing(EditCommandPtr &);
470
471   /**
472    * Returns the typing style for the document.
473    */
474   CSSMutableStyleDeclarationImpl *typingStyle() const;
475
476   /**
477    * Sets the typing style for the document.
478    */
479   void setTypingStyle(CSSMutableStyleDeclarationImpl *);
480
481   /**
482    * Clears the typing style for the document.
483    */
484   void clearTypingStyle();
485
486   virtual void tokenizerProcessedData() {}
487
488   const KHTMLSettings* settings() const;
489
490   void setJSStatusBarText(const String&);
491   void setJSDefaultStatusBarText(const String&);
492   String jsStatusBarText() const;
493   String jsDefaultStatusBarText() const;
494
495   /**
496    * Referrer used for links in this page.
497    */
498   QString referrer() const;
499
500   /**
501    * Last-modified date (in raw string format), if received in the [HTTP] headers.
502    */
503   QString lastModified() const;
504
505   bool isPointInsideSelection(int x, int y);
506
507   virtual bool tabsToLinks() const;
508   virtual bool tabsToAllControls() const;
509
510   // Editing operations.
511   enum TriState { falseTriState, trueTriState, mixedTriState };
512   void copyToPasteboard();
513   void cutToPasteboard();
514   void pasteFromPasteboard();
515   void pasteAndMatchStyle();
516   virtual bool canPaste() const = 0;
517   void redo();
518   void undo();
519   virtual bool canRedo() const = 0;
520   virtual bool canUndo() const = 0;
521   void computeAndSetTypingStyle(CSSStyleDeclarationImpl *, EditAction editingAction=EditActionUnspecified);
522   void applyStyle(CSSStyleDeclarationImpl *, EditAction editingAction=EditActionUnspecified);
523   void applyParagraphStyle(CSSStyleDeclarationImpl *, EditAction editingAction=EditActionUnspecified);
524   TriState selectionHasStyle(CSSStyleDeclarationImpl *) const;
525   bool selectionStartHasStyle(CSSStyleDeclarationImpl *) const;
526   String selectionStartStylePropertyValue(int stylePropertyID) const;
527   void applyEditingStyleToBodyElement() const;
528   void removeEditingStyleFromBodyElement() const;
529   void applyEditingStyleToElement(ElementImpl *) const;
530   void removeEditingStyleFromElement(ElementImpl *) const;
531   virtual void print() = 0;
532   virtual bool isCharacterSmartReplaceExempt(const QChar &, bool);
533
534   // Used to keep the part alive when running a script that might destroy it.
535   void keepAlive();
536
537   static void endAllLifeSupport();
538
539   /**
540    * returns a KURL object for the given url. Use when
541    * you know what you're doing.
542    */
543   KURL completeURL( const QString &url );
544
545   virtual void khtmlMouseDoubleClickEvent(MouseEventWithHitTestResults*);
546   virtual void khtmlMousePressEvent(MouseEventWithHitTestResults*);
547   virtual void khtmlMouseMoveEvent(MouseEventWithHitTestResults*);
548   virtual void khtmlMouseReleaseEvent(MouseEventWithHitTestResults*);
549   
550   void selectClosestWordFromMouseEvent(MouseEvent*, NodeImpl* innerNode, int x, int y);
551
552   virtual void urlSelected(const QString& url, const QString& target, const URLArgs& args = URLArgs());
553
554
555   // Methods with platform-specific overrides (and no base class implementation).
556   virtual void setTitle(const String &) = 0;
557   virtual void handledOnloadEvents() = 0;
558   virtual QString userAgent() const = 0;
559   virtual QString incomingReferrer() const = 0;
560   virtual QString mimeTypeForFileName(const QString &) const = 0;
561   virtual void clearRecordedFormValues() = 0;
562   virtual void recordFormValue(const QString &name, const QString &value, HTMLFormElementImpl *element) = 0;
563   virtual KJS::Bindings::Instance *getEmbedInstanceForWidget(Widget*) = 0;
564   virtual KJS::Bindings::Instance *getObjectInstanceForWidget(Widget*) = 0;
565   virtual KJS::Bindings::Instance *getAppletInstanceForWidget(Widget*) = 0;
566   virtual void markMisspellingsInAdjacentWords(const VisiblePosition &) = 0;
567   virtual void markMisspellings(const SelectionController &) = 0;
568   virtual void addMessageToConsole(const String& message,  unsigned int lineNumber, const String& sourceID) = 0;
569   virtual void runJavaScriptAlert(const String& message) = 0;
570   virtual bool runJavaScriptConfirm(const String& message) = 0;
571   virtual bool runJavaScriptPrompt(const String& message, const String& defaultValue, String& result) = 0;  
572   virtual bool locationbarVisible() = 0;
573   virtual bool menubarVisible() = 0;
574   virtual bool personalbarVisible() = 0;
575   virtual bool statusbarVisible() = 0;
576   virtual bool toolbarVisible() = 0;
577   virtual void scheduleClose() = 0;
578   virtual void unfocusWindow() = 0;
579   virtual void createEmptyDocument() = 0;
580   virtual RangeImpl *markedTextRange() const = 0;
581   virtual void registerCommandForUndo(const EditCommandPtr &) = 0;
582   virtual void registerCommandForRedo(const EditCommandPtr &) = 0;
583   virtual void clearUndoRedoOperations() = 0;
584   virtual void issueUndoCommand() = 0;
585   virtual void issueRedoCommand() = 0;
586   virtual void issueCutCommand() = 0;
587   virtual void issueCopyCommand() = 0;
588   virtual void issuePasteCommand() = 0;
589   virtual void issuePasteAndMatchStyleCommand() = 0;
590   virtual void issueTransposeCommand() = 0;
591   virtual void respondToChangedSelection(const SelectionController &oldSelection, bool closeTyping) = 0;
592   virtual void respondToChangedContents() = 0;
593   virtual bool shouldChangeSelection(const SelectionController &oldSelection, const SelectionController &newSelection, EAffinity affinity, bool stillSelecting) const = 0;
594   virtual void partClearedInBegin() = 0; 
595   virtual void saveDocumentState() = 0;
596   virtual void restoreDocumentState() = 0;
597   virtual bool canGoBackOrForward(int distance) const = 0;
598   virtual void openURLRequest(const KURL &, const URLArgs &) = 0;
599   virtual void submitForm(const KURL &, const URLArgs &) = 0;
600   virtual void urlSelected(const KURL&, const URLArgs& args) = 0;
601   virtual bool passSubframeEventToSubframe(MouseEventWithHitTestResults &) = 0;
602   virtual bool passWheelEventToChildWidget(NodeImpl *) = 0;
603   virtual bool lastEventIsMouseUp() const = 0;
604   virtual QString overrideMediaType() const = 0;
605 protected:
606   virtual Plugin* createPlugin(const KURL& url, const QStringList& paramNames, const QStringList& paramValues, const QString& mimeType) = 0;
607   virtual Frame* createFrame(const KURL& url, const QString& name, RenderPart* renderer, const String& referrer) = 0;
608   virtual ObjectContentType objectContentType(const KURL& url, const QString& mimeType) = 0;
609
610     virtual void redirectionTimerFired(Timer<Frame>*);
611
612 public:
613   /**
614    * Stops all animated images on the current and child pages
615    */
616   void stopAnimations();
617
618   void loadDone();
619
620   void finishedParsing();
621
622   void checkCompleted();
623
624   void reparseConfiguration();
625
626 private:
627     virtual void receivedRedirect(TransferJob*, const KURL&);
628     virtual void receivedAllData(TransferJob*);
629
630   void childBegin();
631
632   void submitFormAgain();
633
634   void started();
635
636   void completed(bool);
637   void childCompleted(bool);
638   void parentCompleted();
639
640     void lifeSupportTimerFired(Timer<Frame>*);
641     void endLifeSupport();
642
643   virtual void clear(bool clearWindowProperties = true);
644
645   void clearCaretRectIfNeeded();
646   void setFocusNodeIfNeeded();
647   void selectionLayoutChanged();
648     void caretBlinkTimerFired(Timer<Frame>*);
649
650   bool shouldUsePlugin(NodeImpl* element, const KURL& url, const QString& mimeType, bool hasFallback, bool& useFallback);
651   bool loadPlugin(RenderPart* renderer, const KURL &url, const QString &mimeType, 
652                   const QStringList& paramNames, const QStringList& paramValues, bool useFallback);
653   Frame* loadSubframe(RenderPart* renderer, const KURL& url, const QString& name, const String& referrer);
654
655 public:
656   void submitForm(const char *action, const QString &url, const FormData &formData,
657                   const QString &target, const QString& contentType = QString::null,
658                   const QString& boundary = QString::null );
659   
660   bool requestObject(RenderPart *frame, const QString &url, const QString &frameName,
661                      const QString &serviceType, const QStringList &paramNames, const QStringList &paramValues);
662   bool requestFrame(RenderPart *frame, const QString &url, const QString &frameName);
663
664   DocumentImpl *document() const;
665   void setDocument(DocumentImpl* newDoc);
666
667   // Workaround for the fact that it's hard to delete a frame.
668   // Call this after doing user-triggered selections to make it easy to delete the frame you entirely selected.
669   void selectFrameElementInParentIfFullySelected();
670   
671   virtual bool mouseDownMayStartSelect() const { return true; }
672
673   void handleFallbackContent();
674
675 private:
676   void cancelRedirection(bool newLoadInProgress = false);
677
678  public:
679   KJS::JSValue* executeScript(const QString& filename, int baseLine, NodeImpl*, const QString& script);
680   KJSProxyImpl *jScript();
681   Frame *opener();
682   void setOpener(Frame *_opener);
683   bool openedByJS();
684   void setOpenedByJS(bool _openedByJS);
685
686   void setSettings(KHTMLSettings *);
687
688   void provisionalLoadStarted();
689   bool userGestureHint();
690   void didNotOpenURL(const KURL &);
691   void addData(const char *bytes, int length);
692   void addMetaData(const QString &key, const QString &value);
693   void setMediaType(const QString &);
694
695   // root renderer for the document contained in this frame
696   RenderObject* renderer() const;
697   
698   ElementImpl* ownerElement();
699   // renderer for the element that contains this frame
700   RenderPart* ownerRenderer();
701
702   IntRect selectionRect() const;
703   bool isFrameSet() const;
704
705   HTMLFormElementImpl *currentForm() const;
706
707   RenderStyle *styleForSelectionStart(NodeImpl *&nodeToRemove) const;
708
709   // Scrolls as necessary to reveal the selection
710   void revealSelection();
711   // Centers the selection regardless of whether it was already visible
712   void centerSelectionInVisibleArea() const;
713   void setSelectionFromNone();
714
715   bool scrollOverflow(KWQScrollDirection direction, KWQScrollGranularity granularity);
716
717   void adjustPageHeight(float *newBottom, float oldTop, float oldBottom, float bottomLimit);
718
719   bool canCachePage();
720   KJS::PausedTimeouts *pauseTimeouts();
721   void resumeTimeouts(KJS::PausedTimeouts *);
722   void saveWindowProperties(KJS::SavedProperties *windowProperties);
723   void saveLocationProperties(KJS::SavedProperties *locationProperties);
724   void restoreWindowProperties(KJS::SavedProperties *windowProperties);
725   void restoreLocationProperties(KJS::SavedProperties *locationProperties);
726   void saveInterpreterBuiltins(KJS::SavedBuiltins &interpreterBuiltins);
727   void restoreInterpreterBuiltins(const KJS::SavedBuiltins &interpreterBuiltins);
728
729   static Frame *frameForWidget(const Widget *);
730   static NodeImpl *nodeForWidget(const Widget *);
731   static Frame *frameForNode(NodeImpl *);
732
733   static void setDocumentFocus(Widget *);
734   static void clearDocumentFocus(Widget *);
735
736   static const QPtrList<Frame> &instances() { return mutableInstances(); }    
737   static QPtrList<Frame> &mutableInstances();
738
739   void updatePolicyBaseURL();
740   void setPolicyBaseURL(const String&);
741
742   void forceLayout();
743   void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth);
744
745   void sendResizeEvent();
746   void sendScrollEvent();
747   bool scrollbarsVisible();
748   void scrollToAnchor(const KURL &);
749   bool canMouseDownStartSelect(NodeImpl* node);
750   bool passWidgetMouseDownEventToWidget(MouseEventWithHitTestResults *, bool isDoubleClick);
751   bool passWidgetMouseDownEventToWidget(RenderWidget *);
752   virtual bool passMouseDownEventToWidget(Widget *) = 0;
753
754   void clearTimers();
755   static void clearTimers(FrameView *);
756
757   bool displaysWithFocusAttributes() const;
758   void setWindowHasFocus(bool flag);
759   // Convenience, to avoid repeating the code to dig down to get this.
760
761   QChar backslashAsCurrencySymbol() const;
762
763   QValueList<MarkedTextUnderline> markedTextUnderlines() const;  
764   bool markedTextUsesUnderlines() const;
765   unsigned highlightAllMatchesForString(const QString &, bool caseFlag);
766
767   // Call this method before handling a new user action, like on a mouse down or key down.
768   // Currently, all this does is clear the "don't submit form twice" data member.
769   void prepareForUserAction();
770   NodeImpl *mousePressNode();
771
772   bool isComplete() const;
773   bool isLoadingMainResource() const;
774   
775   void replaceContentsWithScriptResult(const KURL &url);
776
777     void disconnectOwnerRenderer();
778
779 protected:
780     virtual void startRedirectionTimer();
781     virtual void stopRedirectionTimer();
782     
783     void handleAutoscroll(RenderLayer*);
784     void startAutoscrollTimer();
785     void stopAutoscrollTimer();
786
787  private:
788   void emitLoadEvent();
789   
790   void receivedFirstData();
791
792   bool handleMouseMoveEventDrag(MouseEventWithHitTestResults*);
793   bool handleMouseMoveEventOver(MouseEventWithHitTestResults*);
794   void handleMouseMoveEventSelection(MouseEventWithHitTestResults*);
795
796   /**
797    * @internal Extracts anchor and tries both encoded and decoded form.
798    */
799   void gotoAnchor();
800
801   void handleMousePressEventSingleClick(MouseEventWithHitTestResults*);
802   void handleMousePressEventDoubleClick(MouseEventWithHitTestResults*);
803   void handleMousePressEventTripleClick(MouseEventWithHitTestResults*);
804
805   CSSComputedStyleDeclarationImpl *selectionComputedStyle(NodeImpl *&nodeToRemove) const;
806
807     virtual void setStatusBarText(const String&);
808     
809     void autoscrollTimerFired(Timer<Frame>*);
810
811 public:
812   friend class MacFrame;
813   friend class FrameWin;
814
815   void checkEmitLoadEvent();
816   bool didOpenURL(const KURL &);
817   virtual void didFirstLayout() {}
818
819   virtual void frameDetached();
820
821   virtual void detachFromView();
822   void updateBaseURLForEmptyDocument();
823
824   KURL url() const;
825
826   // split out controller objects
827   FrameTree* tree() const;
828   SelectionController& selection() const;
829
830  private:
831   friend class FramePrivate;
832   FramePrivate* d;
833       
834   mutable RefPtr<NodeImpl> _elementToDraw;
835   mutable bool _drawSelectionOnly;
836   KURL _submittedFormURL;
837   bool m_markedTextUsesUnderlines;
838   QValueList<MarkedTextUnderline> m_markedTextUnderlines;
839   bool m_windowHasFocus;
840   int frameCount;
841 };
842
843 }
844
845 #endif