| Index: third_party/WebKit/WebCore/dom/CharacterData.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/dom/CharacterData.cpp (revision 9310)
|
| +++ third_party/WebKit/WebCore/dom/CharacterData.cpp (working copy)
|
| @@ -1,235 +1,235 @@
|
| -/*
|
| - * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
|
| - * (C) 1999 Antti Koivisto (koivisto@kde.org)
|
| - * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
|
| - *
|
| - * This library is free software; you can redistribute it and/or
|
| - * modify it under the terms of the GNU Library General Public
|
| - * License as published by the Free Software Foundation; either
|
| - * version 2 of the License, or (at your option) any later version.
|
| - *
|
| - * This library is distributed in the hope that it will be useful,
|
| - * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| - * Library General Public License for more details.
|
| - *
|
| - * You should have received a copy of the GNU Library General Public License
|
| - * along with this library; see the file COPYING.LIB. If not, write to
|
| - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
| - * Boston, MA 02110-1301, USA.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "CharacterData.h"
|
| -
|
| -#include "CString.h"
|
| -#include "EventNames.h"
|
| -#include "ExceptionCode.h"
|
| -#include "MutationEvent.h"
|
| -#include "RenderText.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -CharacterData::CharacterData(Document *doc, bool isText)
|
| - : EventTargetNode(doc, false, false, isText)
|
| - , m_data(StringImpl::empty())
|
| -{
|
| -}
|
| -
|
| -CharacterData::CharacterData(Document* document, const String& text, bool isText)
|
| - : EventTargetNode(document, false, false, isText)
|
| -{
|
| - m_data = text.impl() ? text.impl() : StringImpl::empty();
|
| -}
|
| -
|
| -CharacterData::~CharacterData()
|
| -{
|
| -}
|
| -
|
| -void CharacterData::setData(const String& data, ExceptionCode&)
|
| -{
|
| - StringImpl* dataImpl = data.impl() ? data.impl() : StringImpl::empty();
|
| - if (equal(m_data.get(), dataImpl))
|
| - return;
|
| -
|
| - int oldLength = length();
|
| - RefPtr<StringImpl> oldStr = m_data;
|
| - m_data = dataImpl;
|
| -
|
| - if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
|
| - detach();
|
| - attach();
|
| - } else if (renderer())
|
| - toRenderText(renderer())->setText(m_data);
|
| -
|
| - dispatchModifiedEvent(oldStr.get());
|
| -
|
| - document()->textRemoved(this, 0, oldLength);
|
| -}
|
| -
|
| -String CharacterData::substringData(unsigned offset, unsigned count, ExceptionCode& ec)
|
| -{
|
| - checkCharDataOperation(offset, ec);
|
| - if (ec)
|
| - return String();
|
| -
|
| - return m_data->substring(offset, count);
|
| -}
|
| -
|
| -void CharacterData::appendData(const String& arg, ExceptionCode&)
|
| -{
|
| - String newStr = m_data;
|
| - newStr.append(arg);
|
| -
|
| - RefPtr<StringImpl> oldStr = m_data;
|
| - m_data = newStr.impl();
|
| -
|
| - if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
|
| - detach();
|
| - attach();
|
| - } else if (renderer())
|
| - toRenderText(renderer())->setTextWithOffset(m_data, oldStr->length(), 0);
|
| -
|
| - dispatchModifiedEvent(oldStr.get());
|
| -}
|
| -
|
| -void CharacterData::insertData(unsigned offset, const String& arg, ExceptionCode& ec)
|
| -{
|
| - checkCharDataOperation(offset, ec);
|
| - if (ec)
|
| - return;
|
| -
|
| - String newStr = m_data;
|
| - newStr.insert(arg, offset);
|
| -
|
| - RefPtr<StringImpl> oldStr = m_data;
|
| - m_data = newStr.impl();
|
| -
|
| - if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
|
| - detach();
|
| - attach();
|
| - } else if (renderer())
|
| - toRenderText(renderer())->setTextWithOffset(m_data, offset, 0);
|
| -
|
| - dispatchModifiedEvent(oldStr.get());
|
| -
|
| - document()->textInserted(this, offset, arg.length());
|
| -}
|
| -
|
| -void CharacterData::deleteData(unsigned offset, unsigned count, ExceptionCode& ec)
|
| -{
|
| - checkCharDataOperation(offset, ec);
|
| - if (ec)
|
| - return;
|
| -
|
| - unsigned realCount;
|
| - if (offset + count > length())
|
| - realCount = length() - offset;
|
| - else
|
| - realCount = count;
|
| -
|
| - String newStr = m_data;
|
| - newStr.remove(offset, realCount);
|
| -
|
| - RefPtr<StringImpl> oldStr = m_data;
|
| - m_data = newStr.impl();
|
| -
|
| - if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
|
| - detach();
|
| - attach();
|
| - } else if (renderer())
|
| - toRenderText(renderer())->setTextWithOffset(m_data, offset, count);
|
| -
|
| - dispatchModifiedEvent(oldStr.get());
|
| -
|
| - document()->textRemoved(this, offset, realCount);
|
| -}
|
| -
|
| -void CharacterData::replaceData(unsigned offset, unsigned count, const String& arg, ExceptionCode& ec)
|
| -{
|
| - checkCharDataOperation(offset, ec);
|
| - if (ec)
|
| - return;
|
| -
|
| - unsigned realCount;
|
| - if (offset + count > length())
|
| - realCount = length() - offset;
|
| - else
|
| - realCount = count;
|
| -
|
| - String newStr = m_data;
|
| - newStr.remove(offset, realCount);
|
| - newStr.insert(arg, offset);
|
| -
|
| - RefPtr<StringImpl> oldStr = m_data;
|
| - m_data = newStr.impl();
|
| -
|
| - if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
|
| - detach();
|
| - attach();
|
| - } else if (renderer())
|
| - toRenderText(renderer())->setTextWithOffset(m_data, offset, count);
|
| -
|
| - dispatchModifiedEvent(oldStr.get());
|
| -
|
| - // update the markers for spell checking and grammar checking
|
| - document()->textRemoved(this, offset, realCount);
|
| - document()->textInserted(this, offset, arg.length());
|
| -}
|
| -
|
| -String CharacterData::nodeValue() const
|
| -{
|
| - return m_data;
|
| -}
|
| -
|
| -bool CharacterData::containsOnlyWhitespace() const
|
| -{
|
| - return !m_data || m_data->containsOnlyWhitespace();
|
| -}
|
| -
|
| -void CharacterData::setNodeValue(const String& nodeValue, ExceptionCode& ec)
|
| -{
|
| - setData(nodeValue, ec);
|
| -}
|
| -
|
| -void CharacterData::dispatchModifiedEvent(StringImpl* prevValue)
|
| -{
|
| - if (parentNode())
|
| - parentNode()->childrenChanged();
|
| - if (document()->hasListenerType(Document::DOMCHARACTERDATAMODIFIED_LISTENER)) {
|
| - ExceptionCode ec;
|
| - dispatchEvent(MutationEvent::create(eventNames().DOMCharacterDataModifiedEvent, true, false, 0, prevValue, m_data, String(), 0), ec);
|
| - }
|
| - dispatchSubtreeModifiedEvent();
|
| -}
|
| -
|
| -void CharacterData::checkCharDataOperation(unsigned offset, ExceptionCode& ec)
|
| -{
|
| - ec = 0;
|
| -
|
| - // INDEX_SIZE_ERR: Raised if the specified offset is negative or greater than the number of 16-bit
|
| - // units in data.
|
| - if (offset > length()) {
|
| - ec = INDEX_SIZE_ERR;
|
| - return;
|
| - }
|
| -}
|
| -
|
| -int CharacterData::maxCharacterOffset() const
|
| -{
|
| - return static_cast<int>(length());
|
| -}
|
| -
|
| -bool CharacterData::rendererIsNeeded(RenderStyle *style)
|
| -{
|
| - if (!m_data || !length())
|
| - return false;
|
| - return EventTargetNode::rendererIsNeeded(style);
|
| -}
|
| -
|
| -bool CharacterData::offsetInCharacters() const
|
| -{
|
| - return true;
|
| -}
|
| -
|
| -} // namespace WebCore
|
| +/*
|
| + * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
|
| + * (C) 1999 Antti Koivisto (koivisto@kde.org)
|
| + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
|
| + *
|
| + * This library is free software; you can redistribute it and/or
|
| + * modify it under the terms of the GNU Library General Public
|
| + * License as published by the Free Software Foundation; either
|
| + * version 2 of the License, or (at your option) any later version.
|
| + *
|
| + * This library is distributed in the hope that it will be useful,
|
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| + * Library General Public License for more details.
|
| + *
|
| + * You should have received a copy of the GNU Library General Public License
|
| + * along with this library; see the file COPYING.LIB. If not, write to
|
| + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
| + * Boston, MA 02110-1301, USA.
|
| + */
|
| +
|
| +#include "config.h"
|
| +#include "CharacterData.h"
|
| +
|
| +#include "CString.h"
|
| +#include "EventNames.h"
|
| +#include "ExceptionCode.h"
|
| +#include "MutationEvent.h"
|
| +#include "RenderText.h"
|
| +
|
| +namespace WebCore {
|
| +
|
| +CharacterData::CharacterData(Document *doc, bool isText)
|
| + : Node(doc, false, false, isText)
|
| + , m_data(StringImpl::empty())
|
| +{
|
| +}
|
| +
|
| +CharacterData::CharacterData(Document* document, const String& text, bool isText)
|
| + : Node(document, false, false, isText)
|
| +{
|
| + m_data = text.impl() ? text.impl() : StringImpl::empty();
|
| +}
|
| +
|
| +CharacterData::~CharacterData()
|
| +{
|
| +}
|
| +
|
| +void CharacterData::setData(const String& data, ExceptionCode&)
|
| +{
|
| + StringImpl* dataImpl = data.impl() ? data.impl() : StringImpl::empty();
|
| + if (equal(m_data.get(), dataImpl))
|
| + return;
|
| +
|
| + int oldLength = length();
|
| + RefPtr<StringImpl> oldStr = m_data;
|
| + m_data = dataImpl;
|
| +
|
| + if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
|
| + detach();
|
| + attach();
|
| + } else if (renderer())
|
| + toRenderText(renderer())->setText(m_data);
|
| +
|
| + dispatchModifiedEvent(oldStr.get());
|
| +
|
| + document()->textRemoved(this, 0, oldLength);
|
| +}
|
| +
|
| +String CharacterData::substringData(unsigned offset, unsigned count, ExceptionCode& ec)
|
| +{
|
| + checkCharDataOperation(offset, ec);
|
| + if (ec)
|
| + return String();
|
| +
|
| + return m_data->substring(offset, count);
|
| +}
|
| +
|
| +void CharacterData::appendData(const String& arg, ExceptionCode&)
|
| +{
|
| + String newStr = m_data;
|
| + newStr.append(arg);
|
| +
|
| + RefPtr<StringImpl> oldStr = m_data;
|
| + m_data = newStr.impl();
|
| +
|
| + if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
|
| + detach();
|
| + attach();
|
| + } else if (renderer())
|
| + toRenderText(renderer())->setTextWithOffset(m_data, oldStr->length(), 0);
|
| +
|
| + dispatchModifiedEvent(oldStr.get());
|
| +}
|
| +
|
| +void CharacterData::insertData(unsigned offset, const String& arg, ExceptionCode& ec)
|
| +{
|
| + checkCharDataOperation(offset, ec);
|
| + if (ec)
|
| + return;
|
| +
|
| + String newStr = m_data;
|
| + newStr.insert(arg, offset);
|
| +
|
| + RefPtr<StringImpl> oldStr = m_data;
|
| + m_data = newStr.impl();
|
| +
|
| + if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
|
| + detach();
|
| + attach();
|
| + } else if (renderer())
|
| + toRenderText(renderer())->setTextWithOffset(m_data, offset, 0);
|
| +
|
| + dispatchModifiedEvent(oldStr.get());
|
| +
|
| + document()->textInserted(this, offset, arg.length());
|
| +}
|
| +
|
| +void CharacterData::deleteData(unsigned offset, unsigned count, ExceptionCode& ec)
|
| +{
|
| + checkCharDataOperation(offset, ec);
|
| + if (ec)
|
| + return;
|
| +
|
| + unsigned realCount;
|
| + if (offset + count > length())
|
| + realCount = length() - offset;
|
| + else
|
| + realCount = count;
|
| +
|
| + String newStr = m_data;
|
| + newStr.remove(offset, realCount);
|
| +
|
| + RefPtr<StringImpl> oldStr = m_data;
|
| + m_data = newStr.impl();
|
| +
|
| + if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
|
| + detach();
|
| + attach();
|
| + } else if (renderer())
|
| + toRenderText(renderer())->setTextWithOffset(m_data, offset, count);
|
| +
|
| + dispatchModifiedEvent(oldStr.get());
|
| +
|
| + document()->textRemoved(this, offset, realCount);
|
| +}
|
| +
|
| +void CharacterData::replaceData(unsigned offset, unsigned count, const String& arg, ExceptionCode& ec)
|
| +{
|
| + checkCharDataOperation(offset, ec);
|
| + if (ec)
|
| + return;
|
| +
|
| + unsigned realCount;
|
| + if (offset + count > length())
|
| + realCount = length() - offset;
|
| + else
|
| + realCount = count;
|
| +
|
| + String newStr = m_data;
|
| + newStr.remove(offset, realCount);
|
| + newStr.insert(arg, offset);
|
| +
|
| + RefPtr<StringImpl> oldStr = m_data;
|
| + m_data = newStr.impl();
|
| +
|
| + if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
|
| + detach();
|
| + attach();
|
| + } else if (renderer())
|
| + toRenderText(renderer())->setTextWithOffset(m_data, offset, count);
|
| +
|
| + dispatchModifiedEvent(oldStr.get());
|
| +
|
| + // update the markers for spell checking and grammar checking
|
| + document()->textRemoved(this, offset, realCount);
|
| + document()->textInserted(this, offset, arg.length());
|
| +}
|
| +
|
| +String CharacterData::nodeValue() const
|
| +{
|
| + return m_data;
|
| +}
|
| +
|
| +bool CharacterData::containsOnlyWhitespace() const
|
| +{
|
| + return !m_data || m_data->containsOnlyWhitespace();
|
| +}
|
| +
|
| +void CharacterData::setNodeValue(const String& nodeValue, ExceptionCode& ec)
|
| +{
|
| + setData(nodeValue, ec);
|
| +}
|
| +
|
| +void CharacterData::dispatchModifiedEvent(StringImpl* prevValue)
|
| +{
|
| + if (parentNode())
|
| + parentNode()->childrenChanged();
|
| + if (document()->hasListenerType(Document::DOMCHARACTERDATAMODIFIED_LISTENER)) {
|
| + ExceptionCode ec;
|
| + dispatchEvent(MutationEvent::create(eventNames().DOMCharacterDataModifiedEvent, true, false, 0, prevValue, m_data, String(), 0), ec);
|
| + }
|
| + dispatchSubtreeModifiedEvent();
|
| +}
|
| +
|
| +void CharacterData::checkCharDataOperation(unsigned offset, ExceptionCode& ec)
|
| +{
|
| + ec = 0;
|
| +
|
| + // INDEX_SIZE_ERR: Raised if the specified offset is negative or greater than the number of 16-bit
|
| + // units in data.
|
| + if (offset > length()) {
|
| + ec = INDEX_SIZE_ERR;
|
| + return;
|
| + }
|
| +}
|
| +
|
| +int CharacterData::maxCharacterOffset() const
|
| +{
|
| + return static_cast<int>(length());
|
| +}
|
| +
|
| +bool CharacterData::rendererIsNeeded(RenderStyle *style)
|
| +{
|
| + if (!m_data || !length())
|
| + return false;
|
| + return Node::rendererIsNeeded(style);
|
| +}
|
| +
|
| +bool CharacterData::offsetInCharacters() const
|
| +{
|
| + return true;
|
| +}
|
| +
|
| +} // namespace WebCore
|
|
|