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