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