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