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