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