15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005, 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)#include "config.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/WrapContentsInDummySpanCommand.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionStatePlaceholder.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/ApplyStyleCommand.h"
31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/html/HTMLSpanElement.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)WrapContentsInDummySpanCommand::WrapContentsInDummySpanCommand(PassRefPtrWillBeRawPtr<Element> element)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : SimpleEditCommand(element->document())
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_element(element)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_element);
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WrapContentsInDummySpanCommand::executeApply()
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    NodeVector children;
45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    getChildNodes(*m_element, children);
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t size = children.size();
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < size; ++i)
491fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        m_dummySpan->appendChild(children[i].release(), IGNORE_EXCEPTION);
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
511fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    m_element->appendChild(m_dummySpan.get(), IGNORE_EXCEPTION);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WrapContentsInDummySpanCommand::doApply()
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_dummySpan = createStyleSpanElement(document());
5702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executeApply();
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WrapContentsInDummySpanCommand::doUnapply()
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_element);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!m_dummySpan || !m_element->hasEditableStyle())
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    NodeVector children;
69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    getChildNodes(*m_dummySpan, children);
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t size = children.size();
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < size; ++i)
731fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        m_element->appendChild(children[i].release(), IGNORE_EXCEPTION);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
751fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    m_dummySpan->remove(IGNORE_EXCEPTION);
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WrapContentsInDummySpanCommand::doReapply()
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_element);
8102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
82197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!m_dummySpan || !m_element->hasEditableStyle())
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    executeApply();
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void WrapContentsInDummySpanCommand::trace(Visitor* visitor)
89f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
90f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    visitor->trace(m_element);
91f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    visitor->trace(m_dummySpan);
92f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    SimpleEditCommand::trace(visitor);
93f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
94f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
95c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
96