18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CharacterData.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ExceptionCode.h"
27a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "InspectorInstrumentation.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MutationEvent.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderText.h"
3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "TextBreakIterator.h"
3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochusing namespace std;
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CharacterData::setData(const String& data, ExceptionCode&)
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    StringImpl* dataImpl = data.impl() ? data.impl() : StringImpl::empty();
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equal(m_data.get(), dataImpl))
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    unsigned oldLength = length();
43ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
44cad810f21b803229eb11403f9209855525a25d57Steve Block    setDataAndUpdate(dataImpl, 0, oldLength, dataImpl->length());
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->textRemoved(this, 0, oldLength);
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString CharacterData::substringData(unsigned offset, unsigned count, ExceptionCode& ec)
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkCharDataOperation(offset, ec);
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ec)
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return String();
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_data->substring(offset, count);
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochunsigned CharacterData::parserAppendData(const UChar* data, unsigned dataLength, unsigned lengthLimit)
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned oldLength = m_data->length();
6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned end = min(dataLength, lengthLimit - oldLength);
6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Check that we are not on an unbreakable boundary.
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Some text break iterator implementations work best if the passed buffer is as small as possible,
6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // see <https://bugs.webkit.org/show_bug.cgi?id=29092>.
6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // We need at least two characters look-ahead to account for UTF-16 surrogates.
6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (end < dataLength) {
6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        TextBreakIterator* it = characterBreakIterator(data, (end + 2 > dataLength) ? dataLength : end + 2);
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!isTextBreak(it, end))
7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            end = textBreakPreceding(it, end);
7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!end)
7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return 0;
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    String newStr = m_data;
7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    newStr.append(data, end);
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data = newStr.impl();
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
80f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    updateRenderer(oldLength, 0);
81967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // We don't call dispatchModifiedEvent here because we don't want the
82967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // parser to dispatch DOM mutation events.
83967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (parentNode())
84967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        parentNode()->childrenChanged();
8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return end;
87967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
88967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
89967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid CharacterData::appendData(const String& data, ExceptionCode&)
90967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
91f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    String newStr = m_data;
92f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    newStr.append(data);
93f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
94cad810f21b803229eb11403f9209855525a25d57Steve Block    setDataAndUpdate(newStr.impl(), m_data->length(), 0, data.length());
95f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
96f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // FIXME: Should we call textInserted here?
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
99967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid CharacterData::insertData(unsigned offset, const String& data, ExceptionCode& ec)
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkCharDataOperation(offset, ec);
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ec)
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String newStr = m_data;
106967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    newStr.insert(data, offset);
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
108cad810f21b803229eb11403f9209855525a25d57Steve Block    setDataAndUpdate(newStr.impl(), offset, 0, data.length());
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
110967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    document()->textInserted(this, offset, data.length());
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CharacterData::deleteData(unsigned offset, unsigned count, ExceptionCode& ec)
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkCharDataOperation(offset, ec);
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ec)
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned realCount;
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (offset + count > length())
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        realCount = length() - offset;
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        realCount = count;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String newStr = m_data;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newStr.remove(offset, realCount);
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
128cad810f21b803229eb11403f9209855525a25d57Steve Block    setDataAndUpdate(newStr.impl(), offset, count, 0);
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->textRemoved(this, offset, realCount);
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
133967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid CharacterData::replaceData(unsigned offset, unsigned count, const String& data, ExceptionCode& ec)
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkCharDataOperation(offset, ec);
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ec)
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned realCount;
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (offset + count > length())
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        realCount = length() - offset;
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        realCount = count;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String newStr = m_data;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newStr.remove(offset, realCount);
147967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    newStr.insert(data, offset);
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
149cad810f21b803229eb11403f9209855525a25d57Steve Block    setDataAndUpdate(newStr.impl(), offset, count, data.length());
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // update the markers for spell checking and grammar checking
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->textRemoved(this, offset, realCount);
153967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    document()->textInserted(this, offset, data.length());
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString CharacterData::nodeValue() const
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_data;
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CharacterData::containsOnlyWhitespace() const
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !m_data || m_data->containsOnlyWhitespace();
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CharacterData::setNodeValue(const String& nodeValue, ExceptionCode& ec)
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setData(nodeValue, ec);
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
171cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid CharacterData::setDataAndUpdate(PassRefPtr<StringImpl> newData, unsigned offsetOfReplacedData, unsigned oldLength, unsigned newLength)
172f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
173cad810f21b803229eb11403f9209855525a25d57Steve Block    if (document()->frame())
174cad810f21b803229eb11403f9209855525a25d57Steve Block        document()->frame()->selection()->textWillBeReplaced(this, offsetOfReplacedData, oldLength, newLength);
175f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    RefPtr<StringImpl> oldData = m_data;
176f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_data = newData;
177cad810f21b803229eb11403f9209855525a25d57Steve Block    updateRenderer(offsetOfReplacedData, oldLength);
178f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    dispatchModifiedEvent(oldData.get());
179f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
180f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
181f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid CharacterData::updateRenderer(unsigned offsetOfReplacedData, unsigned lengthOfReplacedData)
182f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
183f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ((!renderer() || !rendererIsNeeded(renderer()->style())) && attached()) {
184f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        detach();
185f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        attach();
186f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    } else if (renderer())
187f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        toRenderText(renderer())->setTextWithOffset(m_data, offsetOfReplacedData, lengthOfReplacedData);
188f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
189f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
190f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid CharacterData::dispatchModifiedEvent(StringImpl* oldData)
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parentNode())
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parentNode()->childrenChanged();
194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (document()->hasListenerType(Document::DOMCHARACTERDATAMODIFIED_LISTENER))
195f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        dispatchEvent(MutationEvent::create(eventNames().DOMCharacterDataModifiedEvent, true, 0, oldData, m_data));
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    dispatchSubtreeModifiedEvent();
197bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if ENABLE(INSPECTOR)
198a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    InspectorInstrumentation::characterDataModified(document(), this);
199bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CharacterData::checkCharDataOperation(unsigned offset, ExceptionCode& ec)
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ec = 0;
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // INDEX_SIZE_ERR: Raised if the specified offset is negative or greater than the number of 16-bit
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // units in data.
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (offset > length()) {
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = INDEX_SIZE_ERR;
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint CharacterData::maxCharacterOffset() const
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<int>(length());
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CharacterData::rendererIsNeeded(RenderStyle *style)
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_data || !length())
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
2238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return Node::rendererIsNeeded(style);
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CharacterData::offsetInCharacters() const
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
232