1ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block/*
2ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * Copyright (C) 2010 Google, Inc. All Rights Reserved.
3ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *
4ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * Redistribution and use in source and binary forms, with or without
5ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * modification, are permitted provided that the following conditions
6ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * are met:
7ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * 1. Redistributions of source code must retain the above copyright
8ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *    notice, this list of conditions and the following disclaimer.
9ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * 2. Redistributions in binary form must reproduce the above copyright
10ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *    notice, this list of conditions and the following disclaimer in the
11ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *    documentation and/or other materials provided with the distribution.
12ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *
13ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
14ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
17ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block */
25ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
26ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "config.h"
27ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "HTMLFormattingElementList.h"
28ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
29ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "Element.h"
30ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "NotImplemented.h"
31ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
32ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blocknamespace WebCore {
33ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
34ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockHTMLFormattingElementList::HTMLFormattingElementList()
35ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
36ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
37ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
38ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockHTMLFormattingElementList::~HTMLFormattingElementList()
39ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
40ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
41ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
42ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockElement* HTMLFormattingElementList::closestElementInScopeWithName(const AtomicString& targetName)
43ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
44ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    for (unsigned i = 1; i <= m_entries.size(); ++i) {
45ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        const Entry& entry = m_entries[m_entries.size() - i];
46ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (entry.isMarker())
47ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return 0;
48ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (entry.element()->hasLocalName(targetName))
49ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return entry.element();
50ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
51ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return 0;
52ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
53ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
54ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool HTMLFormattingElementList::contains(Element* element)
55ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
56ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return !!find(element);
57ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
58ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
59ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockHTMLFormattingElementList::Entry* HTMLFormattingElementList::find(Element* element)
60ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
61e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    size_t index = m_entries.reverseFind(element);
62ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (index != notFound) {
63ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        // This is somewhat of a hack, and is why this method can't be const.
64ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return &m_entries[index];
65ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
66ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return 0;
67ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
68ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
69e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeHTMLFormattingElementList::Bookmark HTMLFormattingElementList::bookmarkFor(Element* element)
70e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
71e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    size_t index = m_entries.reverseFind(element);
72e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    ASSERT(index != notFound);
73967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return Bookmark(&at(index));
74e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
75e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
76967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid HTMLFormattingElementList::swapTo(Element* oldElement, Element* newElement, const Bookmark& bookmark)
77e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
78967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    ASSERT(contains(oldElement));
79967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    ASSERT(!contains(newElement));
80967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!bookmark.hasBeenMoved()) {
81967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        ASSERT(bookmark.mark()->element() == oldElement);
82967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        bookmark.mark()->replaceElement(newElement);
83967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return;
84e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
85967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    size_t index = bookmark.mark() - first();
86967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    ASSERT(index < size());
87967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    m_entries.insert(index + 1, newElement);
88967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    remove(oldElement);
89e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
90e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
91ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid HTMLFormattingElementList::append(Element* element)
92ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
93ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_entries.append(element);
94ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
95ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
96ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid HTMLFormattingElementList::remove(Element* element)
97ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
98e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    size_t index = m_entries.reverseFind(element);
99ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (index != notFound)
100ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        m_entries.remove(index);
101ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
102ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
103ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid HTMLFormattingElementList::appendMarker()
104ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
105ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_entries.append(Entry::MarkerEntry);
106ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
107ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
108ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid HTMLFormattingElementList::clearToLastMarker()
109ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
110967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#clear-the-list-of-active-formatting-elements-up-to-the-last-marker
111967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    while (m_entries.size()) {
112967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        bool shouldStop = m_entries.last().isMarker();
113ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        m_entries.removeLast();
114967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        if (shouldStop)
115967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            break;
116967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
117ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
118ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
119e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#ifndef NDEBUG
120e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
121e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid HTMLFormattingElementList::show()
122e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
123e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    for (unsigned i = 1; i <= m_entries.size(); ++i) {
124e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        const Entry& entry = m_entries[m_entries.size() - i];
125e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (entry.isMarker())
126e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            fprintf(stderr, "marker\n");
127e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        else
128e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            entry.element()->showNode();
129e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
130e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
131e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
132e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
133e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
134ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
135