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