/* * Copyright (C) 1998, 1999 Torben Weis * 1999-2001 Lars Knoll * 1999-2001 Antti Koivisto * 2000-2001 Simon Hausmann * 2000-2001 Dirk Mueller * 2000 Stefan Schimanski <1Stein@gmx.de> * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) * Copyright (C) 2008 Eric Seidel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef Frame_h #define Frame_h #include "AdjustViewSizeOrNot.h" #include "DragImage.h" #include "FrameLoader.h" #include "FrameTree.h" #include "IntRect.h" #include "NavigationScheduler.h" #include "ScrollTypes.h" #include "UserScriptTypes.h" #include #if PLATFORM(WIN) #include "FrameWin.h" #endif #if USE(TILED_BACKING_STORE) #include "TiledBackingStoreClient.h" #endif #if PLATFORM(WIN) typedef struct HBITMAP__* HBITMAP; #endif namespace WebCore { class AnimationController; class Color; class Document; class Editor; class Element; class EventHandler; class FrameDestructionObserver; class FrameSelection; class FrameView; class HTMLTableCellElement; class IntRect; class Node; class RegularExpression; class RenderPart; class RenderView; class ScriptController; class Settings; class TiledBackingStore; class TreeScope; class VisiblePosition; #if !USE(TILED_BACKING_STORE) class TiledBackingStoreClient { }; #endif enum { LayerTreeFlagsIncludeDebugInfo = 1 << 0, LayerTreeFlagsIncludeVisibleRects = 1 << 1, LayerTreeFlagsIncludeTileCaches = 1 << 2, LayerTreeFlagsIncludeRepaintRects = 1 << 3, LayerTreeFlagsIncludePaintingPhases = 1 << 4 }; typedef unsigned LayerTreeFlags; class Frame : public RefCounted, public TiledBackingStoreClient { public: static PassRefPtr create(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*); void init(); void setView(PassRefPtr); void createView(const IntSize&, const Color&, bool, const IntSize& fixedLayoutSize = IntSize(), const IntRect& fixedVisibleContentRect = IntRect(), bool useFixedLayout = false, ScrollbarMode = ScrollbarAuto, bool horizontalLock = false, ScrollbarMode = ScrollbarAuto, bool verticalLock = false); ~Frame(); void addDestructionObserver(FrameDestructionObserver*); void removeDestructionObserver(FrameDestructionObserver*); void willDetachPage(); void detachFromPage(); void disconnectOwnerElement(); Page* page() const; HTMLFrameOwnerElement* ownerElement() const; Document* document() const; FrameView* view() const; Editor& editor() const; EventHandler* eventHandler() const; FrameLoader* loader() const; NavigationScheduler* navigationScheduler() const; FrameSelection* selection() const; FrameTree* tree() const; AnimationController* animation() const; ScriptController* script(); RenderView* contentRenderer() const; // Root of the render tree for the document contained in this frame. RenderPart* ownerRenderer() const; // Renderer for the element that contains this frame. #if ENABLE(PAGE_VISIBILITY_API) void dispatchVisibilityStateChangeEvent(); #endif // ======== All public functions below this point are candidates to move out of Frame into another class. ======== bool inScope(TreeScope*) const; void injectUserScripts(UserScriptInjectionTime); String layerTreeAsText(LayerTreeFlags = 0) const; String trackedRepaintRectsAsText() const; static Frame* frameForWidget(const Widget*); Settings* settings() const; // can be NULL void setPrinting(bool printing, const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkRatio, AdjustViewSizeOrNot); bool shouldUsePrintingLayout() const; FloatSize resizePageRectsKeepingRatio(const FloatSize& originalSize, const FloatSize& expectedSize); bool inViewSourceMode() const; void setInViewSourceMode(bool = true); void setDocument(PassRefPtr); void setPageZoomFactor(float factor); float pageZoomFactor() const { return m_pageZoomFactor; } void setTextZoomFactor(float factor); float textZoomFactor() const { return m_textZoomFactor; } void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor); // Scale factor of this frame with respect to the container. float frameScaleFactor() const; #if USE(ACCELERATED_COMPOSITING) void deviceOrPageScaleFactorChanged(); #endif #if ENABLE(ORIENTATION_EVENTS) // Orientation is the interface orientation in degrees. Some examples are: // 0 is straight up; -90 is when the device is rotated 90 clockwise; // 90 is when rotated counter clockwise. void sendOrientationChangeEvent(int orientation); int orientation() const { return m_orientation; } #endif void clearTimers(); static void clearTimers(FrameView*, Document*); String documentTypeString() const; String displayStringModifiedByEncoding(const String&) const; DragImageRef nodeImage(Node*); DragImageRef dragImageForSelection(); VisiblePosition visiblePositionForPoint(const IntPoint& framePoint); Document* documentAtPoint(const IntPoint& windowPoint); PassRefPtr rangeForPoint(const IntPoint& framePoint); String searchForLabelsAboveCell(RegularExpression*, HTMLTableCellElement*, size_t* resultDistanceFromStartOfCell); String searchForLabelsBeforeElement(const Vector& labels, Element*, size_t* resultDistance, bool* resultIsInCellAbove); String matchLabelsAgainstElement(const Vector& labels, Element*); void suspendActiveDOMObjectsAndAnimations(); void resumeActiveDOMObjectsAndAnimations(); bool activeDOMObjectsAndAnimationsSuspended() const { return m_activeDOMObjectsAndAnimationsSuspendedCount > 0; } // Should only be called on the main frame of a page. void notifyChromeClientWheelEventHandlerCountChanged() const; bool isURLAllowed(const KURL&) const; // ======== private: Frame(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*); void injectUserScriptsForWorld(DOMWrapperWorld*, const UserScriptVector&, UserScriptInjectionTime); HashSet m_destructionObservers; Page* m_page; mutable FrameTree m_treeNode; mutable FrameLoader m_loader; mutable NavigationScheduler m_navigationScheduler; HTMLFrameOwnerElement* m_ownerElement; RefPtr m_view; RefPtr m_doc; OwnPtr m_script; const OwnPtr m_editor; OwnPtr m_selection; OwnPtr m_eventHandler; OwnPtr m_animationController; float m_pageZoomFactor; float m_textZoomFactor; #if ENABLE(ORIENTATION_EVENTS) int m_orientation; #endif bool m_inViewSourceMode; #if USE(TILED_BACKING_STORE) // FIXME: The tiled backing store belongs in FrameView, not Frame. public: TiledBackingStore* tiledBackingStore() const { return m_tiledBackingStore.get(); } void setTiledBackingStoreEnabled(bool); private: // TiledBackingStoreClient interface virtual void tiledBackingStorePaintBegin(); virtual void tiledBackingStorePaint(GraphicsContext*, const IntRect&); virtual void tiledBackingStorePaintEnd(const Vector& paintedArea); virtual IntRect tiledBackingStoreContentsRect(); virtual IntRect tiledBackingStoreVisibleRect(); virtual Color tiledBackingStoreBackgroundColor() const; OwnPtr m_tiledBackingStore; #endif int m_activeDOMObjectsAndAnimationsSuspendedCount; }; inline void Frame::init() { m_loader.init(); } inline FrameLoader* Frame::loader() const { return &m_loader; } inline NavigationScheduler* Frame::navigationScheduler() const { return &m_navigationScheduler; } inline FrameView* Frame::view() const { return m_view.get(); } inline ScriptController* Frame::script() { return m_script.get(); } inline Document* Frame::document() const { return m_doc.get(); } inline FrameSelection* Frame::selection() const { return m_selection.get(); } inline Editor& Frame::editor() const { return *m_editor; } inline AnimationController* Frame::animation() const { return m_animationController.get(); } inline HTMLFrameOwnerElement* Frame::ownerElement() const { return m_ownerElement; } inline bool Frame::inViewSourceMode() const { return m_inViewSourceMode; } inline void Frame::setInViewSourceMode(bool mode) { m_inViewSourceMode = mode; } inline FrameTree* Frame::tree() const { return &m_treeNode; } inline Page* Frame::page() const { return m_page; } inline void Frame::detachFromPage() { m_page = 0; } inline EventHandler* Frame::eventHandler() const { return m_eventHandler.get(); } } // namespace WebCore #endif // Frame_h