2006-03-20 Eric Seidel <eseidel@apple.com>
[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 "Node.h"
35 #include "Shared.h"
36 #include "TransferJobClient.h"
37 #include "EditAction.h"
38 #include "TextAffinity.h"
39 #include "TextGranularity.h"
40 #include <KURL.h>
41 #include <qscrollbar.h>
42 #include <DeprecatedStringList.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 CSSComputedStyleDeclaration;
61 class CSSMutableStyleDeclaration;
62 class CSSStyleDeclaration;
63 class DrawContentsEvent;
64 class EditCommandPtr;
65 class FramePrivate;
66 class FrameTree;
67 class KJSProxy;
68 class Page;
69 class Plugin;
70 class MouseEventWithHitTestResults;
71 class Range;
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(Node*, const DeprecatedString& script, bool forceUserGesture = false);
156
157   /**
158    * Implementation of CSS property -khtml-user-drag == auto
159    */
160   virtual bool shouldDragAutoNode(Node*, 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   String baseTarget() const;
179
180   /**
181    * Schedules a redirection after @p delay seconds.
182    */
183   void scheduleRedirection(double delay, const DeprecatedString& 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 DeprecatedString& URL, const DeprecatedString& referrer, bool lockHistory = true, bool userGesture = false);
190   void scheduleLocationChange(const DeprecatedString& url, const DeprecatedString& 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    * All child frames and the old document are removed if you call
213    * this method.
214    */
215   virtual void begin(const KURL& url = KURL());
216
217   /**
218    * Writes another part of the HTML code to the widget.
219    *
220    * You may call
221    * this function many times in sequence. But remember: The fewer calls
222    * you make, the faster the widget will be.
223    *
224    * The HTML code is send through a decoder which decodes the stream to
225    * Unicode.
226    *
227    * The @p len parameter is needed for streams encoded in utf-16,
228    * since these can have \0 chars in them. In case the encoding
229    * you're using isn't utf-16, you can safely leave out the length
230    * parameter.
231    *
232    * Attention: Don't mix calls to @ref write(const char*) with calls
233    * to @ref write(const DeprecatedString&  ).
234    *
235    * The result might not be what you want.
236    */
237   virtual void write(const char* str, int len = -1);
238
239   /**
240    * Writes another part of the HTML code to the widget.
241    *
242    * You may call
243    * this function many times in sequence. But remember: The fewer calls
244    * you make, the faster the widget will be.
245    */
246   virtual void write(const DeprecatedString& str);
247
248   /**
249    * Call this after your last call to @ref write().
250    */
251   virtual void end();
252
253   void endIfNotLoading();
254
255   /**
256    * Similar to end, but called to abort a load rather than cleanly end.
257    */
258   void stop();
259
260   void paint(GraphicsContext*, const IntRect&);
261
262   void setEncoding(const DeprecatedString& encoding, bool userChosen);
263
264   /**
265    * Returns the encoding the page currently uses.
266    *
267    * Note that the encoding might be different from the charset.
268    */
269   DeprecatedString encoding() const;
270
271   /**
272    * Sets a user defined style sheet to be used on top of the HTML 4
273    * default style sheet.
274    *
275    * This gives a wide range of possibilities to
276    * change the layout of the page.
277    */
278   void setUserStyleSheet(const KURL& url);
279
280   /**
281    * Sets a user defined style sheet to be used on top of the HTML 4
282    * default style sheet.
283    *
284    * This gives a wide range of possibilities to
285    * change the layout of the page.
286    */
287   void setUserStyleSheet(const DeprecatedString& styleSheet);
288
289   /**
290    * Sets the standard font style.
291    *
292    * @param name The font name to use for standard text.
293    */
294   void setStandardFont(const String& name);
295
296   /**
297    * Sets the fixed font style.
298    *
299    * @param name The font name to use for fixed text, e.g.
300    * the <tt>&lt;pre&gt;</tt> tag.
301    */
302   void setFixedFont(const String& name);
303
304   /**
305    * Finds the anchor named @p name.
306    *
307    * If the anchor is found, the widget
308    * scrolls to the closest position. Returns @p if the anchor has
309    * been found.
310    */
311   bool gotoAnchor(const String& name);
312
313   /**
314    * Sets the Zoom factor. The value is given in percent, larger values mean a
315    * generally larger font and larger page contents. It is not guaranteed that
316    * all parts of the page are scaled with the same factor though.
317    *
318    * The given value should be in the range of 20..300, values outside that
319    * range are not guaranteed to work. A value of 100 will disable all zooming
320    * and show the page with the sizes determined via the given lengths in the
321    * stylesheets.
322    */
323   void setZoomFactor(int percent);
324
325   /**
326    * Returns the current zoom factor.
327    */
328   int zoomFactor() const;
329
330   /**
331    * Returns the text the user has marked.
332    */
333   virtual String selectedText() const;
334
335   /**
336    * Returns the granularity of the selection (character, word, line, paragraph).
337    */
338   TextGranularity selectionGranularity() const;
339   
340   /**
341    * Sets the granularity of the selection (character, word, line, paragraph).
342    */
343   void setSelectionGranularity(TextGranularity granularity) const;
344
345   /**
346    * Returns the drag caret of the HTML.
347    */
348   const SelectionController& dragCaret() const;
349
350   /**
351    * Sets the current selection.
352    */
353   void setSelection(const SelectionController&, bool closeTyping = true, bool keepTypingStyle = false);
354
355   /**
356    * Returns whether selection can be changed.
357    */
358   bool shouldChangeSelection(const SelectionController&) const;
359
360   /**
361    * Returns a mark, to be used as emacs uses it.
362    */
363   const Selection& mark() const;
364
365   /**
366    * Returns the mark.
367    */
368   void setMark(const Selection&);
369
370   /**
371    * Sets the current drag caret.
372    */
373   void setDragCaret(const SelectionController&);
374   
375   /**
376    * Transposes characters either side of caret selection.
377    */
378   void transpose();
379   
380   /**
381    * Invalidates the current selection.
382    */
383   void invalidateSelection();
384
385   void setCaretVisible(bool flag = true);
386   void paintCaret(GraphicsContext*, const IntRect&) const;  
387   void paintDragCaret(GraphicsContext*, const IntRect&) const;
388
389   /**
390    * Set info for vertical arrow navigation.
391    */
392   void setXPosForVerticalArrowNavigation(int x);
393
394   /**
395    * Get info for vertical arrow navigation.
396    */
397   int xPosForVerticalArrowNavigation() const;
398
399   /**
400    * Has the user selected anything?
401    *
402    *  Call @ref selectedText() to
403    * retrieve the selected text.
404    *
405    * @return @p true if there is text selected.
406    */
407   bool hasSelection() const;
408
409   /**
410    * Marks all text in the document as selected.
411    */
412   void selectAll();
413
414   /**
415    * Marks contents of node as selected.
416    * Returns whether the selection changed.
417    */
418   bool selectContentsOfNode(Node*);
419  
420   /**
421    * Returns whether editing should end in the given range
422    */
423   virtual bool shouldBeginEditing(const Range*) const;
424
425   /**
426    * Returns whether editing should end in the given range
427    */
428   virtual bool shouldEndEditing(const Range*) const;
429
430   /**
431    * Called when editing has begun.
432    */
433   virtual void didBeginEditing() const {};
434    
435   /**
436    * Called when editing has ended.
437    */
438   virtual void didEndEditing() const {};
439     
440   /**
441    * Returns the contentEditable "override" value for the part
442    */
443   virtual bool isContentEditable() const;
444
445   /**
446    * Returns the most recent edit command applied.
447    */
448   EditCommandPtr lastEditCommand();
449
450   /**
451    * Called when editing has been applied.
452    */
453   void appliedEditing(EditCommandPtr&);
454
455   /**
456    * Called when editing has been unapplied.
457    */
458   void unappliedEditing(EditCommandPtr&);
459
460   /**
461    * Called when editing has been reapplied.
462    */
463   void reappliedEditing(EditCommandPtr&);
464
465   /**
466    * Returns the typing style for the document.
467    */
468   CSSMutableStyleDeclaration* typingStyle() const;
469
470   /**
471    * Sets the typing style for the document.
472    */
473   void setTypingStyle(CSSMutableStyleDeclaration*);
474
475   /**
476    * Clears the typing style for the document.
477    */
478   void clearTypingStyle();
479
480   virtual void tokenizerProcessedData() {}
481
482   const KHTMLSettings* settings() const;
483
484   void setJSStatusBarText(const String&);
485   void setJSDefaultStatusBarText(const String&);
486   String jsStatusBarText() const;
487   String jsDefaultStatusBarText() const;
488
489   /**
490    * Referrer used for links in this page.
491    */
492   DeprecatedString referrer() const;
493
494   /**
495    * Last-modified date (in raw string format), if received in the [HTTP] headers.
496    */
497   String lastModified() const;
498
499   bool isPointInsideSelection(int x, int y);
500
501   virtual bool tabsToLinks() const;
502   virtual bool tabsToAllControls() const;
503
504   // Editing operations.
505   enum TriState { falseTriState, trueTriState, mixedTriState };
506   void copyToPasteboard();
507   void cutToPasteboard();
508   void pasteFromPasteboard();
509   void pasteAndMatchStyle();
510   virtual bool canPaste() const = 0;
511   void redo();
512   void undo();
513   virtual bool canRedo() const = 0;
514   virtual bool canUndo() const = 0;
515   void computeAndSetTypingStyle(CSSStyleDeclaration* , EditAction editingAction=EditActionUnspecified);
516   void applyStyle(CSSStyleDeclaration* , EditAction editingAction=EditActionUnspecified);
517   void applyParagraphStyle(CSSStyleDeclaration* , EditAction editingAction=EditActionUnspecified);
518   TriState selectionHasStyle(CSSStyleDeclaration*) const;
519   bool selectionStartHasStyle(CSSStyleDeclaration*) const;
520   String selectionStartStylePropertyValue(int stylePropertyID) const;
521   void applyEditingStyleToBodyElement() const;
522   void removeEditingStyleFromBodyElement() const;
523   void applyEditingStyleToElement(Element*) const;
524   void removeEditingStyleFromElement(Element*) const;
525   virtual void print() = 0;
526   virtual bool isCharacterSmartReplaceExempt(const QChar&, bool);
527
528   // Used to keep the part alive when running a script that might destroy it.
529   void keepAlive();
530
531   static void endAllLifeSupport();
532
533   /**
534    * returns a KURL object for the given url. Use when
535    * you know what you're doing.
536    */
537   KURL completeURL(const DeprecatedString& url);
538
539   virtual void handleMouseReleaseDoubleClickEvent(const MouseEventWithHitTestResults&);
540   virtual void handleMousePressEvent(const MouseEventWithHitTestResults&);
541   virtual void handleMouseMoveEvent(const MouseEventWithHitTestResults&);
542   virtual void handleMouseReleaseEvent(const MouseEventWithHitTestResults&);
543   
544   void selectClosestWordFromMouseEvent(const PlatformMouseEvent&, Node* innerNode, int x, int y);
545
546   virtual void urlSelected(const DeprecatedString& url, const String& target);
547   virtual void urlSelected(const ResourceRequest&, const String& target);
548
549
550   // Methods with platform-specific overrides (and no base class implementation).
551   virtual void setTitle(const String&) = 0;
552   virtual void handledOnloadEvents() = 0;
553   virtual String userAgent() const = 0;
554   virtual String incomingReferrer() const = 0;
555   virtual String mimeTypeForFileName(const String&) const = 0;
556   virtual KJS::Bindings::Instance* getEmbedInstanceForWidget(Widget*) = 0;
557   virtual KJS::Bindings::Instance* getObjectInstanceForWidget(Widget*) = 0;
558   virtual KJS::Bindings::Instance* getAppletInstanceForWidget(Widget*) = 0;
559   virtual void markMisspellingsInAdjacentWords(const VisiblePosition&) = 0;
560   virtual void markMisspellings(const SelectionController&) = 0;
561   virtual void addMessageToConsole(const String& message,  unsigned int lineNumber, const String& sourceID) = 0;
562   virtual void runJavaScriptAlert(const String& message) = 0;
563   virtual bool runJavaScriptConfirm(const String& message) = 0;
564   virtual bool runJavaScriptPrompt(const String& message, const String& defaultValue, String& result) = 0;  
565   virtual bool locationbarVisible() = 0;
566   virtual bool menubarVisible() = 0;
567   virtual bool personalbarVisible() = 0;
568   virtual bool statusbarVisible() = 0;
569   virtual bool toolbarVisible() = 0;
570   virtual void scheduleClose() = 0;
571   virtual void unfocusWindow() = 0;
572   virtual void createEmptyDocument() = 0;
573   virtual Range* markedTextRange() const = 0;
574   virtual void registerCommandForUndo(const EditCommandPtr&) = 0;
575   virtual void registerCommandForRedo(const EditCommandPtr&) = 0;
576   virtual void clearUndoRedoOperations() = 0;
577   virtual void issueUndoCommand() = 0;
578   virtual void issueRedoCommand() = 0;
579   virtual void issueCutCommand() = 0;
580   virtual void issueCopyCommand() = 0;
581   virtual void issuePasteCommand() = 0;
582   virtual void issuePasteAndMatchStyleCommand() = 0;
583   virtual void issueTransposeCommand() = 0;
584   virtual void respondToChangedSelection(const SelectionController& oldSelection, bool closeTyping) = 0;
585   virtual void respondToChangedContents() = 0;
586   virtual bool shouldChangeSelection(const SelectionController& oldSelection, const SelectionController& newSelection, EAffinity affinity, bool stillSelecting) const = 0;
587   virtual void partClearedInBegin() = 0; 
588   virtual void saveDocumentState() = 0;
589   virtual void restoreDocumentState() = 0;
590   virtual bool canGoBackOrForward(int distance) const = 0;
591   virtual void openURLRequest(const ResourceRequest&) = 0;
592   virtual void submitForm(const ResourceRequest&) = 0;
593   virtual void urlSelected(const ResourceRequest&) = 0;
594   virtual bool passSubframeEventToSubframe(MouseEventWithHitTestResults&, Frame* subframePart = 0) = 0;
595   virtual bool passWheelEventToChildWidget(Node*) = 0;
596   virtual bool lastEventIsMouseUp() const = 0;
597   virtual String overrideMediaType() const = 0;
598 protected:
599   virtual Plugin* createPlugin(const KURL& url, const DeprecatedStringList& paramNames, const DeprecatedStringList& paramValues, const String& mimeType) = 0;
600   virtual Frame* createFrame(const KURL& url, const String& name, RenderPart* renderer, const String& referrer) = 0;
601   virtual ObjectContentType objectContentType(const KURL& url, const String& mimeType) = 0;
602
603     virtual void redirectionTimerFired(Timer<Frame>*);
604
605 public:
606   /**
607    * Stops all animated images on the current and child pages
608    */
609   void stopAnimations();
610
611   void loadDone();
612
613   void finishedParsing();
614
615   void checkCompleted();
616
617   void reparseConfiguration();
618
619 private:
620     virtual void receivedRedirect(TransferJob*, const KURL&);
621     virtual void receivedAllData(TransferJob*);
622
623   void childBegin();
624
625   void submitFormAgain();
626
627   void started();
628
629   void completed(bool);
630   void childCompleted(bool);
631   void parentCompleted();
632
633     void lifeSupportTimerFired(Timer<Frame>*);
634     void endLifeSupport();
635
636   virtual void clear(bool clearWindowProperties = true);
637
638   void clearCaretRectIfNeeded();
639   void setFocusNodeIfNeeded();
640   void selectionLayoutChanged();
641     void caretBlinkTimerFired(Timer<Frame>*);
642
643   bool shouldUsePlugin(Node* element, const KURL& url, const String& mimeType, bool hasFallback, bool& useFallback);
644   bool loadPlugin(RenderPart* renderer, const KURL& url, const String& mimeType, 
645                   const DeprecatedStringList& paramNames, const DeprecatedStringList& paramValues, bool useFallback);
646   Frame* loadSubframe(RenderPart* renderer, const KURL& url, const String& name, const String& referrer);
647
648 public:
649   void submitForm(const char* action, const String& url, const FormData& formData,
650                   const String& target, const String& contentType = String(),
651                   const String& boundary = String());
652   
653   bool requestObject(RenderPart* frame, const String& url, const AtomicString& frameName,
654                      const String& serviceType, const DeprecatedStringList& paramNames, const DeprecatedStringList& paramValues);
655   bool requestFrame(RenderPart* frame, const String& url, const AtomicString& frameName);
656
657   Document* document() const;
658   void setDocument(Document* newDoc);
659
660   // Workaround for the fact that it's hard to delete a frame.
661   // Call this after doing user-triggered selections to make it easy to delete the frame you entirely selected.
662   void selectFrameElementInParentIfFullySelected();
663   
664   virtual bool mouseDownMayStartSelect() const { return true; }
665
666   void handleFallbackContent();
667
668 private:
669   void cancelRedirection(bool newLoadInProgress = false);
670
671  public:
672   KJS::JSValue* executeScript(const String& filename, int baseLine, Node*, const DeprecatedString& script);
673   KJSProxy* jScript();
674   Frame* opener();
675   void setOpener(Frame* _opener);
676   bool openedByJS();
677   void setOpenedByJS(bool _openedByJS);
678
679   void setSettings(KHTMLSettings*);
680
681   void provisionalLoadStarted();
682   bool userGestureHint();
683   void didNotOpenURL(const KURL&);
684   void addData(const char* bytes, int length);
685   void addMetaData(const String& key, const String& value);
686   void setMediaType(const String&);
687
688   // root renderer for the document contained in this frame
689   RenderObject* renderer() const;
690   
691   Element* ownerElement();
692   // renderer for the element that contains this frame
693   RenderPart* ownerRenderer();
694
695   IntRect selectionRect() const;
696   FloatRect visibleSelectionRect() const;
697   bool isFrameSet() const;
698
699   HTMLFormElement* currentForm() const;
700
701   RenderStyle* styleForSelectionStart(Node* &nodeToRemove) const;
702
703   // Scrolls as necessary to reveal the selection
704   void revealSelection();
705   // Centers the selection regardless of whether it was already visible
706   void centerSelectionInVisibleArea() const;
707   void setSelectionFromNone();
708
709   bool scrollOverflow(KWQScrollDirection direction, KWQScrollGranularity granularity);
710
711   void adjustPageHeight(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
712
713   bool canCachePage();
714   KJS::PausedTimeouts* pauseTimeouts();
715   void resumeTimeouts(KJS::PausedTimeouts*);
716   void saveWindowProperties(KJS::SavedProperties* windowProperties);
717   void saveLocationProperties(KJS::SavedProperties* locationProperties);
718   void restoreWindowProperties(KJS::SavedProperties* windowProperties);
719   void restoreLocationProperties(KJS::SavedProperties* locationProperties);
720   void saveInterpreterBuiltins(KJS::SavedBuiltins& interpreterBuiltins);
721   void restoreInterpreterBuiltins(const KJS::SavedBuiltins& interpreterBuiltins);
722
723   static Frame* frameForWidget(const Widget*);
724   static Node* nodeForWidget(const Widget*);
725   static Frame* frameForNode(Node*);
726
727   static void clearDocumentFocus(Widget*);
728
729   static const DeprecatedPtrList<Frame>& instances() { return mutableInstances(); }    
730   static DeprecatedPtrList<Frame>& mutableInstances();
731
732   void updatePolicyBaseURL();
733   void setPolicyBaseURL(const String&);
734
735   void forceLayout();
736   void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth);
737
738   void sendResizeEvent();
739   void sendScrollEvent();
740   bool scrollbarsVisible();
741   void scrollToAnchor(const KURL&);
742   bool canMouseDownStartSelect(Node*);
743   bool passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults&, bool isDoubleClick);
744   bool passWidgetMouseDownEventToWidget(RenderWidget*);
745   virtual bool passMouseDownEventToWidget(Widget*) = 0;
746
747   void clearTimers();
748   static void clearTimers(FrameView*);
749
750   bool displaysWithFocusAttributes() const;
751   virtual void setDisplaysWithFocusAttributes(bool flag);
752   void setWindowHasFocus(bool flag);
753   // Convenience, to avoid repeating the code to dig down to get this.
754
755   QChar backslashAsCurrencySymbol() const;
756
757   DeprecatedValueList<MarkedTextUnderline> markedTextUnderlines() const;  
758   bool markedTextUsesUnderlines() const;
759   unsigned highlightAllMatchesForString(const String&, bool caseFlag);
760
761   // Call this method before handling a new user action, like on a mouse down or key down.
762   // Currently, all this does is clear the "don't submit form twice" data member.
763   void prepareForUserAction();
764   Node* mousePressNode();
765   
766   void clearRecordedFormValues();
767   void recordFormValue(const String& name, const String& value, PassRefPtr<HTMLFormElement>);
768
769   bool isComplete() const;
770   bool isLoadingMainResource() const;
771   
772   void replaceContentsWithScriptResult(const KURL& url);
773
774     void disconnectOwnerRenderer();
775
776 protected:
777     virtual void startRedirectionTimer();
778     virtual void stopRedirectionTimer();
779     
780     void handleAutoscroll(RenderLayer*);
781     void startAutoscrollTimer();
782     void stopAutoscrollTimer();
783
784  private:
785   void emitLoadEvent();
786   
787   void receivedFirstData();
788
789   bool deleteMe1(const MouseEventWithHitTestResults&);
790   bool deleteMe2(const MouseEventWithHitTestResults&);
791   void handleMouseMoveEventPart2(const MouseEventWithHitTestResults&);
792
793   /**
794    * @internal Extracts anchor and tries both encoded and decoded form.
795    */
796   void gotoAnchor();
797
798   void handleMousePressEventSingleClick(const MouseEventWithHitTestResults&);
799   void handleMousePressEventDoubleClick(const MouseEventWithHitTestResults&);
800   void handleMousePressEventTripleClick(const MouseEventWithHitTestResults&);
801
802   CSSComputedStyleDeclaration* selectionComputedStyle(Node* &nodeToRemove) const;
803
804     virtual void setStatusBarText(const String&);
805     
806     void autoscrollTimerFired(Timer<Frame>*);
807
808 public:
809   friend class FrameMac;
810   friend class FrameWin;
811
812   void checkEmitLoadEvent();
813   bool didOpenURL(const KURL&);
814   virtual void didFirstLayout() {}
815
816   virtual void frameDetached();
817
818   virtual void detachFromView();
819   void updateBaseURLForEmptyDocument();
820
821   KURL url() const;
822   void setResourceRequest(const ResourceRequest& request);
823   const ResourceRequest& resourceRequest() const;
824
825   // split out controller objects
826   FrameTree* tree() const;
827   SelectionController& selection() const;
828
829  private:
830   friend class FramePrivate;
831   FramePrivate* d;
832 };
833
834 }
835
836 #endif