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