1 /* 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> 3 * 1999-2001 Lars Knoll <knoll@kde.org> 4 * 1999-2001 Antti Koivisto <koivisto@kde.org> 5 * 2000-2001 Simon Hausmann <hausmann@kde.org> 6 * 2000-2001 Dirk Mueller <mueller@kde.org> 7 * 2000 Stefan Schimanski <1Stein@gmx.de> 8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 9 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 10 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 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., 51 Franklin Street, Fifth Floor, 25 * Boston, MA 02110-1301, USA. 26 */ 27 28 #ifndef Frame_h 29 #define Frame_h 30 31 #include "AnimationController.h" 32 #include "DragImage.h" 33 #include "Editor.h" 34 #include "EventHandler.h" 35 #include "FrameLoader.h" 36 #include "FrameTree.h" 37 #include "ScriptController.h" 38 #include "ScrollBehavior.h" 39 #include "SelectionController.h" 40 #include "UserScriptTypes.h" 41 42 #if PLATFORM(WIN) 43 #include "FrameWin.h" 44 #endif 45 46 #if PLATFORM(MAC) 47 #ifndef __OBJC__ 48 class NSArray; 49 class NSDictionary; 50 class NSMutableDictionary; 51 class NSString; 52 typedef int NSWritingDirection; 53 #endif 54 #endif 55 56 #if PLATFORM(WIN) 57 typedef struct HBITMAP__* HBITMAP; 58 #endif 59 60 namespace WebCore { 61 62 class CSSMutableStyleDeclaration; 63 class HTMLTableCellElement; 64 class RegularExpression; 65 66 class Frame : public RefCounted<Frame> { 67 public: create(Page * page,HTMLFrameOwnerElement * ownerElement,FrameLoaderClient * client)68 static PassRefPtr<Frame> create(Page* page, HTMLFrameOwnerElement* ownerElement, FrameLoaderClient* client) 69 { 70 return adoptRef(new Frame(page, ownerElement, client)); 71 } 72 void setView(PassRefPtr<FrameView>); 73 ~Frame(); 74 75 void init(); 76 77 Page* page() const; 78 void detachFromPage(); 79 HTMLFrameOwnerElement* ownerElement() const; 80 81 void pageDestroyed(); 82 void disconnectOwnerElement(); 83 84 Document* document() const; 85 FrameView* view() const; 86 87 void setDOMWindow(DOMWindow*); 88 DOMWindow* domWindow() const; 89 void clearFormerDOMWindow(DOMWindow*); 90 91 Editor* editor() const; 92 EventHandler* eventHandler() const; 93 FrameLoader* loader() const; 94 RedirectScheduler* redirectScheduler() const; 95 SelectionController* selection() const; 96 FrameTree* tree() const; 97 AnimationController* animation() const; 98 ScriptController* script(); 99 100 RenderView* contentRenderer() const; // root renderer for the document contained in this frame 101 RenderPart* ownerRenderer() const; // renderer for the element that contains this frame 102 103 bool isDisconnected() const; 104 void setIsDisconnected(bool); 105 bool excludeFromTextSearch() const; 106 void setExcludeFromTextSearch(bool); 107 108 void createView(const IntSize&, const Color&, bool, const IntSize &, bool, 109 ScrollbarMode = ScrollbarAuto, ScrollbarMode = ScrollbarAuto); 110 111 void injectUserScripts(UserScriptInjectionTime); 112 113 private: 114 void injectUserScriptsForWorld(DOMWrapperWorld*, const UserScriptVector&, UserScriptInjectionTime); 115 116 private: 117 Frame(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*); 118 119 // === undecided, would like to consider moving to another class 120 121 public: 122 static Frame* frameForWidget(const Widget*); 123 124 Settings* settings() const; // can be NULL 125 126 void setPrinting(bool printing, float minPageWidth, float maxPageWidth, bool adjustViewSize); 127 128 bool inViewSourceMode() const; 129 void setInViewSourceMode(bool = true); 130 131 void keepAlive(); // Used to keep the frame alive when running a script that might destroy it. 132 #ifndef NDEBUG 133 static void cancelAllKeepAlive(); 134 #endif 135 136 void setDocument(PassRefPtr<Document>); 137 138 #if ENABLE(ORIENTATION_EVENTS) 139 // Orientation is the interface orientation in degrees. Some examples are: 140 // 0 is straight up; -90 is when the device is rotated 90 clockwise; 141 // 90 is when rotated counter clockwise. 142 void sendOrientationChangeEvent(int orientation); orientation()143 int orientation() const { return m_orientation; } 144 #endif 145 146 void clearTimers(); 147 static void clearTimers(FrameView*, Document*); 148 149 void setNeedsReapplyStyles(); 150 bool needsReapplyStyles() const; 151 void reapplyStyles(); 152 153 String documentTypeString() const; 154 155 // This method -- and the corresponding list of former DOM windows -- 156 // should move onto ScriptController 157 void clearDOMWindow(); 158 displayStringModifiedByEncoding(const String & str)159 String displayStringModifiedByEncoding(const String& str) const 160 { 161 return document() ? document()->displayStringModifiedByEncoding(str) : str; 162 } 163 164 private: 165 void lifeSupportTimerFired(Timer<Frame>*); 166 167 // === to be moved into FrameView 168 169 public: 170 void setZoomFactor(float scale, bool isTextOnly); 171 float zoomFactor() const; 172 bool isZoomFactorTextOnly() const; 173 bool shouldApplyTextZoom() const; 174 bool shouldApplyPageZoom() const; pageZoomFactor()175 float pageZoomFactor() const { return shouldApplyPageZoom() ? zoomFactor() : 1.0f; } textZoomFactor()176 float textZoomFactor() const { return shouldApplyTextZoom() ? zoomFactor() : 1.0f; } 177 178 // === to be moved into Chrome 179 180 public: 181 void focusWindow(); 182 void unfocusWindow(); 183 bool shouldClose(); 184 void scheduleClose(); 185 186 void setJSStatusBarText(const String&); 187 void setJSDefaultStatusBarText(const String&); 188 String jsStatusBarText() const; 189 String jsDefaultStatusBarText() const; 190 191 // === to be moved into Editor 192 193 public: 194 String selectedText() const; 195 bool findString(const String&, bool forward, bool caseFlag, bool wrapFlag, bool startInSelection); 196 197 const VisibleSelection& mark() const; // Mark, to be used as emacs uses it. 198 void setMark(const VisibleSelection&); 199 200 void computeAndSetTypingStyle(CSSStyleDeclaration* , EditAction = EditActionUnspecified); 201 String selectionStartStylePropertyValue(int stylePropertyID) const; 202 void applyEditingStyleToBodyElement() const; 203 void removeEditingStyleFromBodyElement() const; 204 void applyEditingStyleToElement(Element*) const; 205 void removeEditingStyleFromElement(Element*) const; 206 207 IntRect firstRectForRange(Range*) const; 208 209 void respondToChangedSelection(const VisibleSelection& oldSelection, bool closeTyping); 210 bool shouldChangeSelection(const VisibleSelection& oldSelection, const VisibleSelection& newSelection, EAffinity, bool stillSelecting) const; 211 212 RenderStyle* styleForSelectionStart(Node*& nodeToRemove) const; 213 214 unsigned markAllMatchesForText(const String&, bool caseFlag, unsigned limit); 215 bool markedTextMatchesAreHighlighted() const; 216 void setMarkedTextMatchesAreHighlighted(bool flag); 217 218 PassRefPtr<CSSComputedStyleDeclaration> selectionComputedStyle(Node*& nodeToRemove) const; 219 220 void textFieldDidBeginEditing(Element*); 221 void textFieldDidEndEditing(Element*); 222 void textDidChangeInTextField(Element*); 223 bool doTextFieldCommandFromEvent(Element*, KeyboardEvent*); 224 void textWillBeDeletedInTextField(Element* input); 225 void textDidChangeInTextArea(Element*); 226 227 DragImageRef dragImageForSelection(); 228 229 // === to be moved into SelectionController 230 231 public: 232 TextGranularity selectionGranularity() const; 233 void setSelectionGranularity(TextGranularity); 234 235 bool shouldChangeSelection(const VisibleSelection&) const; 236 bool shouldDeleteSelection(const VisibleSelection&) const; 237 void setFocusedNodeIfNeeded(); 238 void notifyRendererOfSelectionChange(bool userTriggered); 239 240 void paintDragCaret(GraphicsContext*, int tx, int ty, const IntRect& clipRect) const; 241 242 bool isContentEditable() const; // if true, everything in frame is editable 243 244 void updateSecureKeyboardEntryIfActive(); 245 246 CSSMutableStyleDeclaration* typingStyle() const; 247 void setTypingStyle(CSSMutableStyleDeclaration*); 248 void clearTypingStyle(); 249 250 FloatRect selectionBounds(bool clipToVisibleContent = true) const; 251 enum SelectionRectRespectTransforms { RespectTransforms = true, IgnoreTransforms = false }; 252 void selectionTextRects(Vector<FloatRect>&, SelectionRectRespectTransforms respectTransforms, bool clipToVisibleContent = true) const; 253 254 HTMLFormElement* currentForm() const; 255 256 void revealSelection(const ScrollAlignment& = ScrollAlignment::alignCenterIfNeeded, bool revealExtent = false); 257 void setSelectionFromNone(); 258 259 void setUseSecureKeyboardEntry(bool); 260 261 SelectionController* dragCaretController() const; 262 263 String searchForLabelsAboveCell(RegularExpression*, HTMLTableCellElement*, size_t* resultDistanceFromStartOfCell); 264 String searchForLabelsBeforeElement(const Vector<String>& labels, Element*, size_t* resultDistance, bool* resultIsInCellAbove); 265 String matchLabelsAgainstElement(const Vector<String>& labels, Element*); 266 267 VisiblePosition visiblePositionForPoint(const IntPoint& framePoint); 268 Document* documentAtPoint(const IntPoint& windowPoint); 269 270 #if PLATFORM(MAC) 271 272 // === undecided, would like to consider moving to another class 273 274 public: 275 NSString* searchForNSLabelsAboveCell(RegularExpression*, HTMLTableCellElement*, size_t* resultDistanceFromStartOfCell); 276 NSString* searchForLabelsBeforeElement(NSArray* labels, Element*, size_t* resultDistance, bool* resultIsInCellAbove); 277 NSString* matchLabelsAgainstElement(NSArray* labels, Element*); 278 279 #if ENABLE(DASHBOARD_SUPPORT) 280 NSMutableDictionary* dashboardRegionsDictionary(); 281 #endif 282 283 NSImage* selectionImage(bool forceBlackText = false) const; 284 NSImage* snapshotDragImage(Node*, NSRect* imageRect, NSRect* elementRect) const; 285 NSImage* nodeImage(Node*) const; 286 287 private: 288 NSImage* imageFromRect(NSRect) const; 289 290 // === to be moved into Editor 291 292 public: 293 NSDictionary* fontAttributesForSelectionStart() const; 294 NSWritingDirection baseWritingDirectionForSelectionStart() const; 295 296 #endif 297 298 #if PLATFORM(WIN) 299 300 public: 301 // FIXME - We should have a single version of nodeImage instead of using platform types. 302 HBITMAP nodeImage(Node*) const; 303 304 #endif 305 306 private: 307 Page* m_page; 308 mutable FrameTree m_treeNode; 309 mutable FrameLoader m_loader; 310 mutable RedirectScheduler m_redirectScheduler; 311 312 mutable RefPtr<DOMWindow> m_domWindow; 313 HashSet<DOMWindow*> m_liveFormerWindows; 314 315 HTMLFrameOwnerElement* m_ownerElement; 316 RefPtr<FrameView> m_view; 317 RefPtr<Document> m_doc; 318 319 ScriptController m_script; 320 321 String m_kjsStatusBarText; 322 String m_kjsDefaultStatusBarText; 323 324 float m_zoomFactor; 325 326 TextGranularity m_selectionGranularity; 327 328 mutable SelectionController m_selectionController; 329 mutable VisibleSelection m_mark; 330 mutable Editor m_editor; 331 mutable EventHandler m_eventHandler; 332 mutable AnimationController m_animationController; 333 334 RefPtr<CSSMutableStyleDeclaration> m_typingStyle; 335 336 Timer<Frame> m_lifeSupportTimer; 337 338 #if ENABLE(ORIENTATION_EVENTS) 339 int m_orientation; 340 #endif 341 342 bool m_highlightTextMatches; 343 bool m_inViewSourceMode; 344 bool m_needsReapplyStyles; 345 bool m_isDisconnected; 346 bool m_excludeFromTextSearch; 347 }; 348 349 } // namespace WebCore 350 351 #endif // Frame_h 352