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