| /* |
| * 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. |
| * |
| */ |
| |
| #ifndef LayoutQuote_h |
| #define LayoutQuote_h |
| |
| #include "core/layout/LayoutInline.h" |
| #include "core/style/QuotesData.h" |
| |
| namespace blink { |
| |
| class LayoutTextFragment; |
| class PseudoElement; |
| |
| // LayoutQuote is the layout object associated with generated quotes |
| // ("content: open-quote | close-quote | no-open-quote | no-close-quote"). |
| // http://www.w3.org/TR/CSS2/generate.html#quotes-insert |
| // |
| // This object is generated thus always anonymous. |
| // |
| // For performance reasons, LayoutQuotes form a doubly-linked list. See |m_next| |
| // and |m_previous| below. |
| class LayoutQuote final : public LayoutInline { |
| public: |
| LayoutQuote(PseudoElement&, const QuoteType); |
| ~LayoutQuote() override; |
| void attachQuote(); |
| |
| const char* name() const override { return "LayoutQuote"; } |
| |
| private: |
| void detachQuote(); |
| |
| void willBeDestroyed() override; |
| bool isOfType(LayoutObjectType type) const override { |
| return type == LayoutObjectQuote || LayoutInline::isOfType(type); |
| } |
| void styleDidChange(StyleDifference, const ComputedStyle*) override; |
| void willBeRemovedFromTree() override; |
| |
| String computeText() const; |
| void updateText(); |
| const QuotesData* quotesData() const; |
| void updateDepth(); |
| bool isAttached() { return m_attached; } |
| |
| LayoutTextFragment* findFragmentChild() const; |
| |
| // Type of this LayoutQuote: open-quote, close-quote, no-open-quote, |
| // no-close-quote. |
| QuoteType m_type; |
| |
| // Number of open quotes in the tree. Also called the nesting level |
| // in CSS 2.1. |
| // Used to determine if a LayoutQuote is invalid (closing quote without a |
| // matching opening quote) and which quote character to use (see the 'quote' |
| // property that is used to define quote character pairs). |
| int m_depth; |
| |
| // The next and previous LayoutQuote in layout tree order. |
| // LayoutQuotes are linked together by this doubly-linked list. |
| // Those are used to compute |m_depth| in an efficient manner. |
| LayoutQuote* m_next; |
| LayoutQuote* m_previous; |
| |
| // The pseudo-element that owns us. |
| // |
| // Lifetime is the same as LayoutObject::m_node, so this is safe. |
| UntracedMember<PseudoElement> m_owningPseudo; |
| |
| // This tracks whether this LayoutQuote was inserted into the layout tree |
| // and its position in the linked list is correct (m_next and m_previous). |
| // It's used for both performance (avoid unneeded tree walks to find the |
| // previous and next quotes) and conformance (|m_depth| relies on an |
| // up-to-date linked list positions). |
| bool m_attached; |
| |
| // Cached text for this quote. |
| String m_text; |
| }; |
| |
| DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutQuote, isQuote()); |
| |
| } // namespace blink |
| |
| #endif // LayoutQuote_h |