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