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