165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h" 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebBackForwardList.h" 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPageProxy.h" 3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const unsigned DefaultCapacity = 100; 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebBackForwardList::WebBackForwardList(WebPageProxy* page) 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : m_page(page) 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_current(NoCurrentItemIndex) 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_capacity(DefaultCapacity) 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_closed(true) 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_enabled(true) 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebBackForwardList::~WebBackForwardList() 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebBackForwardList::pageClosed() 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_page) { 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch size_t size = m_entries.size(); 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < size; ++i) 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->backForwardRemovedItem(m_entries[i]->itemID()); 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page = 0; 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebBackForwardList::addItem(WebBackForwardListItem* newItem) 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_capacity == 0 || !m_enabled) 6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block Vector<RefPtr<APIObject> > removedItems; 682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Toss anything in the forward list 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_current != NoCurrentItemIndex) { 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned targetSize = m_current + 1; 722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block removedItems.reserveCapacity(m_entries.size() - targetSize); 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch while (m_entries.size() > targetSize) { 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_page) 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->backForwardRemovedItem(m_entries.last()->itemID()); 762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block removedItems.append(m_entries.last().release()); 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_entries.removeLast(); 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Toss the first item if the list is getting too big, as long as we're not using it 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // (or even if we are, if we only want 1 entry). 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_entries.size() == m_capacity && (m_current != 0 || m_capacity == 1)) { 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_page) 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->backForwardRemovedItem(m_entries[0]->itemID()); 862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block removedItems.append(m_entries[0].release()); 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_entries.remove(0); 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_current--; 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_entries.insert(m_current + 1, newItem); 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_current++; 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_page) 952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_page->didChangeBackForwardList(newItem, &removedItems); 962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebBackForwardList::goToItem(WebBackForwardListItem* item) 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_entries.size() || !item) 10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned index = 0; 10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (; index < m_entries.size(); ++index) { 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_entries[index] == item) 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (index < m_entries.size()) { 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_current = index; 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_page) 1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_page->didChangeBackForwardList(0, 0); 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebBackForwardListItem* WebBackForwardList::currentItem() 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_current != NoCurrentItemIndex) 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_entries[m_current].get(); 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebBackForwardListItem* WebBackForwardList::backItem() 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_current && m_current != NoCurrentItemIndex) 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_entries[m_current - 1].get(); 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebBackForwardListItem* WebBackForwardList::forwardItem() 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_entries.size() && m_current < m_entries.size() - 1) 14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_entries[m_current + 1].get(); 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebBackForwardListItem* WebBackForwardList::itemAtIndex(int index) 14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 1492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Do range checks without doing math on index to avoid overflow. 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (index < -static_cast<int>(m_current)) 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (index > forwardListCount()) 15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_entries[index + m_current].get(); 15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochint WebBackForwardList::backListCount() 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 1622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 1632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_current == NoCurrentItemIndex ? 0 : m_current; 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochint WebBackForwardList::forwardListCount() 16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 1692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 1702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_current == NoCurrentItemIndex ? 0 : static_cast<int>(m_entries.size()) - (m_current + 1); 17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<ImmutableArray> WebBackForwardList::backListAsImmutableArrayWithLimit(unsigned limit) 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned backListSize = static_cast<unsigned>(backListCount()); 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned size = std::min(backListSize, limit); 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!size) 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return ImmutableArray::create(); 18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<RefPtr<APIObject> > vector; 18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch vector.reserveInitialCapacity(size); 18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(backListSize >= size); 18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (unsigned i = backListSize - size; i < backListSize; ++i) 18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch vector.uncheckedAppend(m_entries[i].get()); 18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return ImmutableArray::adopt(vector); 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<ImmutableArray> WebBackForwardList::forwardListAsImmutableArrayWithLimit(unsigned limit) 19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned size = std::min(static_cast<unsigned>(forwardListCount()), limit); 19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!size) 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return ImmutableArray::create(); 20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<RefPtr<APIObject> > vector; 20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch vector.reserveInitialCapacity(size); 20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned last = m_current + size; 20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(last < m_entries.size()); 20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (unsigned i = m_current + 1; i <= last; ++i) 20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch vector.uncheckedAppend(m_entries[i].get()); 20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return ImmutableArray::adopt(vector); 21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebBackForwardList::clear() 21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 2142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_current == NoCurrentItemIndex || m_current < m_entries.size()); 2152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch size_t size = m_entries.size(); 21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (size <= 1) 21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<WebBackForwardListItem> currentItem = this->currentItem(); 22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_page) { 22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < size; ++i) { 22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_entries[i] != currentItem) 22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_page->backForwardRemovedItem(m_entries[i]->itemID()); 22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block Vector<RefPtr<APIObject> > removedItems; 2302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block removedItems.reserveCapacity(m_entries.size() - 1); 2312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block for (size_t i = 0; i < m_entries.size(); ++i) { 2322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (i != m_current) 2332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block removedItems.append(m_entries[i].release()); 2342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 2352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_entries.shrink(1); 23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_entries[0] = currentItem.release(); 23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_current = 0; 24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_page) 2422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_page->didChangeBackForwardList(0, &removedItems); 24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 246