summaryrefslogtreecommitdiffstats
path: root/WebCore/editing/RemoveFormatCommand.cpp
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2010-11-04 12:00:17 -0700
committerJohn Reck <jreck@google.com>2010-11-09 11:35:04 -0800
commite14391e94c850b8bd03680c23b38978db68687a8 (patch)
tree3fed87e6620fecaf3edc7259ae58a11662bedcb2 /WebCore/editing/RemoveFormatCommand.cpp
parent1bd705833a68f07850cf7e204b26f8d328d16951 (diff)
downloadexternal_webkit-e14391e94c850b8bd03680c23b38978db68687a8.zip
external_webkit-e14391e94c850b8bd03680c23b38978db68687a8.tar.gz
external_webkit-e14391e94c850b8bd03680c23b38978db68687a8.tar.bz2
Merge Webkit at r70949: Initial merge by git.
Change-Id: I77b8645c083b5d0da8dba73ed01d4014aab9848e
Diffstat (limited to 'WebCore/editing/RemoveFormatCommand.cpp')
-rw-r--r--WebCore/editing/RemoveFormatCommand.cpp82
1 files changed, 48 insertions, 34 deletions
diff --git a/WebCore/editing/RemoveFormatCommand.cpp b/WebCore/editing/RemoveFormatCommand.cpp
index 65f6008..f8807e2 100644
--- a/WebCore/editing/RemoveFormatCommand.cpp
+++ b/WebCore/editing/RemoveFormatCommand.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2007 Apple Computer, Inc. All rights reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -10,32 +11,35 @@
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "RemoveFormatCommand.h"
+#include "ApplyStyleCommand.h"
#include "CSSComputedStyleDeclaration.h"
#include "CSSMutableStyleDeclaration.h"
+#include "CSSValueKeywords.h"
#include "Editor.h"
#include "Frame.h"
+#include "HTMLElement.h"
#include "HTMLNames.h"
#include "VisibleSelection.h"
#include "SelectionController.h"
#include "TextIterator.h"
#include "TypingCommand.h"
-#include "ApplyStyleCommand.h"
+#include "htmlediting.h"
namespace WebCore {
@@ -46,6 +50,38 @@ RemoveFormatCommand::RemoveFormatCommand(Document* document)
{
}
+static bool isElementForRemoveFormatCommand(const Element* element)
+{
+ DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, elements, ());
+ if (elements.isEmpty()) {
+ elements.add(acronymTag);
+ elements.add(bTag);
+ elements.add(bdoTag);
+ elements.add(bigTag);
+ elements.add(citeTag);
+ elements.add(codeTag);
+ elements.add(dfnTag);
+ elements.add(emTag);
+ elements.add(fontTag);
+ elements.add(iTag);
+ elements.add(insTag);
+ elements.add(kbdTag);
+ elements.add(nobrTag);
+ elements.add(qTag);
+ elements.add(sTag);
+ elements.add(sampTag);
+ elements.add(smallTag);
+ elements.add(strikeTag);
+ elements.add(strongTag);
+ elements.add(subTag);
+ elements.add(supTag);
+ elements.add(ttTag);
+ elements.add(uTag);
+ elements.add(varTag);
+ }
+ return elements.contains(element->tagQName());
+}
+
void RemoveFormatCommand::doApply()
{
Frame* frame = document()->frame();
@@ -53,34 +89,12 @@ void RemoveFormatCommand::doApply()
if (!frame->selection()->selection().isNonOrphanedCaretOrRange())
return;
- // Make a plain text string from the selection to remove formatting like tables and lists.
- String string = plainText(frame->selection()->selection().toNormalizedRange().get());
-
// Get the default style for this editable root, it's the style that we'll give the
// content that we're operating on.
Node* root = frame->selection()->rootEditableElement();
RefPtr<CSSMutableStyleDeclaration> defaultStyle = ApplyStyleCommand::editingStyleAtPosition(Position(root, 0));
- // Delete the selected content.
- // FIXME: We should be able to leave this to insertText, but its delete operation
- // doesn't preserve the style we're about to set.
- deleteSelection();
-
- // Delete doesn't remove fully selected lists.
- while (breakOutOfEmptyListItem())
- ;
-
- // If the selection was all formatting (like an empty list) the format-less text will
- // be empty. Early return since we don't need to do any of the work that follows and
- // to avoid the ASSERT that fires if input(...) is called with an empty String.
- if (string.isEmpty())
- return;
-
- // Insert the content with the default style.
- // See <rdar://problem/5794382> RemoveFormat doesn't always reset text alignment
- frame->selection()->setTypingStyle(defaultStyle.release());
-
- inputText(string, true);
+ applyCommandToComposite(ApplyStyleCommand::create(document(), defaultStyle.get(), isElementForRemoveFormatCommand, editingAction()));
}
}