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