| Index: Source/core/rendering/RenderQuote.cpp
|
| diff --git a/Source/core/rendering/RenderQuote.cpp b/Source/core/rendering/RenderQuote.cpp
|
| deleted file mode 100644
|
| index 9ff595ad55b0570a6a3d5fb85fe74a4d88a303d4..0000000000000000000000000000000000000000
|
| --- a/Source/core/rendering/RenderQuote.cpp
|
| +++ /dev/null
|
| @@ -1,408 +0,0 @@
|
| -/**
|
| - * Copyright (C) 2011 Nokia Inc. All rights reserved.
|
| - * Copyright (C) 2012 Google 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 "core/rendering/RenderQuote.h"
|
| -
|
| -#include "core/rendering/RenderTextFragment.h"
|
| -#include "core/rendering/RenderView.h"
|
| -#include "wtf/StdLibExtras.h"
|
| -#include "wtf/text/AtomicString.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -namespace blink {
|
| -
|
| -RenderQuote::RenderQuote(Document* node, QuoteType quote)
|
| - : RenderInline(0)
|
| - , m_type(quote)
|
| - , m_depth(0)
|
| - , m_next(nullptr)
|
| - , m_previous(nullptr)
|
| - , m_attached(false)
|
| -{
|
| - setDocumentForAnonymous(node);
|
| -}
|
| -
|
| -RenderQuote::~RenderQuote()
|
| -{
|
| - ASSERT(!m_attached);
|
| - ASSERT(!m_next && !m_previous);
|
| -}
|
| -
|
| -void RenderQuote::willBeDestroyed()
|
| -{
|
| - detachQuote();
|
| - RenderInline::willBeDestroyed();
|
| -}
|
| -
|
| -void RenderQuote::willBeRemovedFromTree()
|
| -{
|
| - RenderInline::willBeRemovedFromTree();
|
| - detachQuote();
|
| -}
|
| -
|
| -void RenderQuote::styleDidChange(StyleDifference diff, const LayoutStyle* oldStyle)
|
| -{
|
| - RenderInline::styleDidChange(diff, oldStyle);
|
| - updateText();
|
| -}
|
| -
|
| -struct Language {
|
| - const char* lang;
|
| - UChar open1;
|
| - UChar close1;
|
| - UChar open2;
|
| - UChar close2;
|
| - QuotesData* data;
|
| -
|
| - bool operator<(const Language& b) const { return strcmp(lang, b.lang) < 0; }
|
| -};
|
| -
|
| -// Table of quotes from http://www.whatwg.org/specs/web-apps/current-work/multipage/rendering.html#quote
|
| -Language languages[] = {
|
| - { "af", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "agq", 0x201e, 0x201d, 0x201a, 0x2019, 0 },
|
| - { "ak", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "am", 0x00ab, 0x00bb, 0x2039, 0x203a, 0 },
|
| - { "ar", 0x201d, 0x201c, 0x2019, 0x2018, 0 },
|
| - { "asa", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "az-cyrl", 0x00ab, 0x00bb, 0x2039, 0x203a, 0 },
|
| - { "bas", 0x00ab, 0x00bb, 0x201e, 0x201c, 0 },
|
| - { "bem", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "bez", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "bg", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "bm", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "bn", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "br", 0x00ab, 0x00bb, 0x2039, 0x203a, 0 },
|
| - { "brx", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "bs-cyrl" , 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "ca", 0x201c, 0x201d, 0x00ab, 0x00bb, 0 },
|
| - { "cgg", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "chr", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "cs", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "da", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "dav", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "de", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "de-ch", 0x00ab, 0x00bb, 0x2039, 0x203a, 0 },
|
| - { "dje", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "dua", 0x00ab, 0x00bb, 0x2018, 0x2019, 0 },
|
| - { "dyo", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "dz", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ebu", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ee", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "el", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "en", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "en-gb", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "es", 0x201c, 0x201d, 0x00ab, 0x00bb, 0 },
|
| - { "et", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "eu", 0x201c, 0x201d, 0x00ab, 0x00bb, 0 },
|
| - { "ewo", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "fa", 0x00ab, 0x00bb, 0x2039, 0x203a, 0 },
|
| - { "ff", 0x201e, 0x201d, 0x201a, 0x2019, 0 },
|
| - { "fi", 0x201d, 0x201d, 0x2019, 0x2019, 0 },
|
| - { "fr", 0x00ab, 0x00bb, 0x00ab, 0x00bb, 0 },
|
| - { "fr-ca", 0x00ab, 0x00bb, 0x2039, 0x203a, 0 },
|
| - { "fr-ch", 0x00ab, 0x00bb, 0x2039, 0x203a, 0 },
|
| - { "gsw", 0x00ab, 0x00bb, 0x2039, 0x203a, 0 },
|
| - { "gu", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "guz", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ha", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "he", 0x0022, 0x0022, 0x0027, 0x0027, 0 },
|
| - { "hi", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "hr", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "hu", 0x201e, 0x201d, 0x00bb, 0x00ab, 0 },
|
| - { "id", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ig", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "it", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "ja", 0x300c, 0x300d, 0x300e, 0x300f, 0 },
|
| - { "jgo", 0x00ab, 0x00bb, 0x2039, 0x203a, 0 },
|
| - { "jmc", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "kab", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "kam", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "kde", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "kea", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "khq", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ki", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "kkj", 0x00ab, 0x00bb, 0x2039, 0x203a, 0 },
|
| - { "kln", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "km", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "kn", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ko", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ksb", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ksf", 0x00ab, 0x00bb, 0x2018, 0x2019, 0 },
|
| - { "lag", 0x201d, 0x201d, 0x2019, 0x2019, 0 },
|
| - { "lg", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ln", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "lo", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "lt", 0x201e, 0x201c, 0x201e, 0x201c, 0 },
|
| - { "lu", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "luo", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "luy", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "lv", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "mas", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "mer", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "mfe", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "mg", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "mgo", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "mk", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "ml", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "mr", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ms", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "mua", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "my", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "naq", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "nb", 0x00ab, 0x00bb, 0x2018, 0x2019, 0 },
|
| - { "nd", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "nl", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "nmg", 0x201e, 0x201d, 0x00ab, 0x00bb, 0 },
|
| - { "nn", 0x00ab, 0x00bb, 0x2018, 0x2019, 0 },
|
| - { "nnh", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "nus", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "nyn", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "pl", 0x201e, 0x201d, 0x00ab, 0x00bb, 0 },
|
| - { "pt", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "pt-pt", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "rn", 0x201d, 0x201d, 0x2019, 0x2019, 0 },
|
| - { "ro", 0x201e, 0x201d, 0x00ab, 0x00bb, 0 },
|
| - { "rof", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ru", 0x00ab, 0x00bb, 0x201e, 0x201c, 0 },
|
| - { "rw", 0x00ab, 0x00bb, 0x2018, 0x2019, 0 },
|
| - { "rwk", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "saq", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "sbp", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "seh", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ses", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "sg", 0x00ab, 0x00bb, 0x201c, 0x201d, 0 },
|
| - { "shi", 0x00ab, 0x00bb, 0x201e, 0x201d, 0 },
|
| - { "shi-tfng", 0x00ab, 0x00bb, 0x201e, 0x201d, 0 },
|
| - { "si", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "sk", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "sl", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "sn", 0x201d, 0x201d, 0x2019, 0x2019, 0 },
|
| - { "so", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "sq", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "sr", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "sr-latn", 0x201e, 0x201c, 0x201a, 0x2018, 0 },
|
| - { "sv", 0x201d, 0x201d, 0x2019, 0x2019, 0 },
|
| - { "sw", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "swc", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ta", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "te", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "teo", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "th", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "ti-er", 0x2018, 0x2019, 0x201c, 0x201d, 0 },
|
| - { "to", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "tr", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "twq", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "tzm", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "uk", 0x00ab, 0x00bb, 0x201e, 0x201c, 0 },
|
| - { "ur", 0x201d, 0x201c, 0x2019, 0x2018, 0 },
|
| - { "vai", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "vai-latn", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "vi", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "vun", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "xh", 0x2018, 0x2019, 0x201c, 0x201d, 0 },
|
| - { "xog", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "yav", 0x00ab, 0x00bb, 0x00ab, 0x00bb, 0 },
|
| - { "yo", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "zh", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| - { "zh-hant", 0x300c, 0x300d, 0x300e, 0x300f, 0 },
|
| - { "zu", 0x201c, 0x201d, 0x2018, 0x2019, 0 },
|
| -};
|
| -
|
| -const QuotesData* quotesDataForLanguage(const AtomicString& lang)
|
| -{
|
| - if (lang.isNull())
|
| - return 0;
|
| -
|
| - // This could be just a hash table, but doing that adds 200k to RenderQuote.o
|
| - Language* languagesEnd = languages + WTF_ARRAY_LENGTH(languages);
|
| - CString lowercaseLang = lang.lower().utf8();
|
| - Language key = { lowercaseLang.data(), 0, 0, 0, 0, 0 };
|
| - Language* match = std::lower_bound(languages, languagesEnd, key);
|
| - if (match == languagesEnd || strcmp(match->lang, key.lang))
|
| - return 0;
|
| -
|
| - if (!match->data)
|
| - match->data = QuotesData::create(match->open1, match->close1, match->open2, match->close2).leakRef();
|
| -
|
| - return match->data;
|
| -}
|
| -
|
| -static const QuotesData* basicQuotesData()
|
| -{
|
| - // FIXME: The default quotes should be the fancy quotes for "en".
|
| - DEFINE_STATIC_REF(QuotesData, staticBasicQuotes, (QuotesData::create('"', '"', '\'', '\'')));
|
| - return staticBasicQuotes;
|
| -}
|
| -
|
| -void RenderQuote::updateText()
|
| -{
|
| - String text = computeText();
|
| - if (m_text == text)
|
| - return;
|
| -
|
| - m_text = text;
|
| -
|
| - RenderTextFragment* fragment = findFragmentChild();
|
| - if (fragment) {
|
| - fragment->setStyle(style());
|
| - fragment->setContentString(m_text.impl());
|
| - } else {
|
| - fragment = new RenderTextFragment(&document(), m_text.impl());
|
| - fragment->setStyle(style());
|
| - addChild(fragment);
|
| - }
|
| -}
|
| -
|
| -RenderTextFragment* RenderQuote::findFragmentChild() const
|
| -{
|
| - // We walk from the end of the child list because, if we've had a first-letter
|
| - // renderer inserted then the remaining text will be at the end.
|
| - while (LayoutObject* child = lastChild()) {
|
| - if (child->isText() && toRenderText(child)->isTextFragment())
|
| - return toRenderTextFragment(child);
|
| - }
|
| -
|
| - return nullptr;
|
| -}
|
| -
|
| -String RenderQuote::computeText() const
|
| -{
|
| - switch (m_type) {
|
| - case NO_OPEN_QUOTE:
|
| - case NO_CLOSE_QUOTE:
|
| - return emptyString();
|
| - case CLOSE_QUOTE:
|
| - return quotesData()->getCloseQuote(m_depth - 1).impl();
|
| - case OPEN_QUOTE:
|
| - return quotesData()->getOpenQuote(m_depth).impl();
|
| - }
|
| - ASSERT_NOT_REACHED();
|
| - return emptyString();
|
| -}
|
| -
|
| -const QuotesData* RenderQuote::quotesData() const
|
| -{
|
| - if (const QuotesData* customQuotes = style()->quotes())
|
| - return customQuotes;
|
| -
|
| - if (const QuotesData* quotes = quotesDataForLanguage(style()->locale()))
|
| - return quotes;
|
| -
|
| - return basicQuotesData();
|
| -}
|
| -
|
| -void RenderQuote::attachQuote()
|
| -{
|
| - ASSERT(view());
|
| - ASSERT(!m_attached);
|
| - ASSERT(!m_next && !m_previous);
|
| - ASSERT(isRooted());
|
| -
|
| - if (!view()->renderQuoteHead()) {
|
| - view()->setRenderQuoteHead(this);
|
| - m_attached = true;
|
| - return;
|
| - }
|
| -
|
| - for (LayoutObject* predecessor = previousInPreOrder(); predecessor; predecessor = predecessor->previousInPreOrder()) {
|
| - // Skip unattached predecessors to avoid having stale m_previous pointers
|
| - // if the previous node is never attached and is then destroyed.
|
| - if (!predecessor->isQuote() || !toRenderQuote(predecessor)->isAttached())
|
| - continue;
|
| - m_previous = toRenderQuote(predecessor);
|
| - m_next = m_previous->m_next;
|
| - m_previous->m_next = this;
|
| - if (m_next)
|
| - m_next->m_previous = this;
|
| - break;
|
| - }
|
| -
|
| - if (!m_previous) {
|
| - m_next = view()->renderQuoteHead();
|
| - view()->setRenderQuoteHead(this);
|
| - if (m_next)
|
| - m_next->m_previous = this;
|
| - }
|
| - m_attached = true;
|
| -
|
| - for (RenderQuote* quote = this; quote; quote = quote->m_next)
|
| - quote->updateDepth();
|
| -
|
| - ASSERT(!m_next || m_next->m_attached);
|
| - ASSERT(!m_next || m_next->m_previous == this);
|
| - ASSERT(!m_previous || m_previous->m_attached);
|
| - ASSERT(!m_previous || m_previous->m_next == this);
|
| -}
|
| -
|
| -void RenderQuote::detachQuote()
|
| -{
|
| - ASSERT(!m_next || m_next->m_attached);
|
| - ASSERT(!m_previous || m_previous->m_attached);
|
| - if (!m_attached)
|
| - return;
|
| -
|
| - // Reset our attached status at this point because it's possible for
|
| - // updateDepth() to call into attachQuote(). Attach quote walks the render
|
| - // tree looking for quotes that are attached and does work on them.
|
| - m_attached = false;
|
| -
|
| - if (m_previous)
|
| - m_previous->m_next = m_next;
|
| - else if (view())
|
| - view()->setRenderQuoteHead(m_next);
|
| - if (m_next)
|
| - m_next->m_previous = m_previous;
|
| - if (!documentBeingDestroyed()) {
|
| - for (RenderQuote* quote = m_next; quote; quote = quote->m_next)
|
| - quote->updateDepth();
|
| - }
|
| - m_next = nullptr;
|
| - m_previous = nullptr;
|
| - m_depth = 0;
|
| -}
|
| -
|
| -void RenderQuote::updateDepth()
|
| -{
|
| - ASSERT(m_attached);
|
| - int oldDepth = m_depth;
|
| - m_depth = 0;
|
| - if (m_previous) {
|
| - m_depth = m_previous->m_depth;
|
| - switch (m_previous->m_type) {
|
| - case OPEN_QUOTE:
|
| - case NO_OPEN_QUOTE:
|
| - m_depth++;
|
| - break;
|
| - case CLOSE_QUOTE:
|
| - case NO_CLOSE_QUOTE:
|
| - if (m_depth)
|
| - m_depth--;
|
| - break;
|
| - }
|
| - }
|
| - if (oldDepth != m_depth)
|
| - updateText();
|
| -}
|
| -
|
| -} // namespace blink
|
|
|