1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Google Inc. All rights reserved.
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions are
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * met:
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     * Redistributions of source code must retain the above copyright
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer.
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     * Redistributions in binary form must reproduce the above
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * copyright notice, this list of conditions and the following disclaimer
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * in the documentation and/or other materials provided with the
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * distribution.
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     * Neither the name of Google Inc. nor the names of its
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * contributors may be used to endorse or promote products derived from
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * this software without specific prior written permission.
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h"
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "TestNavigationController.h"
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "TestShell.h"
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/Assertions.h>
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace WebKit;
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace std;
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// ----------------------------------------------------------------------------
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// TestNavigationEntry
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
43dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochPassRefPtr<TestNavigationEntry> TestNavigationEntry::create()
44dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
45dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return adoptRef(new TestNavigationEntry);
46dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
47dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
48dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochPassRefPtr<TestNavigationEntry> TestNavigationEntry::create(
49dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int pageID, const WebURL& url, const WebString& title, const WebString& targetFrame)
50dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
51dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return adoptRef(new TestNavigationEntry(pageID, url, title, targetFrame));
52dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
53dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry::TestNavigationEntry()
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    : m_pageID(-1) {}
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry::TestNavigationEntry(
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int pageID, const WebURL& url, const WebString& title, const WebString& targetFrame)
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    : m_pageID(pageID)
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_url(url)
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_title(title)
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_targetFrame(targetFrame) {}
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry::~TestNavigationEntry() {}
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationEntry::setContentState(const WebHistoryItem& state)
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_state = state;
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// ----------------------------------------------------------------------------
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// TestNavigationController
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationController::TestNavigationController(NavigationHost* host)
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    : m_pendingEntry(0)
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_lastCommittedEntryIndex(-1)
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_pendingEntryIndex(-1)
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_host(host)
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_maxPageID(-1) {}
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationController::~TestNavigationController()
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    discardPendingEntry();
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::reset()
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_entries.clear();
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    discardPendingEntry();
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_lastCommittedEntryIndex = -1;
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::reload()
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Base the navigation on where we are now...
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int currentIndex = currentEntryIndex();
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If we are no where, then we can't reload.  TODO(darin): We should add a
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // CanReload method.
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (currentIndex == -1)
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    discardPendingEntry();
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_pendingEntryIndex = currentIndex;
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    navigateToPendingEntry(true);
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::goToOffset(int offset)
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int index = m_lastCommittedEntryIndex + offset;
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (index < 0 || index >= entryCount())
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    goToIndex(index);
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::goToIndex(int index)
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(index >= 0);
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(index < static_cast<int>(m_entries.size()));
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    discardPendingEntry();
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_pendingEntryIndex = index;
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    navigateToPendingEntry(false);
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::loadEntry(TestNavigationEntry* entry)
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // When navigating to a new page, we don't know for sure if we will actually
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // end up leaving the current page.  The new page load could for example
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // result in a download or a 'no content' response (e.g., a mailto: URL).
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    discardPendingEntry();
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_pendingEntry = entry;
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    navigateToPendingEntry(false);
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry* TestNavigationController::lastCommittedEntry() const
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_lastCommittedEntryIndex == -1)
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_entries[m_lastCommittedEntryIndex].get();
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry* TestNavigationController::activeEntry() const
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
150dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    TestNavigationEntry* entry = m_pendingEntry.get();
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!entry)
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        entry = lastCommittedEntry();
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return entry;
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint TestNavigationController::currentEntryIndex() const
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_pendingEntryIndex != -1)
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return m_pendingEntryIndex;
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_lastCommittedEntryIndex;
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry* TestNavigationController::entryAtIndex(int index) const
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (index < 0 || index >= entryCount())
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_entries[index].get();
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry* TestNavigationController::entryWithPageID(int32_t pageID) const
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int index = entryIndexWithPageID(pageID);
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return (index != -1) ? m_entries[index].get() : 0;
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::didNavigateToEntry(TestNavigationEntry* entry)
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If the entry is that of a page with PageID larger than any this Tab has
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // seen before, then consider it a new navigation.
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (entry->pageID() > maxPageID()) {
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        insertEntry(entry);
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Otherwise, we just need to update an existing entry with matching PageID.
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If the existing entry corresponds to the entry which is pending, then we
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // must update the current entry index accordingly.  When navigating to the
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // same URL, a new PageID is not created.
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int existingEntryIndex = entryIndexWithPageID(entry->pageID());
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    TestNavigationEntry* existingEntry = (existingEntryIndex != -1) ?
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_entries[existingEntryIndex].get() : 0;
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!existingEntry) {
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // No existing entry, then simply ignore this navigation!
196dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    } else if (existingEntry == m_pendingEntry.get()) {
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // The given entry might provide a new URL... e.g., navigating back to a
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // page in session history could have resulted in a new client redirect.
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        existingEntry->setURL(entry->URL());
200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        existingEntry->setContentState(entry->contentState());
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_lastCommittedEntryIndex = m_pendingEntryIndex;
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_pendingEntryIndex = -1;
203dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        m_pendingEntry.clear();
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (m_pendingEntry && m_pendingEntry->pageID() == -1
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block               && GURL(m_pendingEntry->URL()) == GURL(existingEntry->URL().spec())) {
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Not a new navigation
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        discardPendingEntry();
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // The given entry might provide a new URL... e.g., navigating to a page
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // might result in a client redirect, which should override the URL of the
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // existing entry.
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        existingEntry->setURL(entry->URL());
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        existingEntry->setContentState(entry->contentState());
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // The navigation could have been issued by the renderer, so be sure that
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // we update our current index.
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_lastCommittedEntryIndex = existingEntryIndex;
218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    updateMaxPageID();
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::discardPendingEntry()
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
225dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_pendingEntry.clear();
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_pendingEntryIndex = -1;
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::insertEntry(TestNavigationEntry* entry)
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    discardPendingEntry();
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Prune any entry which are in front of the current entry
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int currentSize = static_cast<int>(m_entries.size());
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (currentSize > 0) {
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        while (m_lastCommittedEntryIndex < (currentSize - 1)) {
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            m_entries.removeLast();
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            currentSize--;
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
242dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_entries.append(RefPtr<TestNavigationEntry>(entry));
243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_lastCommittedEntryIndex = static_cast<int>(m_entries.size()) - 1;
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    updateMaxPageID();
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint TestNavigationController::entryIndexWithPageID(int32 pageID) const
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (int i = static_cast<int>(m_entries.size()) - 1; i >= 0; --i) {
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (m_entries[i]->pageID() == pageID)
251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return i;
252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return -1;
254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::navigateToPendingEntry(bool reload)
257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // For session history navigations only the pending_entry_index_ is set.
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_pendingEntry) {
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT(m_pendingEntryIndex != -1);
261dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        m_pendingEntry = m_entries[m_pendingEntryIndex];
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
264dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (m_host->navigate(*m_pendingEntry.get(), reload)) {
265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Note: this is redundant if navigation completed synchronously because
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // DidNavigateToEntry call this as well.
267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        updateMaxPageID();
268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else
269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        discardPendingEntry();
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::updateMaxPageID()
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    TestNavigationEntry* entry = activeEntry();
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (entry)
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_maxPageID = max(m_maxPageID, entry->pageID());
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
278