blob: f852a9e742cb917f199655952161f92d4018bcaf [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/editing/commands/set_character_data_command.h"
#include "third_party/blink/renderer/core/editing/editing_utilities.h"
#include "third_party/blink/renderer/core/frame/settings.h"
#include "third_party/blink/renderer/core/layout/layout_text.h"
namespace blink {
SetCharacterDataCommand::SetCharacterDataCommand(Text* node,
unsigned offset,
unsigned count,
const String& text)
: SimpleEditCommand(node->GetDocument()),
node_(node),
offset_(offset),
count_(count),
new_text_(text) {
DCHECK(node_);
DCHECK_LE(offset_, node_->length());
DCHECK_LE(offset_ + count_, node_->length());
// Callers shouldn't be trying to perform no-op replacements
DCHECK(!(count == 0 && text.length() == 0));
}
void SetCharacterDataCommand::DoApply(EditingState*) {
// TODO(editing-dev): The use of updateStyleAndLayoutTree()
// needs to be audited. See http://crbug.com/590369 for more details.
GetDocument().UpdateStyleAndLayoutTree();
if (!HasEditableStyle(*node_))
return;
DummyExceptionStateForTesting exception_state;
previous_text_for_undo_ =
node_->substringData(offset_, count_, exception_state);
if (exception_state.HadException())
return;
const bool password_echo_enabled =
GetDocument().GetSettings() &&
GetDocument().GetSettings()->GetPasswordEchoEnabled();
if (password_echo_enabled) {
LayoutText* layout_text = node_->GetLayoutObject();
if (layout_text && layout_text->IsSecure()) {
layout_text->MomentarilyRevealLastTypedCharacter(offset_ +
new_text_.length() - 1);
}
}
node_->replaceData(offset_, count_, new_text_, IGNORE_EXCEPTION_FOR_TESTING);
}
void SetCharacterDataCommand::DoUnapply() {
// TODO(editing-dev): The use of updateStyleAndLayoutTree()
// needs to be audited. See http://crbug.com/590369 for more details.
GetDocument().UpdateStyleAndLayoutTree();
if (!HasEditableStyle(*node_))
return;
node_->replaceData(offset_, new_text_.length(), previous_text_for_undo_,
IGNORE_EXCEPTION_FOR_TESTING);
}
void SetCharacterDataCommand::Trace(Visitor* visitor) const {
visitor->Trace(node_);
SimpleEditCommand::Trace(visitor);
}
} // namespace blink