2 * Copyright (C) 2007 Apple Computer, Inc. All rights reserved.
3 * Copyright (C) 2010 Google Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "RemoveFormatCommand.h"
30 #include "ApplyStyleCommand.h"
31 #include "CSSComputedStyleDeclaration.h"
32 #include "CSSMutableStyleDeclaration.h"
33 #include "CSSValueKeywords.h"
36 #include "HTMLElement.h"
37 #include "HTMLNames.h"
38 #include "VisibleSelection.h"
39 #include "SelectionController.h"
40 #include "TextIterator.h"
41 #include "TypingCommand.h"
42 #include "htmlediting.h"
46 using namespace HTMLNames;
48 RemoveFormatCommand::RemoveFormatCommand(Document* document)
49 : CompositeEditCommand(document)
53 static bool isElementForRemoveFormatCommand(const Element* element)
55 DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, elements, ());
56 if (elements.isEmpty()) {
57 elements.add(acronymTag);
61 elements.add(citeTag);
62 elements.add(codeTag);
65 elements.add(fontTag);
69 elements.add(nobrTag);
72 elements.add(sampTag);
73 elements.add(smallTag);
74 elements.add(strikeTag);
75 elements.add(strongTag);
82 return elements.contains(element->tagQName());
85 void RemoveFormatCommand::doApply()
87 Frame* frame = document()->frame();
89 if (!frame->selection()->selection().isNonOrphanedCaretOrRange())
92 // Get the default style for this editable root, it's the style that we'll give the
93 // content that we're operating on.
94 Node* root = frame->selection()->rootEditableElement();
95 RefPtr<CSSMutableStyleDeclaration> defaultStyle = ApplyStyleCommand::editingStyleAtPosition(Position(root, 0));
97 applyCommandToComposite(ApplyStyleCommand::create(document(), defaultStyle.get(), isElementForRemoveFormatCommand, editingAction()));