15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef FrameSelection_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define FrameSelection_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Range.h"
3023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch#include "core/editing/Caret.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/EditingStyle.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/VisibleSelection.h"
3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/rendering/ScrollAlignment.h"
341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Timer.h"
351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntRect.h"
361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/LayoutRect.h"
37f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "platform/heap/Handle.h"
38e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Noncopyable.h"
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CharacterData;
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class LocalFrame;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class GraphicsContext;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLFormElement;
4693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)class MutableStylePropertySet;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderObject;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderView;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Settings;
508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)class Text;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VisiblePosition;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum EUserTriggered { NotUserTriggered = 0, UserTriggered = 1 };
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum RevealExtentOption {
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RevealExtent,
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DoNotRevealExtent
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)class FrameSelection FINAL : public NoBaseWillBeGarbageCollectedFinalized<FrameSelection>, public VisibleSelection::ChangeObserver, private CaretBase {
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(FrameSelection);
62f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
63f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(FrameSelection);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
65f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    static PassOwnPtrWillBeRawPtr<FrameSelection> create(LocalFrame* frame = 0)
66f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
67f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return adoptPtrWillBeNoop(new FrameSelection(frame));
68f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    }
69f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    virtual ~FrameSelection();
70f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum EAlteration { AlterationMove, AlterationExtend };
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum CursorAlignOnScroll { AlignCursorOnScrollIfNeeded,
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                               AlignCursorOnScrollAlways };
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum SetSelectionOption {
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // 1 << 0 is reserved for EUserTriggered
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CloseTyping = 1 << 1,
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ClearTypingStyle = 1 << 2,
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SpellCorrectionTriggered = 1 << 3,
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DoNotSetFocus = 1 << 4,
80e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        DoNotUpdateAppearance = 1 << 5,
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef unsigned SetSelectionOptions; // Union of values in SetSelectionOption and EUserTriggered
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static inline EUserTriggered selectionOptionsToUserTriggered(SetSelectionOptions options)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return static_cast<EUserTriggered>(options & UserTriggered);
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    enum DirectoinalOption {
895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        NonDirectional,
905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        Directional
915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    };
925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* rootEditableElement() const { return m_selection.rootEditableElement(); }
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* rootEditableElementOrDocumentElement() const;
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Node* rootEditableElementOrTreeScopeRootNode() const;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool rendererIsEditable() const { return m_selection.rendererIsEditable(); }
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isContentEditable() const { return m_selection.isContentEditable(); }
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isContentRichlyEditable() const { return m_selection.isContentRichlyEditable(); }
10002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void moveTo(const VisiblePosition&, EUserTriggered = NotUserTriggered, CursorAlignOnScroll = AlignCursorOnScrollIfNeeded);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void moveTo(const VisiblePosition&, const VisiblePosition&, EUserTriggered = NotUserTriggered);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void moveTo(const Position&, EAffinity, EUserTriggered = NotUserTriggered);
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const VisibleSelection& selection() const { return m_selection; }
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSelection(const VisibleSelection&, SetSelectionOptions = CloseTyping | ClearTypingStyle, CursorAlignOnScroll = AlignCursorOnScrollIfNeeded, TextGranularity = CharacterGranularity);
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSelection(const VisibleSelection& selection, TextGranularity granularity) { setSelection(selection, CloseTyping | ClearTypingStyle, AlignCursorOnScrollIfNeeded, granularity); }
1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool setSelectedRange(Range*, EAffinity, DirectoinalOption directional = NonDirectional, SetSelectionOptions = CloseTyping | ClearTypingStyle);
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void selectAll();
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clear();
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void prepareForDestruction();
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Call this after doing user-triggered selections to make it easy to delete the frame you entirely selected.
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void selectFrameElementInParentIfFullySelected();
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool contains(const LayoutPoint&);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    SelectionType selectionType() const { return m_selection.selectionType(); }
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EAffinity affinity() const { return m_selection.affinity(); }
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool modify(EAlteration, SelectionDirection, TextGranularity, EUserTriggered = NotUserTriggered);
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum VerticalDirection { DirectionUp, DirectionDown };
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool modify(EAlteration, unsigned verticalDistance, VerticalDirection, EUserTriggered = NotUserTriggered, CursorAlignOnScroll = AlignCursorOnScrollIfNeeded);
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextGranularity granularity() const { return m_granularity; }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStart(const VisiblePosition &, EUserTriggered = NotUserTriggered);
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setEnd(const VisiblePosition &, EUserTriggered = NotUserTriggered);
13002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setBase(const VisiblePosition&, EUserTriggered = NotUserTriggered);
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setExtent(const VisiblePosition&, EUserTriggered = NotUserTriggered);
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Position base() const { return m_selection.base(); }
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Position extent() const { return m_selection.extent(); }
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Position start() const { return m_selection.start(); }
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Position end() const { return m_selection.end(); }
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Return the renderer that is responsible for painting the caret (in the selection start node)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* caretRenderer() const;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Caret rect local to the caret's renderer
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect localCaretRect();
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Bounds of (possibly transformed) caret in absolute coords
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect absoluteCaretBounds();
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setCaretRectNeedsUpdate() { CaretBase::setCaretRectNeedsUpdate(); }
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
149591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void didChangeFocus();
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void willBeModified(EAlteration, SelectionDirection);
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isNone() const { return m_selection.isNone(); }
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCaret() const { return m_selection.isCaret(); }
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isRange() const { return m_selection.isRange(); }
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCaretOrRange() const { return m_selection.isCaretOrRange(); }
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isInPasswordField() const;
1575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool isDirectional() const { return m_selection.isDirectional(); }
15802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // If this FrameSelection has a logical range which is still valid, this function return its clone. Otherwise,
160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // the return value from underlying VisibleSelection's firstRange() is returned.
161a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<Range> firstRange() const;
162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
163a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<Range> toNormalizedRange() const { return m_selection.toNormalizedRange(); }
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    void nodeWillBeRemoved(Node&);
1669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    void didUpdateCharacterData(CharacterData*, unsigned offset, unsigned oldLength, unsigned newLength);
16706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    void didMergeTextNodes(const Text& oldNode, unsigned offset);
1689bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    void didSplitTextNode(const Text& oldNode);
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setCaretVisible(bool caretIsVisible) { setCaretVisibility(caretIsVisible ? Visible : Hidden); }
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool recomputeCaretRect();
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void invalidateCaretRect();
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void paintCaret(GraphicsContext*, const LayoutPoint&, const LayoutRect& clipRect);
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Used to suspend caret blinking while the mouse is down.
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setCaretBlinkingSuspended(bool suspended) { m_isCaretBlinkingSuspended = suspended; }
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCaretBlinkingSuspended() const { return m_isCaretBlinkingSuspended; }
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Focus
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setFocused(bool);
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isFocused() const { return m_focused; }
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isFocusedAndActive() const;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void pageActivationChanged();
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Painting.
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updateAppearance();
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updateSecureKeyboardEntryIfActive();
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void formatForDebugger(char* buffer, unsigned length) const;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void showTreeForThis() const;
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum EndPointsAdjustmentMode { AdjustEndpointsAtBidiBoundary, DoNotAdjsutEndpoints };
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setNonDirectionalSelectionIfNeeded(const VisibleSelection&, TextGranularity, EndPointsAdjustmentMode = DoNotAdjsutEndpoints);
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setFocusedNodeIfNeeded();
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void notifyRendererOfSelectionChange(EUserTriggered);
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EditingStyle* typingStyle() const;
201f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    void setTypingStyle(PassRefPtrWillBeRawPtr<EditingStyle>);
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearTypingStyle();
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2043c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    String selectedText() const;
2053c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    String selectedTextForClipboard() const;
2063c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect bounds(bool clipToVisibleContent = true) const;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLFormElement* currentForm() const;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void revealSelection(const ScrollAlignment& = ScrollAlignment::alignCenterIfNeeded, RevealExtentOption = DoNotRevealExtent);
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSelectionFromNone();
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
214591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void setShouldShowBlockCursor(bool);
215591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // VisibleSelection::ChangeObserver interface.
217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual void didChangeVisibleSelection() OVERRIDE;
218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
219f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
220f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
222f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    explicit FrameSelection(LocalFrame*);
223f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum EPositionType { START, END, BASE, EXTENT };
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    void respondToNodeModification(Node&, bool baseRemoved, bool extentRemoved, bool startRemoved, bool endRemoved);
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextDirection directionOfEnclosingBlock();
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextDirection directionOfSelection();
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition positionForPlatform(bool isGetStart) const;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition startForPlatform() const;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition endForPlatform() const;
23393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    VisiblePosition nextWordPositionForPlatform(const VisiblePosition&);
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition modifyExtendingRight(TextGranularity);
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition modifyExtendingForward(TextGranularity);
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition modifyMovingRight(TextGranularity);
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition modifyMovingForward(TextGranularity);
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition modifyExtendingLeft(TextGranularity);
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition modifyExtendingBackward(TextGranularity);
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition modifyMovingLeft(TextGranularity);
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition modifyMovingBackward(TextGranularity);
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit lineDirectionPointForBlockDirectionNavigation(EPositionType);
24502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void notifyAccessibilityForSelectionChange();
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void focusedOrActiveStateChanged();
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void caretBlinkTimerFired(Timer<FrameSelection>*);
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setUseSecureKeyboardEntry(bool);
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setCaretVisibility(CaretVisibility);
255591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    bool shouldBlinkCaret() const;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool dispatchSelectStart();
25802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    void updateSelectionIfNeeded(const Position& base, const Position& extent, const Position& start, const Position& end);
2608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
261d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void startObservingVisibleSelectionChange();
262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void stopObservingVisibleSelectionChangeIfNecessary();
263d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
26437fa872c637fc1cb688924f3a9f8071921d93f63Bo Liu    VisibleSelection validateSelection(const VisibleSelection&);
26537fa872c637fc1cb688924f3a9f8071921d93f63Bo Liu
266d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* m_frame;
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit m_xPosForVerticalArrowNavigation;
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisibleSelection m_selection;
271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool m_observingVisibleSelection;
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition m_originalBase; // Used to store base before the adjustment at bidi boundary
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextGranularity m_granularity;
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // The range specified by the user, which may not be visually canonicalized (hence "logical").
276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // This will be invalidated if the underlying VisibleSelection changes. If that happens, this variable will
277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // become null, in which case logical positions == visible positions.
278f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RefPtrWillBeMember<Range> m_logicalRange;
279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
280f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RefPtrWillBeMember<Node> m_previousCaretNode; // The last node which painted the caret. Retained for clearing the old caret when it moves.
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
282f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RefPtrWillBeMember<EditingStyle> m_typingStyle;
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer<FrameSelection> m_caretBlinkTimer;
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The painted bounds of the caret in absolute coordinates
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect m_absCaretBounds;
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_absCaretBoundsDirty : 1;
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_caretPaint : 1;
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_isCaretBlinkingSuspended : 1;
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_focused : 1;
291591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    bool m_shouldShowBlockCursor : 1;
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline EditingStyle* FrameSelection::typingStyle() const
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_typingStyle.get();
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void FrameSelection::clearTypingStyle()
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_typingStyle.clear();
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
304f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)inline void FrameSelection::setTypingStyle(PassRefPtrWillBeRawPtr<EditingStyle> style)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_typingStyle = style;
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Outside the WebCore namespace for ease of invocation from gdb.
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showTree(const WebCore::FrameSelection&);
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showTree(const WebCore::FrameSelection*);
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // FrameSelection_h
317