2
* Copyright (C) 2012 Apple Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
13
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
#include "TextInsertionBaseCommand.h"
29
#include "BeforeTextInsertedEvent.h"
37
TextInsertionBaseCommand::TextInsertionBaseCommand(Document* document)
38
: CompositeEditCommand(document)
42
void TextInsertionBaseCommand::applyTextInsertionCommand(Frame* frame, PassRefPtr<TextInsertionBaseCommand> command, const VisibleSelection& selectionForInsertion, const VisibleSelection& endingSelection)
44
bool changeSelection = selectionForInsertion != endingSelection;
45
if (changeSelection) {
46
command->setStartingSelection(selectionForInsertion);
47
command->setEndingSelection(selectionForInsertion);
49
applyCommand(command);
50
if (changeSelection) {
51
command->setEndingSelection(endingSelection);
52
frame->selection()->setSelection(endingSelection);
56
String dispatchBeforeTextInsertedEvent(const String& text, const VisibleSelection& selectionForInsertion, bool insertionIsForUpdatingComposition)
58
if (insertionIsForUpdatingComposition)
61
String newText = text;
62
if (Node* startNode = selectionForInsertion.start().containerNode()) {
63
if (startNode->rootEditableElement()) {
64
// Send BeforeTextInsertedEvent. The event handler will update text if necessary.
66
RefPtr<BeforeTextInsertedEvent> evt = BeforeTextInsertedEvent::create(text);
67
startNode->rootEditableElement()->dispatchEvent(evt, ec);
68
newText = evt->text();
74
bool canAppendNewLineFeedToSelection(const VisibleSelection& selection)
76
Node* node = selection.rootEditableElement();
80
RefPtr<BeforeTextInsertedEvent> event = BeforeTextInsertedEvent::create(String("\n"));
82
node->dispatchEvent(event, ec);
83
return event->text().length();