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