15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007, 2008 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 Editor_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define Editor_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/clipboard/DataTransferAccessPolicy.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarker.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/EditAction.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/EditingBehavior.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FindOptions.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/TextIterator.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/VisibleSelection.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/WritingDirection.h"
381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameDestructionObserver.h"
391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PasteMode.h"
40a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "platform/heap/Handle.h"
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CompositeEditCommand;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class EditCommandComposition;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class EditorClient;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class EditorInternalCommand;
48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class LocalFrame;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HitTestResult;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class KillRing;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Pasteboard;
521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)class SpellChecker;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StylePropertySet;
549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)class TextEvent;
5551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class UndoStack;
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum EditorCommandSource { CommandFromMenuOrKeyBinding, CommandFromDOM, CommandFromDOMWithUserInterface };
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum EditorParagraphSeparator { EditorParagraphSeparatorIsDiv, EditorParagraphSeparatorIsP };
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)class Editor FINAL : public NoBaseWillBeGarbageCollectedFinalized<Editor> {
611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    WTF_MAKE_NONCOPYABLE(Editor);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
63f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    static PassOwnPtrWillBeRawPtr<Editor> create(LocalFrame&);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~Editor();
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
66e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    EditorClient& client() const;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CompositeEditCommand* lastEditCommand() { return m_lastEditCommand.get(); }
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void handleKeyboardEvent(KeyboardEvent*);
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool handleTextEvent(TextEvent*);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canEdit() const;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canEditRichly() const;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canDHTMLCut();
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canDHTMLCopy();
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canDHTMLPaste();
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canCut() const;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canCopy() const;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canPaste() const;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canDelete() const;
8451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool canSmartCopyOrDelete() const;
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void cut();
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void copy();
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void paste();
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void pasteAsPlainText();
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void performDelete();
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    static void countEvent(ExecutionContext*, const Event*);
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void copyImage(const HitTestResult&);
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void transpose();
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool shouldDeleteRange(Range*) const;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void respondToChangedContents(const VisibleSelection& endingSelection);
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool selectionStartHasStyle(CSSPropertyID, const String& value) const;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TriState selectionHasStyle(CSSPropertyID, const String& value) const;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String selectionStartCSSPropertyValue(CSSPropertyID);
10402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeFormattingAndStyle();
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearLastEditCommand();
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool deleteWithDirection(SelectionDirection, TextGranularity, bool killRing, bool isTypingAction);
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void deleteSelectionWithSmartDelete(bool smartDelete);
11102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void applyStyle(StylePropertySet*, EditAction = EditActionUnspecified);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void applyParagraphStyle(StylePropertySet*, EditAction = EditActionUnspecified);
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void applyStyleToSelection(StylePropertySet*, EditAction);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void applyParagraphStyleToSelection(StylePropertySet*, EditAction);
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
117f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    void appliedEditing(PassRefPtrWillBeRawPtr<CompositeEditCommand>);
118f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    void unappliedEditing(PassRefPtrWillBeRawPtr<EditCommandComposition>);
119f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    void reappliedEditing(PassRefPtrWillBeRawPtr<EditCommandComposition>);
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setShouldStyleWithCSS(bool flag) { m_shouldStyleWithCSS = flag; }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool shouldStyleWithCSS() const { return m_shouldStyleWithCSS; }
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    class Command {
1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        STACK_ALLOCATED();
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Command();
1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        Command(const EditorInternalCommand*, EditorCommandSource, PassRefPtrWillBeRawPtr<LocalFrame>);
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool execute(const String& parameter = String(), Event* triggeringEvent = 0) const;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool execute(Event* triggeringEvent) const;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool isSupported() const;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool isEnabled(Event* triggeringEvent = 0) const;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TriState state(Event* triggeringEvent = 0) const;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String value(Event* triggeringEvent = 0) const;
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool isTextInsertion() const;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        // Returns 0 if this Command is not supported.
14210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        int idForHistogram() const;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        LocalFrame& frame() const
1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        {
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            ASSERT(m_frame);
1477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return *m_frame;
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const EditorInternalCommand* m_command;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        EditorCommandSource m_source;
1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        RefPtrWillBeMember<LocalFrame> m_frame;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Command command(const String& commandName); // Command source is CommandFromMenuOrKeyBinding.
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Command command(const String& commandName, EditorCommandSource);
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
157197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // |Editor::executeCommand| is implementation of |WebFrame::executeCommand|
158197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // rather than |Document::execCommand|.
159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool executeCommand(const String&);
160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool executeCommand(const String& commandName, const String& value);
161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    bool insertText(const String&, KeyboardEvent* triggeringEvent);
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool insertTextWithoutSendingTextEvent(const String&, bool selectInsertedText, TextEvent* triggeringEvent);
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool insertLineBreak();
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool insertParagraphSeparator();
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool isOverwriteModeEnabled() const { return m_overwriteModeEnabled; }
168591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void toggleOverwriteModeEnabled();
16953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canUndo();
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void undo();
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canRedo();
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void redo();
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setBaseWritingDirection(WritingDirection);
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // smartInsertDeleteEnabled and selectTrailingWhitespaceEnabled are
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // mutually exclusive, meaning that enabling one will disable the other.
17951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool smartInsertDeleteEnabled() const;
18051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool isSelectTrailingWhitespaceEnabled() const;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1823c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    bool preventRevealSelection() const { return m_preventRevealSelection; }
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStartNewKillRingSequence(bool);
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clear();
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisibleSelection selectionForCommand(Event*);
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    KillRing& killRing() const { return *m_killRing; }
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EditingBehavior behavior() const;
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
194a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<Range> selectedRange();
19502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addToKillRing(Range*, bool prepend);
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
198d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void pasteAsFragment(PassRefPtrWillBeRawPtr<DocumentFragment>, bool smartReplace, bool matchStyle);
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void pasteAsPlainText(const String&, bool smartReplace);
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
201c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Element* findEventTargetFrom(const VisibleSelection&) const;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool findString(const String&, FindOptions);
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Switch callers over to the FindOptions version and retire this one.
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool findString(const String&, bool forward, bool caseFlag, bool wrapFlag, bool startInSelection);
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
207a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<Range> findStringAndScrollToVisible(const String&, Range*, FindOptions);
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const VisibleSelection& mark() const; // Mark, to be used as emacs uses it.
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMark(const VisibleSelection&);
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void computeAndSetTypingStyle(StylePropertySet* , EditAction = EditActionUnspecified);
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect firstRectForRange(Range*) const;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void respondToChangedSelection(const VisibleSelection& oldSelection, FrameSelection::SetSelectionOptions);
2173c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool markedTextMatchesAreHighlighted() const;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMarkedTextMatchesAreHighlighted(bool);
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
221d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void replaceSelectionWithFragment(PassRefPtrWillBeRawPtr<DocumentFragment>, bool selectReplacement, bool smartReplace, bool matchStyle);
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void replaceSelectionWithText(const String&, bool selectReplacement, bool smartReplace);
22302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EditorParagraphSeparator defaultParagraphSeparator() const { return m_defaultParagraphSeparator; }
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setDefaultParagraphSeparator(EditorParagraphSeparator separator) { m_defaultParagraphSeparator = separator; }
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2273c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    class RevealSelectionScope {
2283c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        WTF_MAKE_NONCOPYABLE(RevealSelectionScope);
2293c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    public:
2303c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        RevealSelectionScope(Editor*);
2313c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        ~RevealSelectionScope();
2323c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    private:
2333c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        Editor* m_editor;
2343c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    };
2353c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    friend class RevealSelectionScope;
2363c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
237f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    void trace(Visitor*);
238f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
23981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)private:
2407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RawPtrWillBeMember<LocalFrame> m_frame;
241f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RefPtrWillBeMember<CompositeEditCommand> m_lastEditCommand;
2423c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    int m_preventRevealSelection;
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_shouldStartNewKillRingSequence;
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_shouldStyleWithCSS;
24551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const OwnPtr<KillRing> m_killRing;
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisibleSelection m_mark;
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_areMarkedTextMatchesHighlighted;
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EditorParagraphSeparator m_defaultParagraphSeparator;
24953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool m_overwriteModeEnabled;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
251d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    explicit Editor(LocalFrame&);
2521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
2537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LocalFrame& frame() const
2547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
2557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(m_frame);
2567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return *m_frame;
2577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
2587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canDeleteRange(Range*) const;
26006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
26151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    UndoStack* undoStack() const;
26251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
26306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    bool tryDHTMLCopy();
26406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    bool tryDHTMLCut();
26506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    bool tryDHTMLPaste(PasteMode);
26606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canSmartReplaceWithPasteboard(Pasteboard*);
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void pasteAsPlainTextWithPasteboard(Pasteboard*);
2691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    void pasteWithPasteboard(Pasteboard*);
27051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    void writeSelectionToPasteboard(Pasteboard*, Range*, const String& plainText);
271197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool dispatchCPPEvent(const AtomicString&, DataTransferAccessPolicy, PasteMode = AllMimeTypes);
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void revealSelectionAfterEditingOperation(const ScrollAlignment& = ScrollAlignment::alignCenterIfNeeded, RevealExtentOption = DoNotRevealExtent);
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void changeSelectionAfterCommand(const VisibleSelection& newSelection, FrameSelection::SetSelectionOptions);
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void notifyComponentsOnChangedSelection(const VisibleSelection& oldSelection, FrameSelection::SetSelectionOptions);
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
277c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Element* findEventTargetFromSelection() const;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
279a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<Range> rangeOfString(const String&, Range*, FindOptions);
28051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
2811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    SpellChecker& spellChecker() const;
28251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
283c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    bool handleEditingKeyboardEvent(blink::KeyboardEvent*);
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void Editor::setStartNewKillRingSequence(bool flag)
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_shouldStartNewKillRingSequence = flag;
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline const VisibleSelection& Editor::mark() const
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_mark;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void Editor::setMark(const VisibleSelection& selection)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mark = selection;
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool Editor::markedTextMatchesAreHighlighted() const
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_areMarkedTextMatchesHighlighted;
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
307c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // Editor_h
310