| /* |
| * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> |
| * 1999-2001 Lars Knoll <knoll@kde.org> |
| * 1999-2001 Antti Koivisto <koivisto@kde.org> |
| * 2000-2001 Simon Hausmann <hausmann@kde.org> |
| * 2000-2001 Dirk Mueller <mueller@kde.org> |
| * 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 <eric@webkit.org> |
| * |
| * 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 LocalFrame_h |
| #define LocalFrame_h |
| |
| #include "core/CoreExport.h" |
| #include "core/dom/WeakIdentifierMap.h" |
| #include "core/frame/Frame.h" |
| #include "core/frame/LocalFrameLifecycleNotifier.h" |
| #include "core/frame/LocalFrameLifecycleObserver.h" |
| #include "core/loader/FrameLoader.h" |
| #include "core/page/FrameTree.h" |
| #include "core/paint/PaintPhase.h" |
| #include "platform/Supplementable.h" |
| #include "platform/graphics/ImageOrientation.h" |
| #include "platform/graphics/paint/DisplayItem.h" |
| #include "platform/heap/Handle.h" |
| #include "platform/scroll/ScrollTypes.h" |
| #include "wtf/HashSet.h" |
| |
| namespace blink { |
| |
| class Color; |
| class Document; |
| class DragImage; |
| class Editor; |
| template <typename Traversal> class EditingAlgorithm; |
| class Element; |
| template <typename Strategy> class EphemeralRangeTemplate; |
| class EventHandler; |
| class FloatSize; |
| class FrameConsole; |
| class FrameSelection; |
| class FrameView; |
| class HTMLPlugInElement; |
| class InputMethodController; |
| class IntPoint; |
| class IntSize; |
| class InstrumentingAgents; |
| class LocalDOMWindow; |
| class NavigationScheduler; |
| class Node; |
| class NodeTraversal; |
| class Range; |
| class LayoutView; |
| class TreeScope; |
| class ScriptController; |
| class SpellChecker; |
| class TreeScope; |
| class WebFrameHostScheduler; |
| class WebFrameScheduler; |
| template <typename Strategy> class PositionWithAffinityTemplate; |
| |
| class CORE_EXPORT LocalFrame : public Frame, public LocalFrameLifecycleNotifier, public WillBeHeapSupplementable<LocalFrame>, public DisplayItemClient { |
| WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(LocalFrame); |
| public: |
| static PassRefPtrWillBeRawPtr<LocalFrame> create(FrameLoaderClient*, FrameHost*, FrameOwner*); |
| |
| void init(); |
| void setView(PassRefPtrWillBeRawPtr<FrameView>); |
| void createView(const IntSize&, const Color&, bool, |
| ScrollbarMode = ScrollbarAuto, bool horizontalLock = false, |
| ScrollbarMode = ScrollbarAuto, bool verticalLock = false); |
| |
| // Frame overrides: |
| ~LocalFrame() override; |
| DECLARE_VIRTUAL_TRACE(); |
| bool isLocalFrame() const override { return true; } |
| DOMWindow* domWindow() const override; |
| WindowProxy* windowProxy(DOMWrapperWorld&) override; |
| void navigate(Document& originDocument, const KURL&, bool replaceCurrentItem, UserGestureStatus) override; |
| void navigate(const FrameLoadRequest&) override; |
| void reload(FrameLoadType, ClientRedirectPolicy) override; |
| void detach(FrameDetachType) override; |
| void disconnectOwnerElement() override; |
| bool shouldClose() override; |
| SecurityContext* securityContext() const override; |
| void printNavigationErrorMessage(const Frame&, const char* reason) override; |
| bool prepareForCommit() override; |
| |
| void willDetachFrameHost(); |
| |
| LocalDOMWindow* localDOMWindow() const; |
| void setDOMWindow(PassRefPtrWillBeRawPtr<LocalDOMWindow>); |
| FrameView* view() const; |
| Document* document() const; |
| void setPagePopupOwner(Element&); |
| Element* pagePopupOwner() const { return m_pagePopupOwner.get(); } |
| |
| LayoutView* contentLayoutObject() const; // Root of the layout tree for the document contained in this frame. |
| |
| Editor& editor() const; |
| EventHandler& eventHandler() const; |
| FrameLoader& loader() const; |
| NavigationScheduler& navigationScheduler() const; |
| FrameSelection& selection() const; |
| InputMethodController& inputMethodController() const; |
| ScriptController& script() const; |
| SpellChecker& spellChecker() const; |
| FrameConsole& console() const; |
| |
| void didChangeVisibilityState(); |
| |
| // This method is used to get the highest level LocalFrame in this |
| // frame's in-process subtree. |
| // FIXME: This is a temporary hack to support RemoteFrames, and callers |
| // should be updated to avoid storing things on the main frame. |
| LocalFrame* localFrameRoot(); |
| |
| InstrumentingAgents* instrumentingAgents() const { return m_instrumentingAgents.get(); } |
| |
| // ======== All public functions below this point are candidates to move out of LocalFrame into another class. ======== |
| |
| // See GraphicsLayerClient.h for accepted flags. |
| String layerTreeAsText(unsigned flags = 0) const; |
| |
| void setPrinting(bool printing, const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkRatio); |
| bool shouldUsePrintingLayout() const; |
| FloatSize resizePageRectsKeepingRatio(const FloatSize& originalSize, const FloatSize& expectedSize); |
| |
| bool inViewSourceMode() const; |
| void setInViewSourceMode(bool = true); |
| |
| void setPageZoomFactor(float); |
| float pageZoomFactor() const { return m_pageZoomFactor; } |
| void setTextZoomFactor(float); |
| float textZoomFactor() const { return m_textZoomFactor; } |
| void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor); |
| |
| void deviceScaleFactorChanged(); |
| double devicePixelRatio() const; |
| |
| PassOwnPtr<DragImage> nodeImage(Node&); |
| PassOwnPtr<DragImage> dragImageForSelection(float opacity); |
| |
| String selectedText() const; |
| String selectedTextForClipboard() const; |
| |
| PositionWithAffinityTemplate<EditingAlgorithm<NodeTraversal>> positionForPoint(const IntPoint& framePoint); |
| Document* documentAtPoint(const IntPoint&); |
| EphemeralRangeTemplate<EditingAlgorithm<NodeTraversal>> rangeForPoint(const IntPoint& framePoint); |
| |
| bool isURLAllowed(const KURL&) const; |
| bool shouldReuseDefaultView(const KURL&) const; |
| void removeSpellingMarkersUnderWords(const Vector<String>& words); |
| |
| // FIXME: once scroll customization is enabled everywhere |
| // (crbug.com/416862), this should take a ScrollState object. |
| ScrollResult applyScrollDelta(ScrollGranularity, const FloatSize& delta, bool isScrollBegin); |
| bool shouldScrollTopControls(const FloatSize& delta) const; |
| |
| // DisplayItemClient methods |
| String debugName() const final { return "LocalFrame"; } |
| // TODO(chrishtr): fix this. |
| LayoutRect visualRect() const override { return LayoutRect(); } |
| |
| bool shouldThrottleRendering() const; |
| |
| // Returns the frame scheduler, creating one if needed. |
| WebFrameScheduler* frameScheduler(); |
| void scheduleVisualUpdateUnlessThrottled(); |
| |
| void updateSecurityOrigin(SecurityOrigin*); |
| |
| bool isNavigationAllowed() const { return m_navigationDisableCount == 0; } |
| |
| private: |
| friend class FrameNavigationDisabler; |
| |
| LocalFrame(FrameLoaderClient*, FrameHost*, FrameOwner*); |
| |
| // Internal Frame helper overrides: |
| WindowProxyManager* windowProxyManager() const override; |
| |
| String localLayerTreeAsText(unsigned flags) const; |
| |
| // Paints the area for the given rect into a DragImage. |
| // The rect is in the coordinate space of the frame. |
| PassOwnPtr<DragImage> paintIntoDragImage(const GlobalPaintFlags, |
| IntRect paintingRect, Node* draggedNode = nullptr, float opacity = 1); |
| |
| void enableNavigation() { --m_navigationDisableCount; } |
| void disableNavigation() { ++m_navigationDisableCount; } |
| |
| mutable FrameLoader m_loader; |
| OwnPtrWillBeMember<NavigationScheduler> m_navigationScheduler; |
| |
| RefPtrWillBeMember<FrameView> m_view; |
| RefPtrWillBeMember<LocalDOMWindow> m_domWindow; |
| // Usually 0. Non-null if this is the top frame of PagePopup. |
| RefPtrWillBeMember<Element> m_pagePopupOwner; |
| |
| const OwnPtrWillBeMember<ScriptController> m_script; |
| const OwnPtrWillBeMember<Editor> m_editor; |
| const OwnPtrWillBeMember<SpellChecker> m_spellChecker; |
| const OwnPtrWillBeMember<FrameSelection> m_selection; |
| const OwnPtrWillBeMember<EventHandler> m_eventHandler; |
| const OwnPtrWillBeMember<FrameConsole> m_console; |
| const OwnPtrWillBeMember<InputMethodController> m_inputMethodController; |
| OwnPtr<WebFrameScheduler> m_frameScheduler; |
| |
| int m_navigationDisableCount; |
| |
| float m_pageZoomFactor; |
| float m_textZoomFactor; |
| |
| bool m_inViewSourceMode; |
| |
| RefPtrWillBeMember<InstrumentingAgents> m_instrumentingAgents; |
| }; |
| |
| inline void LocalFrame::init() |
| { |
| m_loader.init(); |
| } |
| |
| inline LocalDOMWindow* LocalFrame::localDOMWindow() const |
| { |
| return m_domWindow.get(); |
| } |
| |
| inline FrameLoader& LocalFrame::loader() const |
| { |
| return m_loader; |
| } |
| |
| inline NavigationScheduler& LocalFrame::navigationScheduler() const |
| { |
| ASSERT(m_navigationScheduler); |
| return *m_navigationScheduler.get(); |
| } |
| |
| inline FrameView* LocalFrame::view() const |
| { |
| return m_view.get(); |
| } |
| |
| inline ScriptController& LocalFrame::script() const |
| { |
| return *m_script; |
| } |
| |
| inline FrameSelection& LocalFrame::selection() const |
| { |
| return *m_selection; |
| } |
| |
| inline Editor& LocalFrame::editor() const |
| { |
| return *m_editor; |
| } |
| |
| inline SpellChecker& LocalFrame::spellChecker() const |
| { |
| return *m_spellChecker; |
| } |
| |
| inline FrameConsole& LocalFrame::console() const |
| { |
| return *m_console; |
| } |
| |
| inline InputMethodController& LocalFrame::inputMethodController() const |
| { |
| return *m_inputMethodController; |
| } |
| |
| inline bool LocalFrame::inViewSourceMode() const |
| { |
| return m_inViewSourceMode; |
| } |
| |
| inline void LocalFrame::setInViewSourceMode(bool mode) |
| { |
| m_inViewSourceMode = mode; |
| } |
| |
| inline EventHandler& LocalFrame::eventHandler() const |
| { |
| ASSERT(m_eventHandler); |
| return *m_eventHandler; |
| } |
| |
| DEFINE_TYPE_CASTS(LocalFrame, Frame, localFrame, localFrame->isLocalFrame(), localFrame.isLocalFrame()); |
| |
| DECLARE_WEAK_IDENTIFIER_MAP(LocalFrame); |
| |
| class FrameNavigationDisabler { |
| WTF_MAKE_NONCOPYABLE(FrameNavigationDisabler); |
| STACK_ALLOCATED(); |
| public: |
| explicit FrameNavigationDisabler(LocalFrame&); |
| ~FrameNavigationDisabler(); |
| |
| private: |
| RawPtrWillBeMember<LocalFrame> m_frame; |
| }; |
| |
| } // namespace blink |
| |
| #endif // LocalFrame_h |