#ifndef Frame_H
#define Frame_H
#include "BrowserExtension.h"
#include "Color.h"
#include "DeprecatedStringList.h"
#include "EditAction.h"
#include "FrameView.h"
#include "ScrollBar.h"
#include "Node.h"
#include "TextAffinity.h"
#include "TextGranularity.h"
#include <wtf/Vector.h>
#include "RenderObject.h"
namespace KJS {
class JSValue;
class PausedTimeouts;
class SavedBuiltins;
class SavedProperties;
namespace Bindings {
class Instance;
}
}
namespace WebCore {
class CSSComputedStyleDeclaration;
class CSSMutableStyleDeclaration;
class CSSStyleDeclaration;
class DrawContentsEvent;
class DOMWindow;
class EditCommandPtr;
class FramePrivate;
class FrameTree;
class KJSProxy;
class Page;
class Plugin;
class MouseEventWithHitTestResults;
class Range;
class RenderLayer;
class Selection;
class SelectionController;
class Settings;
class VisiblePosition;
class RenderLayer;
template <typename T> class Timer;
struct MarkedTextUnderline {
MarkedTextUnderline(unsigned s, unsigned e, const Color& c, bool t)
: startOffset(s), endOffset(e), color(c), thick(t) { }
unsigned startOffset;
unsigned endOffset;
Color color;
bool thick;
};
enum {
OverflowScrollNone = 0x0,
OverflowScrollLeft = 0x1,
OverflowScrollRight = 0x2,
OverflowScrollUp = 0x4,
OverflowScrollDown = 0x8
};
enum OverflowScrollAction { DoNotPerformOverflowScroll, PerformOverflowScroll };
enum ObjectContentType {
ObjectContentNone,
ObjectContentImage,
ObjectContentFrame,
ObjectContentPlugin,
};
class Frame : public Shared<Frame>, Noncopyable {
public:
enum { NoXPosForVerticalArrowNavigation = INT_MIN };
Frame(Page*, Element*);
virtual ~Frame();
virtual bool canTargetLoadInFrame(Frame*) { return false; }
virtual bool openURL(const KURL&);
virtual bool closeURL();
void didExplicitOpen();
Page* page() const;
void pageDestroyed();
void stopLoading(bool sendUnload = false);
BrowserExtension* browserExtension() const;
FrameView* view() const;
virtual void setView(FrameView*);
bool jScriptEnabled() const;
bool javaEnabled() const;
bool pluginsEnabled() const;
KJS::JSValue* executeScript(Node*, const DeprecatedString& script, bool forceUserGesture = false);
virtual bool shouldDragAutoNode(Node*, const IntPoint&) const;
void setAutoLoadImages(bool enable);
bool autoLoadImages() const;
KURL baseURL() const;
String baseTarget() const;
void scheduleRedirection(double delay, const DeprecatedString& url, bool lockHistory = true);
void changeLocation(const DeprecatedString& URL, const DeprecatedString& referrer, bool lockHistory = true, bool userGesture = false);
void scheduleLocationChange(const DeprecatedString& url, const DeprecatedString& referrer, bool lockHistory = true, bool userGesture = false);
void scheduleRefresh(bool userGesture = false);
bool isScheduledLocationChangePending() const;
void scheduleHistoryNavigation(int steps);
virtual void begin(const KURL& url = KURL());
virtual void write(const char* str, int len = -1);
virtual void write(const DeprecatedString& str);
virtual void end();
void endIfNotLoading();
void stop();
void paint(GraphicsContext*, const IntRect&);
void setEncoding(const DeprecatedString& encoding, bool userChosen);
DeprecatedString encoding() const;
void setUserStyleSheetLocation(const KURL&);
void setUserStyleSheet(const String& styleSheetData);
void setStandardFont(const String& name);
void setFixedFont(const String& name);
bool gotoAnchor(const String& name);
void setZoomFactor(int percent);
int zoomFactor() const;
virtual String selectedText() const;
bool findString(const String&, bool, bool, bool);
TextGranularity selectionGranularity() const;
void setSelectionGranularity(TextGranularity granularity) const;
void setSelection(const SelectionController&, bool closeTyping = true);
bool shouldChangeSelection(const SelectionController&) const;
virtual bool shouldDeleteSelection(const SelectionController&) const;
void notifyRendererOfSelectionChange(bool userTriggered);
virtual void notifySelectionLayoutChanged() const;
void setSingleLineSelectionBehavior(bool b);
bool singleLineSelectionBehavior() const;
const Selection& mark() const;
void setMark(const Selection&);
void setDragCaret(const SelectionController&);
void transpose();
void clearSelection();
void invalidateSelection();
void setCaretVisible(bool flag = true);
void paintCaret(GraphicsContext*, const IntRect&) const;
void paintDragCaret(GraphicsContext*, const IntRect&) const;
void setCaretColor(const Color &color);
void setXPosForVerticalArrowNavigation(int x);
int xPosForVerticalArrowNavigation() const;
void scrollOverflowLayer(RenderLayer *, const IntRect &visibleRect, const IntRect &exposeRect);
bool hasSelection() const;
void selectAll();
bool selectContentsOfNode(Node*);
virtual bool shouldBeginEditing(const Range*) const;
virtual bool shouldEndEditing(const Range*) const;
virtual void didBeginEditing() const {};
virtual void didEndEditing() const {};
virtual bool isContentEditable() const;
virtual void textFieldDidBeginEditing(Element*);
virtual void textFieldDidEndEditing(Element*);
virtual void textDidChangeInTextField(Element*);
virtual bool doTextFieldCommandFromEvent(Element*, const PlatformKeyboardEvent*);
virtual void textWillBeDeletedInTextField(Element* input);
virtual void textDidChangeInTextArea(Element*);
virtual void formElementDidSetValue(Element *);
virtual void formElementDidFocus(Element*);
virtual void formElementDidBlur(Element*);
virtual void didReceiveViewportArguments(ViewportArguments);
virtual void setNeedsScrollNotifications(bool);
virtual bool inputManagerHasMarkedText() const { return false; }
EditCommandPtr lastEditCommand();
void appliedEditing(EditCommandPtr&);
void unappliedEditing(EditCommandPtr&);
void reappliedEditing(EditCommandPtr&);
CSSMutableStyleDeclaration* typingStyle() const;
void setTypingStyle(CSSMutableStyleDeclaration*);
void clearTypingStyle();
virtual void tokenizerProcessedData() {}
bool inViewSourceMode() const;
void setInViewSourceMode(bool = true) const;
const Settings* settings() const;
void setJSStatusBarText(const String&);
void setJSDefaultStatusBarText(const String&);
String jsStatusBarText() const;
String jsDefaultStatusBarText() const;
DeprecatedString referrer() const;
String lastModified() const;
bool isPointInsideSelection(const IntPoint&);
virtual bool tabsToLinks() const;
virtual bool tabsToAllControls() const;
enum TriState { falseTriState, trueTriState, mixedTriState };
void copyToPasteboard();
void cutToPasteboard();
void pasteFromPasteboard();
void pasteAndMatchStyle();
virtual bool canPaste() const = 0;
void redo();
void undo();
virtual bool canRedo() const = 0;
virtual bool canUndo() const = 0;
void computeAndSetTypingStyle(CSSStyleDeclaration* , EditAction editingAction=EditActionUnspecified);
void applyStyle(CSSStyleDeclaration* , EditAction editingAction=EditActionUnspecified);
void applyParagraphStyle(CSSStyleDeclaration* , EditAction editingAction=EditActionUnspecified);
TriState selectionHasStyle(CSSStyleDeclaration*) const;
bool selectionStartHasStyle(CSSStyleDeclaration*) const;
TriState selectionListState() const;
String selectionStartStylePropertyValue(int stylePropertyID) const;
void applyEditingStyleToBodyElement() const;
void removeEditingStyleFromBodyElement() const;
void applyEditingStyleToElement(Element*) const;
void removeEditingStyleFromElement(Element*) const;
virtual void print() = 0;
virtual bool isCharacterSmartReplaceExempt(const DeprecatedChar&, bool);
void keepAlive();
static void endAllLifeSupport();
#ifndef NDEBUG
static void cancelAllKeepAlive();
#endif
virtual void deferredContentChangeObserved() = 0;
virtual void clearObservedContentModifiers() = 0;
KURL completeURL(const DeprecatedString& url);
virtual void handleMouseReleaseDoubleClickEvent(const MouseEventWithHitTestResults&);
virtual void handleMousePressEvent(const MouseEventWithHitTestResults&);
virtual void handleMouseMoveEvent(const MouseEventWithHitTestResults&);
virtual void handleMouseReleaseEvent(const MouseEventWithHitTestResults&);
void selectClosestWordFromMouseEvent(const PlatformMouseEvent&, Node* innerNode);
virtual void urlSelected(const DeprecatedString& url, const String& target);
virtual void urlSelected(const ResourceRequest&, const String& target);
virtual void setTitle(const String&) = 0;
virtual void handledOnloadEvents() = 0;
virtual String userAgent() const = 0;
virtual String incomingReferrer() const = 0;
virtual String mimeTypeForFileName(const String&) const = 0;
virtual KJS::Bindings::Instance* getEmbedInstanceForWidget(Widget*) = 0;
virtual KJS::Bindings::Instance* getObjectInstanceForWidget(Widget*) = 0;
virtual void markMisspellingsInAdjacentWords(const VisiblePosition&) = 0;
virtual void markMisspellings(const SelectionController&) = 0;
virtual void runJavaScriptAlert(const String& message) = 0;
virtual bool runJavaScriptConfirm(const String& message) = 0;
virtual bool runJavaScriptPrompt(const String& message, const String& defaultValue, String& result) = 0;
virtual bool shouldInterruptJavaScript() = 0;
virtual bool locationbarVisible() = 0;
virtual bool menubarVisible() = 0;
virtual bool personalbarVisible() = 0;
virtual bool statusbarVisible() = 0;
virtual bool toolbarVisible() = 0;
virtual void scheduleClose() = 0;
virtual void focusWindow() = 0;
virtual void unfocusWindow() = 0;
virtual void createEmptyDocument() = 0;
virtual Range* markedTextRange() const = 0;
virtual void registerCommandForUndo(const EditCommandPtr&) = 0;
virtual void registerCommandForRedo(const EditCommandPtr&) = 0;
virtual void clearUndoRedoOperations() = 0;
virtual void issueUndoCommand() = 0;
virtual void issueRedoCommand() = 0;
virtual void issueCutCommand() = 0;
virtual void issueCopyCommand() = 0;
virtual void issuePasteCommand() = 0;
virtual void issuePasteAndMatchStyleCommand() = 0;
virtual void issueTransposeCommand() = 0;
virtual void respondToChangedSelection(const SelectionController& oldSelection, bool closeTyping) = 0;
virtual void respondToChangedContents() = 0;
virtual bool shouldChangeSelection(const SelectionController& oldSelection, const SelectionController& newSelection, EAffinity affinity, bool stillSelecting) const = 0;
virtual void partClearedInBegin() = 0;
virtual void saveDocumentState() = 0;
virtual void restoreDocumentState() = 0;
virtual bool canGoBackOrForward(int distance) const = 0;
virtual void openURLRequest(const ResourceRequest&) = 0;
virtual void submitForm(const ResourceRequest&) = 0;
virtual void urlSelected(const ResourceRequest&) = 0;
virtual bool passSubframeEventToSubframe(MouseEventWithHitTestResults&, Frame* subframePart = 0) = 0;
virtual bool passWheelEventToChildWidget(Node*) = 0;
virtual void passEventToScrollView() { }
virtual bool lastEventIsMouseUp() const = 0;
virtual String overrideMediaType() const = 0;
virtual void redirectDataToPlugin(Widget* pluginWidget) { }
void selectionLayoutChanged();
protected:
virtual Plugin* createPlugin(Element* node, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType) = 0;
virtual Frame* createFrame(const KURL& url, const String& name, Element* ownerElement, const String& referrer) = 0;
virtual ObjectContentType objectContentType(const KURL& url, const String& mimeType) = 0;
virtual void redirectionTimerFired(Timer<Frame>*);
public:
void loadDone();
void finishedParsing();
void checkCompleted();
void reparseConfiguration();
private:
void childBegin();
void submitFormAgain();
void started();
void completed(bool);
void childCompleted(bool);
void parentCompleted();
void lifeSupportTimerFired(Timer<Frame>*);
void endLifeSupport();
virtual void clear(bool clearWindowProperties = true);
void clearCaretRectIfNeeded();
void setFocusNodeIfNeeded();
void caretBlinkTimerFired(Timer<Frame>*);
void overflowAutoScrollTimerFired(Timer<Frame>*);
void startOverflowAutoScroll(const IntPoint &);
void stopOverflowAutoScroll();
int checkOverflowScroll(OverflowScrollAction);
void startAutoScroll();
void stopAutoScroll();
void overURL( const QString &url, const QString &target, bool shiftPressed = false );
bool shouldUsePlugin(Node* element, const KURL& url, const String& mimeType, bool hasFallback, bool& useFallback);
bool loadPlugin(RenderPart* renderer, const KURL& url, const String& mimeType,
const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback);
Frame* loadSubframe(Element* ownerElement, const KURL& url, const String& name, const String& referrer);
public:
void submitForm(const char* action, const String& url, const FormData& formData,
const String& target, const String& contentType = String(),
const String& boundary = String());
bool requestObject(RenderPart* frame, const String& url, const AtomicString& frameName,
const String& serviceType, const Vector<String>& paramNames, const Vector<String>& paramValues);
bool requestFrame(Element* ownerElement, const String& url, const AtomicString& frameName);
Document* document() const;
void setDocument(Document* newDoc);
void selectFrameElementInParentIfFullySelected();
virtual bool mouseDownMayStartSelect() const { return true; }
void handleFallbackContent();
private:
void cancelRedirection(bool newLoadInProgress = false);
public:
KJS::JSValue* executeScript(const String& filename, int baseLine, Node*, const DeprecatedString& script);
KJSProxy* jScript();
Frame* opener();
void setOpener(Frame* _opener);
bool openedByJS();
void setOpenedByJS(bool _openedByJS);
void setSettings(Settings*);
void provisionalLoadStarted();
bool userGestureHint();
void didNotOpenURL(const KURL&);
void addData(const char* bytes, int length);
void addMetaData(const String& key, const String& value);
void setMediaType(const String&);
RenderObject* renderer() const;
Element* ownerElement();
RenderPart* ownerRenderer();
IntRect selectionRect() const;
FloatRect visibleSelectionRect() const;
bool isFrameSet() const;
HTMLFormElement* currentForm() const;
RenderStyle* styleForSelectionStart(Node* &nodeToRemove) const;
void revealSelection();
void centerSelectionInVisibleArea() const;
void setSelectionFromNone();
bool scrollOverflow(ScrollDirection direction, ScrollGranularity granularity);
void adjustPageHeight(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
bool canCachePage();
KJS::PausedTimeouts* pauseTimeouts();
void resumeTimeouts(KJS::PausedTimeouts*);
void pauseTimeoutsAndSave();
void resumeSavedTimeouts();
virtual int maximumImageSize() {return 0;}
void saveWindowProperties(KJS::SavedProperties* windowProperties);
void saveLocationProperties(KJS::SavedProperties* locationProperties);
void restoreWindowProperties(KJS::SavedProperties* windowProperties);
void restoreLocationProperties(KJS::SavedProperties* locationProperties);
void saveInterpreterBuiltins(KJS::SavedBuiltins& interpreterBuiltins);
void restoreInterpreterBuiltins(const KJS::SavedBuiltins& interpreterBuiltins);
static Frame* frameForWidget(const Widget*);
static Node* nodeForWidget(const Widget*);
static Frame* frameForNode(Node*);
static void clearDocumentFocus(Widget*);
void updatePolicyBaseURL();
void setPolicyBaseURL(const String&);
void forceLayout();
void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth);
void sendResizeEvent();
void sendOrientationChangeEvent();
virtual int orientation() const { return 0; }
void sendScrollEvent();
bool scrollbarsVisible();
void scrollToAnchor(const KURL&);
bool canMouseDownStartSelect(Node*);
bool passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults&, bool isDoubleClick);
bool passWidgetMouseDownEventToWidget(RenderWidget*);
virtual bool passMouseDownEventToWidget(Widget*) = 0;
void clearTimers();
static void clearTimers(FrameView*);
void setCaretBlinks(bool flag = true);
bool isActive() const;
virtual void setIsActive(bool flag);
void setWindowHasFocus(bool flag);
UChar backslashAsCurrencySymbol() const;
DeprecatedValueList<MarkedTextUnderline> markedTextUnderlines() const;
bool markedTextUsesUnderlines() const;
unsigned markAllMatchesForText(const String&, bool caseFlag);
bool markedTextMatchesAreHighlighted() const;
void setMarkedTextMatchesAreHighlighted(bool flag);
void prepareForUserAction();
Node* mousePressNode();
void clearRecordedFormValues();
void recordFormValue(const String& name, const String& value, PassRefPtr<HTMLFormElement>);
bool isComplete() const;
bool isLoadingMainResource() const;
void replaceContentsWithScriptResult(const KURL& url);
void disconnectOwnerElement();
void setNeedsReapplyStyles();
protected:
virtual void startRedirectionTimer();
virtual void stopRedirectionTimer();
void handleAutoscroll(RenderLayer*);
void startAutoscrollTimer();
void stopAutoscrollTimer();
private:
void emitLoadEvent();
void receivedFirstData();
void gotoAnchor();
void handleMousePressEventSingleClick(const MouseEventWithHitTestResults&);
void handleMousePressEventDoubleClick(const MouseEventWithHitTestResults&);
void handleMousePressEventTripleClick(const MouseEventWithHitTestResults&);
CSSComputedStyleDeclaration* selectionComputedStyle(Node* &nodeToRemove) const;
virtual void setStatusBarText(const String&);
void autoscrollTimerFired(Timer<Frame>*);
public:
friend class FrameMac;
friend class FrameWin;
#if PLATFORM(GDK)
friend class FrameGdk;
#endif
RenderObject::NodeInfo nodeInfoAtPoint(const IntPoint&, bool allowShadowContent);
bool hasSelection();
String documentTypeString() const;
void checkEmitLoadEvent();
bool didOpenURL(const KURL&);
virtual void didParse(double) { }
virtual void didLayout(bool, double) {}
virtual void didForcedLayout() {}
virtual void didReceiveDocType() {}
virtual char *windowState() { return 0; }
void setLayoutInterval(double);
double layoutInterval();
void setMaxParseDuration(double);
double maxParseDuration();
virtual void frameDetached();
void updateBaseURLForEmptyDocument();
KURL url() const;
void setResourceRequest(const ResourceRequest& request);
const ResourceRequest& resourceRequest() const;
bool containsPlugins() const;
bool prohibitsScrolling() const;
void setProhibitsScrolling(const bool);
FrameTree* tree() const;
SelectionController& selection() const; SelectionController& dragCaret() const; DOMWindow* domWindow() const;
private:
friend class FramePrivate;
FramePrivate* d;
};
}
#endif